您的位置 首页 培训

用扫描法读出4×4矩阵键盘,在数码管显现按键值

//电路说明如下。//单片机:使用51系列兼容的即可;//4times;4矩阵键盘:接在P1口;//两位数码显示器:P0口输出七段码,P2口输出位选码…

//电路阐明如下。

//单片机:运用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仿真运行时的屏幕截图如下:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/268207.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部