用扫描法读出4×4矩阵键盘,在数码管显示按键值
来源:互联网 发布:房间改造软件 编辑:程序博客网 时间:2024/05/19 05:04
//电路说明如下。
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
//==============================================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#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仿真运行时的屏幕截图如下:
//图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/f2005aed8e04396063d09f24.html
//========================================================
- 用扫描法读出4×4矩阵键盘,在数码管显示按键值
- 数码管显示矩阵键盘扫描程序
- 4×4矩阵键盘,控制数码管显示
- 4*4矩阵按键控制数码管显示0-F
- 51_定时器扫描矩阵键盘_数码管显示
- 用矩阵键盘使数码管显示不同的值
- 矩阵键盘在数码管上显示1-16
- 51单片机STC89C52 矩阵键盘数码管显示
- 7.矩阵键盘读取键值 数码管显示
- 基础知识_数码管动态显示,矩阵键盘
- 矩阵键盘扫描显示键值
- 4*4矩阵按键扫描程序
- 4*4矩阵按键扫描程序
- 单片机4*4按键数码管显示0-9
- 4*4矩阵键盘的扫描原理
- 4X4矩阵键盘扫描程序
- 4X4矩阵键盘扫描程序
- 矩阵键盘 数码管
- 单片机实现灯左右移动和闪烁的程序
- 编写51单片机程序,输出方波,at89s52的单片机
- 延时程序耗费时间的精确算法
- 51单片机串行通信奇偶校验的设置方法
- Java开发微信支付流程及容易入坑的点
- 用扫描法读出4×4矩阵键盘,在数码管显示按键值
- c++学习之继承篇(多重继承之虚继承)
- 汇编程序:用减奇数法开平方(16位)
- 正负数、0,个数的统计
- 三个无符号数求最大值
- 信号与系统中的傅里叶级数的意义
- AngularJS中的$http深入分析
- BusyBox - The Swiss Army Knife of Embedded Linux
- 汇编语言显示“*”符号图案(1)