标题:
单片机PS/2协议的应用——PS/2的键盘程序
[打印本页]
作者:
daming
时间:
2014-12-30 23:40
标题:
单片机PS/2协议的应用——PS/2的键盘程序
/*
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++;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1