历史上的今天
今天是:2025年04月26日(星期六)
2020年04月26日 | 51单片机实验7:矩阵按键
2020-04-26 来源:eefocus
开发板矩阵按键模块电路图如下:

开发板数码管模块电路图如下:

矩阵按键扫描原理:
方法一:逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
在本程序中,扫描矩阵按键采用行列扫描的方式!
在本程序中,采用行列扫描的方式扫描矩阵按键!
程序目的:将矩阵按键中的16个按键分别赋值为0、1、······、15,按下时,将标号在第一位数码管显示。
注意:
value表示按下的按键,找出按键之间的行列关系,只需要一维的数值即可确定出按键的位置,而不需要分别找出行/列序号。
等待按键释放语句:while()与独立按键实验程序中的while()有所不同,注意区分!
新的技巧:可在程序前,及时将io口等寄存器赋予新的变量名,便于程序的修改等操作,增加程序的可读性!
#include #define uc unsigned char #define dig P0 #define key P1 sbit lsa=P2^2; sbit lsb=P2^3; sbit lsc=P2^4; int value; uc code x[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uc x) { uc i,j; for(i=1;i<=x;i++) for(j=1;j<=110;j++); } void keypros() { uc a=0; key=0x0f; if(key!=0x0f) { delay(10); if(key!=0x0f) { key=0x0f; switch(key) { case(0x07): value=0;break; case(0x0b): value=1;break; case(0x0d): value=2;break; case(0x0e): value=3;break; } key=0xf0; switch(key) { case(0x70): value=value; break; case(0xb0): value=value+4; break; case(0xd0): value=value+8; break; case(0xe0): value=value+12; break; } } while((key!=0xf0)&&(a<50)) { a++; delay(10); } /*while(key!=0xf0);*/ } } void main() { lsa=lsb=lsc=0; while(1) { keypros(); dig=x[value]; } }
史海拾趣
|
求助,在5502中SDRAM的写入过程要用210ns,如何提升速度 在TMS320VC5502中,对SDRAM写操作,居然要210ns,简直无法干活,请教前辈,怎样解决这个问题?我对EMIF的相关寄存器进行设置,如WRITE SETUP 、WRITE STROBE 、WRITE HOLD ,对写操作消耗时间一点都没变化,很郁闷呀,在论坛上有说这是5502本身问题 ...… 查看全部问答> |
|
在定制WinCE操作系统的时候,我想添加对C#的支持。可是选项中有 .NET Compact Framework 2.0 跟 .NET Compact Framework 2.0-headless两个选择项目。 请问各位大侠,两个有什么不同呢? 还有就是我刚开始添加的是前者,编 ...… 查看全部问答> |
|
我是上海一大学软件工程专业的09届应届生,本科,不是很会说话。 在学校里学的是单片机开发之类的(偏软件 C语言),接触过ARM+Wince之类的嵌入式软件的开发。(其实学校里嵌入式软件方面的课基本就没有,都是我凭着兴趣自学的)单片机的水平达到自 ...… 查看全部问答> |
|
#include void main(void) { WDTCTL=WDT_ADLY_1000;//设置看门狗定时时间1000ms IE1|=WDTIE; //WDT使能 P5DIR|=0x02; //P5.1输出 P5OUT=0X02; _EINT();//中断 ...… 查看全部问答> |




