#include
#include
/**延时1**/ //用于消抖
void delay1(void)
{uchar i;
for(i=0;i<200;i++);
}
/****延时2**********/
void delay2(void)
{
uchar i,j,s;
for(i=250;i>0;i–)
for(j=250;j>0;j–)
for(s=5;s>0;s–);
}
/****串口初使化****/
void chuankou_init(void)
{
TMOD=0X20; //定时器1,方式2,8位计数器
SCON=0x40; //方式1,而不允许接收
PCON=0X00; //波特率不翻倍
TH1=0xf4; //11.0592晶振,somd=0,波特率9600,初值=0xfa.应用sst89E564,已经倍频
TL1=0xf4;
TR1=1; //启动定时器1
}
/**键盘扫描函数**/
uchar keyscan(void)
{
uchar code_h; //行扫描值
uchar code_l; //列扫描值
P1=0xf8; //P1.0-P1.2发全0,P1.3-P1.5发1,准备读列状态
if((P1&0Xf8)!=0Xf8) //如果P1.3-P1.5不全为1,可能有键按下
{
delay1(); //消抖
if((P1&0xf8)!=0xf8) //重读列位,若还是不全为1,定有键按下
{
code_h=0xfe; //P1.0为0。开始行扫描
while((code_h&0x08)!=0x00) //判断是否为最后一行,若不是,继续扫描
{
P1=code_h; //P1口输出行扫描值
if((P1&0Xf8)!=0Xf8) //如果P1.3-P1.5不全为1,该行有键按下
{
code_l=((P1&0xf8)|0x07); //保留P3-p5位,低3位为1,作为列值
return((~code_h)+(~code_l)); //键编码=行扫描值+列扫描值,返回主程序
}
else //该行无键按下,行扫描值左移,扫描下一行
code_h=((code_h<<1)|0x01);
}
}
}
return(0); //无键按下,反回0
}
/**主函数**/
void main(void)
{
uchar key;
chuankou_init(); //串口初使化
while(1)
{
key=keyscan(); //调用键盘扫描函数,返回的键值送变量key
switch(key)
{
case 0x0a:SBUF=0X00;delay2();break;
case 0x11:SBUF=0x05;delay2();break;
case 0x12:SBUF=0x04;delay2();break;
case 0x14:SBUF=0x03;delay2();break;
case 0x22:SBUF=0x01;delay2();break;
case 0x24:SBUF=0x02;delay2();break;
case 0x21:SBUF=0x06;delay2();break;
case 0x0c:break;
case 0x05:break;
default:break;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38555.html