① 单片机矩阵键盘的键号=行首字+列号
这些,都是自定义的。
对于 4*4 的键盘,四个行首字,可以定为:0、4、8、12。
它们和行号的关系就是:4 * 行号。
四个列号,可以定为:0、1、2、3。
参考:
http://..com/question/298046533.html
其中检测按键的返回值就是:return (i + j * 4); //如果为0就返回按键值
② 关于单片机汇编的MOVCA,@A+DPTR,"@A+"多余吗
这个问题很好答嘛。
首先,MOVCA,@A+DPTR这个是51单片机的固有指令,去掉A+,就是错的。
这个指令的好处在于:当你查表的时候,将表头地址赋给DPTR,然后将
键号传给A,然后直接通过MOVCA,@A+DPTR,就可以查到键号对应的键值了。
这里,是循环查表,不需要A就清零A,用DPTR来控制咯,也可以用A来控制,
就是incA,但是一般不这样用,因为A用到的地方很多,到时候值覆盖了不好
控制了。
③ 单片机的按键功能是什么
你们知道单片机的每个按键的具体功能吗?下面是我收集整理关于单片机的每个按键的具体功能的资料以供大家参考学习,希望大家喜欢。·
键盘的分类:
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘;
而靠软件编程来识别的称为非编码键盘。
在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。
本文主要讨论矩阵键盘(独立键盘比较简单可以与此类比),下面是矩阵键盘的电路连接图。
如果单片机检测到的是抖动部分,则无法按键判断是否有效,所以我们需要加入防抖程序。
注:也可以通过硬件防抖,如上图(b)。
功能:矩阵键盘
(按相应的按键,数码管从0~F的显示)
单片机:AT89S52
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DAT=P0^3;
sbit CLK=P0^2;
uchar temp,h;
void delay(uint); //延迟程序
void sendbyte(uchar); //数码管显示
void keyscan(); //按键扫描
uchar code tab[]={
0xed,0x09,0xbc,0x9d,0x59,0xd5,
0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全灭
void main (void)
{
sendbyte(16); //初始时数码管无显示
while(1)
{
keyscan(); //按键扫描
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c=0;c<8;c++)
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1; //右移位赋值
}
}
void keyscan()
{
/*第一行按键的扫描*/
P2=0xfe; //确定第一行的按键有效
temp=P2; //将其赋给一个变量(处理I/O口时,一般先赋值给一个变量,然后通过处理变量来处理I/O口)
temp=temp&0xf0; //用于检测第一行的哪个按键按下
while(temp!=0xf0) /*这个部分只要是用来消除按下抖动的*/
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0) //这个地方,已经消除了按下抖动,P2口的值已经确定
{
temp=P2; //将P2口得值赋给变量
switch(temp) //这个switch语句,用来确定哪一个按键按下时,数码管的显示值
{
case 0x7e:h=0;
break; //这个break很重要,表示如果有匹配的值,就跳出switch语句,防止程序跳不出来。
case 0xbe:h=1;
break;
case 0xde:h=2;
break;
case 0xee:h=3;
break;
default : h=16;
break;
}
while(temp!=0xf0) /*这个部分只要是用来消除释放抖动的*/
{
temp=P2;
temp=temp&0xf0;
}
sendbyte(h); //送给数码管显示
}
}
/*第二行按键的扫描*/
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7d:h=4;
break;
case 0xbd:h=5;
break;
case 0xdd:h=6;
break;
case 0xed:h=7;
break;
default : h=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
sendbyte(h);
}
}
/*第三行按键的扫描*/
P2=0xfb;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x7b:h=8;
break;
case 0xbb:h=9;
break;
case 0xdb:h=10;
break;
case 0xeb:h=11;
break;
default : h=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
sendbyte(h);
}
}
/*第四行按键的扫描*/
P2=0xf7;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0x77:h=12;
break;
case 0xb7:h=13;
break;
case 0xd7:h=14;
break;
case 0xe7:h=15;
break;
default : h=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
sendbyte(h);
}
}
④ 单片机中什么是键值它和键编码有何关系
单片机中,键值只有两个,=1,表示键按下了,=0,表示键没有按下(或者是取反逻辑);
单片机要读到该键值,先要知道该键的位置,当你安排某个键在某端口的某个引脚上后,该键的位置就固定下来了,只有键值是变化的
⑤ 单片机矩阵键盘键号的判别
PA口接列线,PC口接行线
扫面列线,读取行线状态....行线默认都为高电平,当行线和列线相交时,某一列线为低电平,那么如果这一列没有键按下,行线的状态依然为高电平,如果有键按下,那么行线被短路,变为低电平,哪条行线输出低电平,那么就是这一行的键被按下,又知道是在哪一列,也就完全确定按下的是哪一键了...也就是行首号加列号就是键号(行号和列号都是从0开始的)
应该是第一行的首键号为8,列号为1,所以闭合键号为9吧(你自己前面说的也是:闭合键的键号等于为低电平的列好加上行线为低电平的行的首键号)
扫描的意思就是没开始扫描时,列线全部为高电平,开始扫描时,先第0列变为低电平,其他列仍然是高电平,然后第1列变为低电平,其他列仍然为高电平(包括前面变低电平的0列,现在也恢复高电平了),然后是第2列变为低电平,其他列为高电平,直到第7列为低电平,其他列为高电平,完成一次扫描...
还有“PA口输出为11111101时,就是第1列输出为低电平,其他列为高电平,列为输入口,不读取它的状态,行口为输出口,读取行状态,若pc0~pc3输出1101,如果pc0~pc3依次对应行0~3的话,那么第2行为低电平(你说:则1行1列相交键处于闭合,是pc0~pc3依次对应行3~0的情况),则1列2行相交的键闭合,每行有8列,第2行的行首号(因为行号从0开始,所以行号为2的行,按照习惯是第3行)为16,列号为1,那么键号就为16+1=17
下面有扫描2*4键盘的汇编程序(你的是4*8,即4行8列的键盘),仅供参考
看不懂不强求,希望对你有所帮助
DATA SEGMENT
TABLE DB ‘A’ ,‘B’ ,‘C’ ,‘D’ ,‘E’ ,‘F’ ,‘G’ ,‘H’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV AL,81H;使8255的A口和C口,并初始化
OUT 63H,AL
START1:
CALL EXAM;判断是否有键按下的子程序
JZ START1
CALL DELAY;延时程序,判断键是否误按
CALL EXAM
JZ START1;如果是误按,返回开始处,如果为否,顺序执行
MOV CL,00H ;开始键号判断
MOV CH,0FEH
CHECK:
MOV AL,CH
OUT 60H,AL
IN AL,62H ;从c口读数据,也就是读取行的状态...
TEST AL,01H;判断是否为第0行
JNZ OTHER ;不是,则转OTHER处
MOV AL,00H ;是的话,行首号置0
JMP KCODE;确定键号
OTHER: ;判断是否第1行
TEST AL,02H
JNZ NEXT ;不是则跳到NEXT处,进行下一列的判断
MOV AL,04H ;第1行行首号置4
KCODE: ;确定键号
ADD AL,CL
MOV BX,OFFSET TABLE
AND AX,0FFH
ADD BX,AX
MOV AL,[BX]
MOV [DI],AL
MOV AH,01H
MOV AL,[DI]
INT 10H
NEXT: ;进行下一列的判断
INC CL
MOV AL,CH
TEST AL,08H
JZ START1
ROL AL,1
MOV CH,AL
JMP CHECK
EXAM PROC
MOV AL,00H
OUT 60H,AL
IN AL,62H
NOT AL
TEST AL,03H
RET
EXAM ENDP
DELAY PROC
PUSH CX
MOV CX,0010H
T1:
MOV AX,1000H
T2:DEC AX
JNZ T2
LOOP T1
POP CX
RET
DELAY ENDP
CODE ENDS
END START
⑥ 单片机散转程序中ACALL和SJMP的键号必须乘以4才能得到正确的散转偏移量,为什么要乘以4
乘以2是常见的,乘以3的也有;
乘以4,不像,请给出程序来分析一下。
---------------------
看明白了。
这书的作者,把各个程序的分支,写成了“调用子程序+转移指令”的形式,所以才有了如此“笨重”的散转方法。
且看它的分支表:
TABLE:
ACALL PRADD ;转加法子程序 从“TABLE +0”是第O个分支
SJMP PREND ;转结束
ACALL PRSUB ;转减法子程序 从“TABLE +4”是第一个分支
SJMP PREND ;转结束
ACALL PRMUL ;转乘法子程序 从“TABLE +8”是第二个分支
SJMP PREND ;转结束
ACALL PRDIV ;转除法子程序 从“TABLE +12”是第三个分支
SJMP PREND ;转结束
…… 从“TABLE +…………
……
它的每个分支,都是使用了两条2字节的指令,所以各分支,相差4个字节;如果要根据分支的号码,找到对应的地址,就应该乘以4。
这种4字节形式的分支表,所能容纳的分支数目,明显少于2字节的分支表。这种笨方法,也写成书,真是不可思议。
⑦ 用单片机编写的键盘扫描程序怎样编写它的求键号程序
要不要我帮你写一段,你后面没扫描,当然无法获取键值
t1:mov
p1,#0fh
;p1接口高4位为0,低4位输入
mov
a,p1
;读p1
anl
a,#0fh
;屏蔽高4位
cjne
a,#0fh,t2
;有键按下转t2
sjmp
t1
;无键按下转回
t2:lcall
delay10;延时10ms,去抖
mov
a,p1
;重新扫描p1口
anl
a,#0fh
cjne
a,#0fh,t3
sjmp
t1
t3:mov
r0,#00
;行计数值
mov
r1,#00
;列计数值
mov
r3,#0efh
;扫描初值
t4:mov
a,r3
mov
p1,a;输出行扫描字
mov
a,p1
mov
r1,a
anl
a,#0fh
cjne
a,#0fh,t5
;该行有键按下
inc
r0
;行计数器加1
,扫下一行
MOV
A,R3
RLC
A
MOV
R3,A
MOV
A,R0
CJAE
A,#04H,t4
;扫到最后一行?
t6:
ret
;结束
t5:mov
a,r1
jnb
acc.0,t7
jnb
acc.1,t8
jnb
acc.2,t9
jnb
acc.3,t10
sjmp
t6
t7:
mov
r2,#00
;0列号
sjmp
t11
t8:mov
r2,#01
;1列号
sjmp
t11
t9:mov
r2,#02
;2列号
sjmp
t11
t10:mov
r2,#03
;3列号
t11:mov
a,r0
mov
b,#04
mul
ab
;行号乘4
add
a,r2
;键值在A中
ret
⑧ 单片机按键功能
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
2.输入原理
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。
对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入,并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序
⑨ 在单片机中key =1, key =0什么意思
key是按键,一般一端接地,另一端接单片机的IO管脚,所以前面定义sbit
Key=p1𠆢0
按键按下时,该管脚为
低电平
,即key=0,否则
key=1