4矩阵键盘c语言程序,4×4矩阵键盘数码管显示按键值程序

4×4矩阵键盘数码管显示按键值程序

//电路说明如下。

//单片机:使用51系列兼容的即可;

//4×4矩阵键盘:接在P1口;

//两位数码显示器: P0口输出七段码,P2口输出位选码。

//==============================================================

//C语言程序如下。

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

* 文件名: KEY_LED.c

* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。

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

#include

#include

#define uint unsigned int

#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

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

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

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

void Delay_1ms(uint x)

{

uint i;

uchar j;

for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);

}

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

* 名称: Keyscan()

* 功能: P1外接4×4按键, 按照扫描法读出键值

* 输出: 按键值0~15/如无键按下, 返回16

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

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};

for(j = 0; j < 4; j++) { //循环四次

P1 = Buffer[j];         //在P1高四位分别输出一个低电平

temp = 0x01;            //计划先判断P1.0位

for(i = 0; i < 4; i++) { //循环四次

if(!(P1 & temp))      //从P1低四位,截取1位

return (i + j * 4); //返回取得的按键值

temp <<= 1;           //判断的位,左移一位

} }

return 16;                //判断结束,没有键按下,返回16

}   //呵呵,实质性的语句不过8行,就是这么简练!

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

* 名称: Display(uchar k)

* 功能: 将参数分成十位、个位分别显示

* 输入: k (键盘数值)

* 输出: P0口输出七段码,P2口输出位选码

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

void Display(uchar k)

{

P2 = 0;                    //消隐

P0 = table[k / 10];

P2 = 0x02; Delay_1ms(5);   //显示5ms十位

P2 = 0;                    //消隐

P0 = table[k % 10];

P2 = 0x01; Delay_1ms(5);   //显示5ms个位

}

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

* 名称 : Main()

* 功能 : 主函数

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

void Main(void)

{

uchar Key_Value = 16, Key_Temp1, Key_Temp2;   //两次读出的键值

while(1) {

//---------以下读入按键、消抖、等待按键释放

P1 = 0xff;

Key_Temp1 = Keyscan();       //先读入按键

if(Key_Temp1 != 16) {        //如果有键按下

//Delay_1ms(10);           //延时一下

Display(Key_Value);        //可用显示代替延时

Key_Temp2 = Keyscan();     //再读一次按键

if (Key_Temp1 == Key_Temp2) {//必须是两次相等

Key_Value = Key_Temp1;   //才保存下来,这就是消除抖动

while(Keyscan() < 16)    //等待按键释放

Display(Key_Value);    //等待期间显示键值

//---------以下是对按键的处理

Display(Key_Value);      //显示键值

}  }

Display(Key_Value);          //没有按键按下,也显示键值

}

}

//用PROTEUS仿真运行时的屏幕截图如下:

e268c8eeb121700e7413b329462fbf70.png

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值