历史上的今天
今天是:2025年01月16日(星期四)
2018年01月16日 | 8051单片机的反转法扫描键盘
2018-01-16 来源:eefocus
键盘扫描采用反转法读键:先从P2口的高4位输出零电平,从P2口的低4位读取键盘状态;再从P2口的低4位输出零电平,从P2口的高4位读取键盘状态,将两次读取的结果组合起来就可以得到当前按键的特征码(见程序中TABLE表)。有了这张表就可以编程,将它们转换成顺序码。用当前读得的特征码来顺序查表,用一单元记录查找次数。当在表中查到有该特征码时,它的位置(即查找次数)就是对应的顺序码。对应的键盘查键程序如下:
KEY: MOV P2,#0FH ;用反转法查键
MOV A,P2
ANL A,#0FH
MOV B,A
MOV P2,#0F0H
MOV A,P2
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEY1
RET ;无键按下
KEY1: MOV B,A ;有键按下,存键码
MOV DPTR,#TABLE
MOV R3,#0FFH ;存顺序码单元初始化
KEY2: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY3 ;判键码,求顺序码
MOV A,R3 ;若找到键码,存顺序码
RET
KEY3: CJNE A,#0FFH,KEY2;判是否查完
RET ;已查完,键码未找到,以无按键处理
TABLE: DB 77H,7BH,0BBH ;按键特征码表
DB 0DBH,7DH,0BDH
DB 0DDH,7EH,0BEH
DB 0DEH,0B7H,0D7H
DB 0EEH,0EDH,0EBH
DB 0E7H,0C7H,0FFH
用C语言的写法
#include
#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
keysCAN()
{
uchar i,h=0xfe;
for(i=4,P1=h;i>0;i--) //扫描
{
if((P1&0xf0)!=0xf0) //有键按下?
{
uchar a;
for(a=255;a>0;a--) //延时
{}
if((P1&0xf0)!=0xf0) //有键按下
{
uchar key,p;
p=P1;
for(key=0;key<16;key++) //查表
{
uchar code keytab[]={0xEE,0xDE,0xBE,0x7E, //键码表
0xED,0xDD,0xBD,0x7D,
0xEB,0xDB,0xBB,0x7B,
0xE7,0xD7,0xB7,0x77};
if(p==keytab[key]) //查到返回返回键号
{
P1=0xff;
return(key);
}
}
}
}
h=_crol_(h,1);
P1=h;
}
P1=0xff;
return(16); //没查到返回16
}
main()
{ while(1)
{P0=keyscan();
while(1)
;
}
}
史海拾趣
|
我的电路图如下,其中稳压管是Vz=30V,做实验时发现随着输入电压(集电极电压)的增加,基极电压不变,射级电压缓慢增加,Vbe逐渐减小,当Vc升到40+时,Vbe竟然变成负的(Vb约30V,Ve=30.5V),我的三极管型号是MJH11022。为啥我的管子Vbe会变成负 ...… 查看全部问答> |
|
期末了,老师让我们写一片论文,题目是《加速度测量方法综述》,这门课的名字是《传感器原理及工程应用》,学的是很基本的传感器,但现在论文是要写这个,不会写~~,请高手指点!!大致内容说白了就是用各种各样的传感器来测量加速度。 大家给点资 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:40 编辑 具有SNRBoost 技术的最低功耗 11 位 200 MSPS ADC 4 通道、双通道与缓冲单通道选项 德州仪器 (TI) ADS58C48 系列是业界最低功耗的 11 位 ADC,速率高达 200 MSPS。 ...… 查看全部问答> |
|
STM32F串口出现奇怪现象,是不是串口收发器BUG,望高手指点 大家好,我用的是红牛开发板,CPU型号是STM32F103ZE,在进行串口实验时,STM32会将收到的数据原封不动的发送回来。在实验中,如果发送的数据不是0x00,收发正确,即串口发送什么东西,STM32都会正确接收,并回复给串口助手,串口助手也能正确 ...… 查看全部问答> |




