标题:
线反转法扫描键盘程序
[打印本页]
作者:
daming
时间:
2014-12-30 01:51
标题:
线反转法扫描键盘程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P3^6;
sbit P27=P2^7; //位显示,最右边
uchar code dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//code 的作用是把s8存到8K的ROM中
//共阳数码光显示字型数码组 1011 1111 “-”
uchar code key_code[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };
uchar key;
void delay1ms(uchar n) //1ms基准延时程序
{
uchar i;
while(n--)
for(i=0;i<115;i++);
}
void delay500us() // 500us延时
{
uchar i;
for(i=0;i<57;i++); //500us基准延时程序
}
void beep() //产生1KHZ频率声音的函数
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
uchar key_scan() //扫描键盘
{
uchar scan1,scan2,keycode,i;
P1=0xf0;
scan1=P1;
if((scan1&0xf0)!=0xf0){ //判断是否按键
delay1ms(15); //延时消陡
scan1=P1;
if((P1&0xf0)!=0xf0){ //二次判断是否按键
P1=0x0f; //线反转法德核心
scan2=P1;
keycode=scan1|scan2; //组合成键编码
}
for(i=0;i<16;i++){
if(keycode==key_code[i]){ //查表得键值
key=i;
return key;
}
}
}
else{
P1=0xff; //P1口写1,输入状态
return 16;
}
}
void main()
{
uchar t;
P0=0xbf;
P27=0;
P1=0xff; //写1,读状态
while(1)
{
P1=0xf0;
if((P1&0xf0)!=0xf0){ // 判断按键
key_scan();
P0=dis_code[key];
for(t=0;t<200;t++)
beep();
fmq=1;
delay1ms(200);
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1