用查表法写c语言程序,4X4矩阵键盘(查表法)C语言程序设计

原标题:4X4矩阵键盘(查表法)C语言程序设计

/*行线接P1.0-P1.3,列线接P1.4-P1.7。 根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。

开机时,数码管显示“-”。

当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*/

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit BEEP = P3^6; //线

uchar key;

unsigned char code disp_code[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};

unsigned char code key_code[]={

0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77 };

/**********************************************************

延时子函数

**********************************************************/

void delayms(uint ms)

{

uchar t;

while(ms--)

{

for(t = 0; t < 120; t++);

}

}

/**********************************************************

x*0.14MS 延时子函数

**********************************************************/

void delay0(uchar x)

{

uchar i;

while(x--)

{

for (i = 0; i<13; i++) {;}

}

}

/**********************************************************

蜂鸣器驱动子函数

**********************************************************/

void beep()

{

uchar i;

for (i=0;i<180;i++)

{

delay0(5);

BEEP=!BEEP; //BEEP取反

}

BEEP=1; //关闭蜂鸣器

delayms(250); //延时

}

/**********************************************************

键盘扫描子函数

**********************************************************/

uchar keyscan()

{

uchar scan1,scan2,keycode,j;

P1=0xf0;

scan1=P1;

if((scan1&0xf0)!=0xf0) //判键是否按下

{

delayms(30); //延时30ms

scan1=P1;

if((scan1&0xf0)!=0xf0) //二次判键是否按下

{

P1=0x0f;

scan2=P1;

keycode=scan1|scan2; //组合成键编码

for(j=0;j<=15;j++)

{

if(keycode== key_code[j]) //查表得键值

{

key=j;

return(key);

}

}

}

}

else P1=0xff;

return (16);

}

/**********************************************************

判键是否按下子函数

**********************************************************/

void keydown()

{

P1=0xf0;

if((P1&0xf0)!=0xf0)

{

keyscan();

P0=disp_code[key];

beep();

}

}

/**********************************************************

主函数

**********************************************************/

main()

{

P0 = 0xbf;

P2 = 0x7f; //数码管显示"-"

P1 = 0xff;

while(1)

{

keydown();

}

}

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值