/*
PS/2協議的應用:(常見的有PS/2接口鼠標、鍵盤等)用PS/2的鍵盤控制單片機,用字符型液晶顯示器1602簡單
顯示鍵盤的輸入值
由于at89s52單片機的工作頻率過低,不易掃描更多鍵值
*/
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit psda=P3^0;
- uchar keyvalue;
- uint keynum;
- uchar BIT;
- uchar temp;
- uint j=0;
- uchar table1[3];
- sbit lcden=P2^6;
- sbit lcdrs=P2^4;
- sbit lcdrw=P2^5;
- sbit dula=P3^7;
- uchar num;
- uchar code table2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'`', //0-15
- 0,0,0,0,0,'Q','1',0,0,0,'Z','S','A','W','2',0, //16-31
- 0,'C','X','D','E','4','3',0,0,0x20,'V','F','T','R','5',0, //32-47
- 0,'N','B','H','G','Y','6',0,0,0,'M','J','U','7','8',0, //48-63
- 0,',','K','I','O','0','9',0,0,'.','/','L',';','P','-',0,//64-79
- 0,0,0,0,'[','=',0,0,0,0,0,']',0,'|',0,0, //80-95
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //96-111
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //112-127
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //128-143
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //144-159
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //160-175
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //176-191
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //192-207
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //208-223
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //224-239
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //240-255
- };
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=11;y>0;y--);
- }
- void write_com(uchar com)
- {
- lcdrs=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(10);
- lcden=0;
- delay(10);
-
- }
- void write_data(uchar _data)
- {
- lcdrs=1;
- P0=_data;
- delay(5);
- lcden=1;
- delay(10);
- lcden=0;
- delay(10);
- }
- void _init_()
- {
- IT0=1;//外部中斷下降沿觸發
- EX0=1;//開外部0中斷
- EA=1;//開總中斷
- dula=1;
- lcdrw=0;
- write_com(0x01);
- write_com(0x38);//指令(001 DL N F 00)表示:DL=1,8數據位;N=1,位移寬度為2倍;F=1,5*10;F=0,5*7;
- write_com(0x0f);//指令(00001DCB)表示:D=1,開顯示;C=1,顯示光標;B=1,光標閃爍
- write_com(0x06);//指令(000001[I/D]S)表示:N=1,地址加一;[I/D]=0,地址減一;S=1,開整屏移動
- write_com(0x80);//第一行:0x80+(字符序號【0--f】);第二行:0xc0+(字符序號【0--f】)
-
- }void main()
- {
- _init_();
- while(1)
- {
- if(keynum==3)
- {
- keynum=0;
- temp=table1[0];
- if((j%32>0)&&(j%16==0))
- {
- write_com(0xc0);
- }
- if((j%32==0)&&(j%16==0))
- {write_com(0x80);}
- write_data(table2[temp]);
- j++;
- }
-
- }
- }
- void int0 () interrupt 0
- {
- if((BIT>0)&&(BIT<9))
- {
- keyvalue=keyvalue>>1;
- if(psda)
- keyvalue=keyvalue|0x80;
- }
- BIT++;
- if(BIT>10)
- {
- BIT=0;
- table1[keynum]=keyvalue;
- keynum++;
- }
- }
復制代碼
|