/*
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++;
- }
- }
复制代码
|