沒有電路圖,系統(tǒng)按鍵部分電路需要自己根據(jù)按鍵模塊程序來進(jìn)行分析反推 硬件電路應(yīng)該如何連接。矩陣按鍵有8行5列,一共是40個(gè)按鍵,按照程序的意思好像是電路圖如下圖所示:
以下是按鍵輸入部分電路程序:
#include "STC12C5A60S2.h"
#include <intrins.h>
#include "keyboard_device.h"
#include "lcd_12864.h"
#include "eeprom_rw.h"
#include "mode.h"
#include "pwm.h"
#define uchar unsigned char
#define uint unsigned int
uchar shift=0;//shift鍵
void keyboard_cursor_flash(void);
extern bit gb_flag;
extern uchar flash_count;
extern uchar count;
extern uchar hang;
extern uint time_out;
uchar code welcome_pic[]={
/*-- 調(diào)入了一幅圖像:boeing.bmp --*/
/*-- 寬度x高度=128x64 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x07,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0x1F,0xC7,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x0F,0xE1,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFC,0x07,0xE0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF9,0x9F,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF9,0xFF,0xFF,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF9,0xFF,0xFF,0xBF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF9,0x1F,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x0F,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFC,0x07,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFE,0x0F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xFF,0xFF,0x80,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/* ========= 延時(shí)20ms11.0592MHz ========= */
void delay_20m(void) //消抖用延時(shí)
{
unsigned char i, j, k;
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/* ========= 延時(shí)2s11.0592MHz ========= */
void delay_2s(void) //退出刷屏用延時(shí)
{
unsigned char i, j, k;
i = 64;
j = 9;
k = 179;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/* ========= 鍵盤掃描 ========= */
uchar keyboard(void)
{
uchar code keyboard_Scan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //鍵盤掃描庫
//11111110,11111101,11111011,11110111,11101111,11011111,10111111,01111111
uchar i, j, pc, flag = 0;
uchar XScan=0;
uchar in = 0;
uchar test;
while(in == 0)
{
#ifdef KEY_X_IS_HIGH
KEY_X &= 0x07; //清空高5位 0000 0111
XScan = 0x80; // 1000 0000
// XScan = 0x08;
#endif
// #ifdef KEY_X_IS_LOW
// KEY_X &= 0xe0; //清空低5位 1110 0000
// XScan = 0x01; // 0000 0001
// #endif
for(i=0;i<5;i++)
{
KEY_X &=0x07;
test = XScan;
test = ~test;
KEY_X = test & 0xf8 ;
KEY_X = KEY_X | test; //KEY_X接高八位
KEY_Y = 0xff; //置高
if(0xff != (pc = KEY_Y)) //假如說有按鍵按下
{
if(0xff != (pc = KEY_Y)) //假如說有按鍵按下
{
delay_20m();
for(j=0;j<8;j++)
{ //將掃描值與掃描按鍵值比較
if( pc == keyboard_Scan[j] )
{
in = j * 5 + i +1;
flag = 1;
}
if(flag == 1)
{
while( KEY_Y == keyboard_Scan[j] ); //松手檢測
delay_20m();
break;
}
}
}
if(flag == 1)
break;
}
XScan >>= 1; //左移一位
}
keyboard_cursor_flash();
}
time_out = 0; //清空計(jì)時(shí)
return in;
}
uchar keyboard_wake(void)
{
uchar i, pc, flag = 0;
uchar XScan=0;
uchar in = 0;
uchar test;
#ifdef KEY_X_IS_HIGH
KEY_X &= 0x07; //清空高5位 0000 0111
XScan = 0x80; // 1000 0000
// XScan = 0x08;
#endif
// #ifdef KEY_X_IS_LOW
// KEY_X &= 0xe0; //清空低5位 1110 0000
// XScan = 0x01; // 0000 0001
// #endif
for(i=0;i<5;i++)
{
KEY_X &=0x07;
test = XScan;
test = ~test;
KEY_X = test & 0xf8 ;
KEY_X = KEY_X | test; //KEY_X接高八位
KEY_Y = 0xff; //置高
if(0xff != (pc = KEY_Y)) //假如說有按鍵按下
{
return 1;
}
XScan >>= 1; //左移一位
}
return 0;
}
/* ========= 光標(biāo)閃爍 ========= */
void keyboard_cursor_flash(void)
{
if(flash_count>=10)
{
if(gb_flag==0)
{
lcd_yline(8*(count-1),16*hang+0,16*hang+15,1);
gb_flag=1;
}
else
{
lcd_yline(8*(count-1),16*hang+0,16*hang+15,0);
gb_flag=0;
}
flash_count=0;
}
//鍵盤空閑監(jiān)控
if(byte_read(ADD_TIMEOUT, 0)<time_out/5600)
{
time_out = 0;
mode_sleep();
}
}
uchar keyboard_output()
{
uchar result = keyboard();
uchar num0=0xff;
switch( result )
{
case 1:
shift=~shift;
num0 = 0 ;
break;
case 4:
//上翻
num0 = 3 ;
break;
case 6:
num0 = '(';
break;
case 7:
num0 = ')';
break;
case 8:
//地址左移一位
num0 = 5 ;
break;
case 9:
//下翻
num0 = 6 ;
break;
case 10:
//地址右移一位
num0 = 7 ;
break;
case 17:
//hyp?
num0 = 14 ;
break;
//數(shù)字鍵
case 36:
num0='0';
break;
case 31:
//lcd_write_str("1");
num0 = '1';
break;
case 32:
//lcd_write_str("2");
num0 = '2';
break;
case 33:
//lcd_write_str("3");
num0 = '3';
break;
case 26:
num0='4';
break;
case 27:
num0='5';
break;
case 28:
num0='6';
break;
case 21:
num0='7';
break;
case 22:
num0='8';
break;
case 23:
num0='9';
break;
case 37:
num0='.';
break;
//+-x/=
case 29:
num0='*';
break;
case 30:
num0='/';
break;
case 34:
num0='+';
break;
case 35:
num0='-';
break;
case 40:
num0='=';
//等于?
break;
case 24:
//刪掉上一位,指針指向上一位?
num0 = 18 ;
break;
case 25:
//刪掉整個(gè)字符串,指針指向該行起點(diǎn)?
num0 = 19 ;
break;
case 38:
//ans?
num0 = 20 ;
break;
case 39:
//copy?
num0 = 21 ;
break;
}
if(shift==0)
{
switch(result)
{
case 2:
//返回菜單?
num0 = 1;
break;
case 3:
num0 = 2;
break;
case 5:
//清屏,打開背光
num0 = 4;
break;
case 11:
//lcd_write_str("abs(");
num0 = 8; //絕對值
break;
case 12:
//lcd_write_str("^2");
num0 = 9; //平方
break;
case 13:
//lcd_write_str("^(");
num0 = '^'; //方
break;
case 14:
//lcd_write_str("^(-1)");
num0 = 11; //倒數(shù)
break;
case 15:
//lcd_write_str("exp(");
num0 = 12;
break;
case 16:
//lcd_write_str("10^(");
num0 = 13;
break;
case 18:
//lcd_write_str("sin(");
num0 = 15;
break;
case 19:
//lcd_write_str("cos(");
num0 = 16;
break;
case 20:
//lcd_write_str("tan(");
num0 = 17;
break;
// case 31:
// num0='1';
// break;
// case 32:
// num0='2';
// break;
// case 33:
// num0='3';
// break;
}
}
else
{
switch(result)
{
case 2:
//返回設(shè)置?
num0 = 23;
break;
case 3:
num0 = 'e';
break;
case 5:
//清屏,關(guān)閉背光
//lcd_clear();
//關(guān)閉背光?
num0 = 24;
break;
case 11:
num0 = 'i';
break;
case 12:
//lcd_write_str("^(1/2)");
num0 = 25;
break;
case 13:
//lcd_write_str("^(1/");
num0 = 26;
break;
case 14:
//lcd_write_str("!");
num0 = '!';
break;
case 15:
//lcd_write_str("ln(");
num0 = 27;
break;
case 16:
//lcd_write_str("log(");
num0 = 28;
break;
case 18:
//lcd_write_str("asin(");
num0 = 29;
break;
case 19:
//lcd_write_str("acos(");
num0 = 30;
break;
case 20:
//lcd_write_str("atan(");
num0 = 31;
break;
case 31:
//lcd_write_str("x");
num0 = 'x';
break;
case 32:
//lcd_write_str("y");
num0 = 'y';
break;
case 33:
//lcd_write_str("z");
num0 = 'z';
break;
case 37:
num0 = 32;
break;
}
}
if(result != 1)
shift=0;
if(shift == 0)
bl_bright_change(byte_read(ADD_BRIGHT, 0)); //還原亮度設(shè)定
else
bl_bright_change(byte_read(ADD_SHIFTSIGN, 0)); //shift亮度設(shè)定
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
if(num0==24) //on和off
{
TR0=0;
lcd_clear();
lcd_write_pic(0, 0, welcome_pic, 128, 64); /*波音會徽*/
lcd_set_pos(1, 4);
lcd_write_str("計(jì)算器"); /*計(jì)算器*/
lcd_set_pos(2, 4);
lcd_write_str("開心波音"); /*開心波音*/
delay_2s();
lcd_clear();
lcd_clear_pic(); /*清屏*/
bl_bright_change(0); //關(guān)燈
while(num0!=4)
num0 = keyboard_output();
bl_bright_change(byte_read(ADD_BRIGHT, 0)); //還原亮度設(shè)定
reset(); //復(fù)位
}
/////////////////////////////////////////////////////////////////////////
else if(num0==23) //set
{
byte_write(ADD_PROG_STATUS, SET ,0); //寫入設(shè)置
reset(); //復(fù)位
}
////////////////////////////////////////////////////////////////////////
else if(num0==1) //mode
{
byte_write(ADD_PROG_STATUS, MODE ,0); //寫入菜單
reset(); //復(fù)位
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
return num0;
}
void about()
{
TR0=0;
lcd_clear();
lcd_write_pic(0, 0, welcome_pic, 128, 64); /*波音會徽*/
lcd_set_pos(1, 4);
lcd_write_str("計(jì)算器"); /*計(jì)算器*/
lcd_set_pos(2, 4);
lcd_write_str("開心波音"); /*開心波音*/
while(keyboard_wake());
}
|