//矩阵键盘扫描程序
//采用翻转识别法(相对代码少一些)
#include
#define uchar unsigned char
#define uint unsigned int
uchar key=0;
//共阳数码管编码如下(0-15)
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
//函数声明
void display(uchar Duan_value);
void delay(uchar t);
void key_scan();
void main()
{
while(1)
{
display(key);//显示按键值
key_scan(); //按键扫描
}
}
//延时函数
void delay(uchar t)
{
uchar x,y;
for(x=t;t>0;t--)
for(y=111;y>0;y--);
}
//数码管扫描函数
void display(uchar value)
{
P2=table[value];
}
//按键扫描函数
void key_scan()
{
uchar m0,m1;
uchar temp;
P1=0xf0;//这样设置是为了能使低四位将高四位拉低,释放时自动拉高高四位
temp=P1;
if(temp!=0xf0)
{
delay(10); //延时,去除抖动
if(temp!=0xf0)
{
m0=temp; //获得按键的列号
P1=0x0f;
temp=P1;
if(temp!=0x0f)
{
m1=temp; //获得按键的行号号
temp=m0|m1; //获得最终的号
}
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
do{
temp=P1; //消除按起抖动
temp&=0X0f;
}while(temp!=0x0f);
}
}
}
关键字:课程设计 矩阵键盘 扫描显示 c51反转法
引用地址:
课程设计:矩阵键盘扫描显示(c51反转法)
推荐阅读最新更新时间:2024-03-16 15:09
4*4矩阵键盘的扫描原理
初学者肯定要经历的一个实验就是4*4矩阵键盘的代码编写,大部分都是在学校里面,有现成的实验箱,基本不需要自己动脑子。上次遇到一个哥们,他说他用的是8031的实验箱,我当时就晕了。8031是8051的前身,那个芯片连ROM都没有,可以想象我们的学校都在拿什么教育祖国的花朵。废话少说,先上图: 对初学者来说这篇文章会有点难,可以先研究一下如何用51单片机点亮一个发光二极管和基于CPLD-EPF10K10LC84-4(84)的交通灯设计。首先要说明的一点,矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就
[单片机]
串行口动态扫描显示电路编程实例
单片机并行I/O口数量总是有限的,有时并行口需作其他更重要的用途,一般也不会用数量众多的并行I/O口专门用来驱动显示电路,能否用80C51的串行通信口加上少量I/O及扩展芯片用于显示电路呢?答案是肯定的。 80C51的串行通信口是一个功能强大的通信口,而且是相当好用的通信口,用于显示驱动电路再合适不过了,下面就根据这种需要设计一个用两个串行通信口线加上两根普通I/O口,设计一个4位LED显示电路。当然只要再加上两根I/O口线即可轻易实现8位LED的显示电路。
图4 串行动态LED扫描电路 图4中采用C2051单片机,同时用廉价易得的74LS164和74LS138作为扩展芯片。74LS164是一个8位串入并出的移位寄存器,其
[单片机]
单片机按键扫描程序和显示程序及延时程序解析
//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。 //最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25) //无按键按下的时候显示FF //按键跟按键的扫描结果满足如下关系: //按键扫描结果(result)按键扫描结果 //K100XE7K180XB7 //K110XEBK190XBB //K120XEDK200XBD //K130XEEK210XBE //K140XD7K220X77 //K150XDBK230X7B //K160XDDK240X7D //K170XDEK250X7E #include//包含 单片机 内部资源预定义 __CONFIG(0x1832); //芯片配
[单片机]
MSP430单片机实践篇-数码管显示-74HC595动态扫描
一、学习要点: 利用74HC595进行数码管显示,可以只占用3个单片机的I/O口就能完成数码管显示的功能。动态扫描方式则进一步节省了硬件资源,只使用2个74HC595就能显示多达8位数码管。 二、程序执行效果: 本实验所需使用的硬件电路为2个试验板:MSP430F135核心实验板+8位数码管动态扫描显示模块 将MSP430F135核心实验板上的P5.4、P5.2、P5.0分别与8位数码管动态扫描显示模块上的 LATCH、CLK、 DOUT连接,并将8位数码管动态扫描显示模块上的GND、VCC连接好。如下图 P5.0 DOUTP5.2 CLKP5.4 LATCH 如下图所示:在8位数码管动态扫描显示模块上的8个
[单片机]
基于FPGA全彩LED显示屏的扫描控制器设计
介绍了一种以 FPGA 可编程逻辑器件为设计平台的、采用大屏幕全彩 led 显示屏 进行全彩灰度图像 显示 的扫描 控制器 实现方案。经过对“19 场扫描”理论灰度实现原理的分析,针对采用该方法实现的全彩LED 显示屏刷新频率受串行移位 时钟 限制的缺点,提出了一种新式的实现高阶灰度显示的逐位点亮控制方法,在进行FPGA 电路设计中采用单独的计数器来控制屏幕的刷新频率,使全彩LED 显示屏的设计在L ED 的发 光效 率和刷新率之间的调整更加灵活。最后,根据大屏幕全彩LED 显示屏的设计要求,结合本文讨论的灰度控制方法,给出了FPGA 屏体扫描控制器的内部电路实现结构框架。 1 、引言 作为大型 平板显示
[电源管理]
从零开始51单片机教程 —— 25 动态扫描显示接口电路及程序
动态扫描显示接口电路及程序 在单片机系统中动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就能自行决定何时显示哪一位了。而所谓动态扫描就是指我们采用分时的办法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。 在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,
[单片机]
stm32专题二十一:FSMC液晶显示和扫描方向
液晶屏连接原理图: 其中值得注意的是,LCD_RESET复位引脚和LCD_BL背光,可以选择普通的GPIO来进行控制。而左侧的FSMC数据线,就直接按照编号连接到液晶屏。右侧LCD_CS片选、RD、WE都是FSMC固定占用的,而命令 / 数据线使用的是地址线A16。 如果程序跑飞了导致下载器无法下载,先按住复位键,再点下载,然后松开复位键就能下载成功。 接下来是代码说明: 初始化GPIO和FMSC,这里一个值得注意点地方就是,我们模拟8080时序使用的是FSMC模式B,这其中有一些时序参数。在操作SRAM时,这些参数可以通过SRAM提供的数据手册来得到。而在驱动液晶屏时,因为提供的参数并没有严格对应,需要使用实验测
[单片机]
89C52矩阵键盘的识别
我所见过的矩阵键盘一般有两种识别方法:扫描法和线反转法。以4X4矩阵键盘为例,扫描法是依次将每一行置为0,然后读取列的状态,这样就可以通过四次扫描将整个矩阵键盘的按键状况辨别出来,这个方法所需的代码量比较长;而线反转法则显得比较简洁,它通过先将4行全部置0(0xf0),然后读列的状态,接着,将列全部置0(0x0f),读行的状态,通过(行|列)就能确定整个行列的状态了。扫描法比线反转法占用更多的程序储存空间(Program Space),但占用的更少的数据储存空间(Data Space)。 程序如下 扫描法: #include reg52.h #define uchar unsigned char #define u
[单片机]