单片机3×3矩阵键盘c语言,C51单片机的3*3矩阵键盘程序

单片机3×3矩阵键盘c语言,C51单片机的3*3矩阵键盘程序#include#include/**延时1**///用于消抖voiddelay1(void){uchari;for(i=0;i<200;i++);}/****延时2**********/voiddelay2(void){uchari,j,s;for(i=250;i>0;i–)for(j=250;j>0;j–)for(s=5;s>0;s–);}/**…

#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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注