#include <REG51.H>
#include <intrins.h>
#define uchar unsigned char
sbit K1_1=P0^0;
sbit K1_2=P1^1;
sbit K1_3=P1^2;
sbit K1_4=P0^2;
sbit K1_5=P1^3;
sbit K1_6=P0^3;
sbit K1_7=P0^4;
sbit K1_8=P1^6;
sbit K1_9=P0^5;
sbit K1_0=P1^7;
uchar key_s;
uchar key_v;
uchar variable;
bit key_flag1;key_flag2;key_flag3;key_flag4;key_flag5;key_flag6;key_flag7;key_flag8;key_flag9;key_flag0;
void delayms(uchar ms)    //延时子函数
{     
uchar i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void init()      //串行口初始化
{
TMOD = 0x20;
TH1 = 0xE8;
TL1 = 0xE8;
PCON = 0x00;
TR1 = 1;
SCON=0xC0;
}
uchar key_1()      //1号按键处理函数
{
if(K1_1 == 0)    //判断K1_1是否按下
{
delayms(10);    //去抖动
if(K1_1 == 0)    //判断K1_1是否按下
{
if(K1_1 ^ K1_2)  //确保1号和2号键没有同时按下
{
if(key_flag1)
{
key_s = 0x01;  //发送1号键按下的数据
}
}
}
else if(K1_1 == 1)
{
key_flag1 = 1;
}
return key_s;
}
uchar key_2()      //2号按键处理函数
{
if(K1_2 == 0)   
{
delayms(10);
if(K1_2 == 0)
{
if(K1_2 ^ K1_1)
{
if(key_flag2)
{
key_s = 0x02;
}
}
}
else if(K1_2 == 1)
{
key_flag2 = 1;
}
return key_s;
}
uchar key_3()      //3号按键处理函数
{
if(K1_3 == 0)
{
delayms(10);
if(K1_3 == 0)
{
if(K1_3 ^ K1_4)
{
if(K1_3 ^ K1_5)
{
if(key_flag3)
{
key_s = 0x03;
}
}
else if(K1_3 == 1)
{
key_flag3 = 1;
}
return key_s;
}
uchar key_4()      //4号按键处理函数
{
if(K1_4 == 0)
{
delayms(10);
if(K1_4 == 0)
{
if(K1_4 ^ K1_3)
{
if(K1_4 ^ K1_5)
{
if(key_flag4)
{
key_s = 0x04;
}
}
else if(K1_4 == 1)
{
key_flag4 = 1;
}
return key_s;
}
uchar key_5()      //5号按键处理函数
{
if(K1_5 == 0)
{
delayms(10);
if(K1_5 == 0)
{
if(K1_5 ^ K1_3)
{
if(K1_5 ^ K1_4)
{
if(key_flag5)
{
key_s = 0x05;
}
}
}
else if(K1_5 == 1)
{
key_flag5 = 1;
}
return key_s;
}
uchar key_6()      //6号按键处理函数
{
if(K1_6 == 0)
{
delayms(10);
if(K1_6 == 0)
{
if(K1_6 ^ K1_7)
{
if(K1_6 ^ K1_8)
{
if(key_flag6)
{
key_s = 0x06;
}
}
}
else if(K1_6 == 1)
{
key_flag6 = 1;
}
return key_s;
}
uchar key_7()      //7号按键处理函数
{
if(K1_7 == 0)
{
delayms(10);
if(K1_7 == 0)
{
if(K1_7 ^ K1_6)
{
if(K1_7 ^ K1_8)
{
if(key_flag7)
{
key_s = 0x07;
}
}
}
else if(K1_7 == 1)
{
key_flag7 = 1;
}
return key_s;
}
uchar key_8()      //8号按键处理函数
{
if(K1_8 == 0)
{
delayms(
10);
if(K1_8 == 0)
{
if(K1_8 ^ K1_6)
{
if(K1_8 ^ K1_7)
{
if(key_flag8)
{
key_s = 0x08;
}
}
}
else if(K1_8 == 1)
{
key_flag8 = 1;
}
return key_s;
}
uchar key_9()      //9号按键处理函数
{
if(K1_9 == 0)   
{
delayms(10);   
if(K1_9 == 0)   
{
if(K1_9 ^ K1_0) 
{
if(key_flag9)
{
key_s = 0x09; 
}
}
}
else if(K1_9 == 1)
{
key_flag9 = 1;
}
return key_s;
}
uchar key_0()      //10号按键处理函数
{
if(K1_0 == 0)   
{
delayms(10);   
if(K1_0 == 0)   
{
if(K1_0 ^ K1_9) 
{
if(key_flag0)
{
key_s = 0x10; 
}
}
}
else if(K1_0 == 1)
{
key_flag0 = 1;
}
return key_s;
}
uchar proc_key()    //10个按键处理函数合一
{
key_s = 0x00;
key_1();
if(key_s != 0x00) return key_s;
key_2();
if(key_s != 0x00) return key_s;
key_3();
if(key_s != 0x00) return key_s;
key_4();
if(key_s != 0x00) return key_s;
key_5();
if(key_s != 0x00) return key_s;
key_6();
if(key_s != 0x00) return key_s;
key_7();
if(key_s != 0x00) return key_s;
key_8();
if(key_s != 0x00) return key_s;
key_9();
if(key_s != 0x00) return key_s;
key_0();
if(key_s != 0x00) return key_s;
}
void main()
{
init();
key_v = 0x00;
while(1)
{
proc_key();16进制字符串转16进制数组
while(key_s ^ key_v)
{
key_v = key_s;
if(key_v != 0x00)
{
variable = 0;  //经过累加器A
key_v += variable;
TB8 = P;
SBUF = key_v;
while(!TI);
switch(key_v)
{
case 0x01: key_flag1 = 0; break;
case 0x02: key_flag2 = 0; break;
case 0x03: key_flag3 = 0; break;
case 0x04: key_flag4 = 0; break;
case 0x05: key_flag5 = 0; break;
case 0x06: key_flag6 = 0; break;
case 0x07: key_flag7 = 0; break;
case 0x08: key_flag8 = 0; break;
case 0x09: key_flag9 = 0; break;
case 0x10: key_flag0 = 0; break;
default: break;
}
TI = 0;
}
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。