㈠ 用单片机编写的键盘扫描程序怎样编写它的求键号程序
要不要我帮你写一段,你后面没扫描,当然无法获取键值
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
㈡ 单片机四个键的独立式键盘扫描汇编程序
参考:
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255) {
delay(100);
x2 = KEY_IO;
if (x1 != x2) return 255;
while(x2 != 255) x2 = KEY_IO;
if (x1 == 0x7f) RST();
else if (x1 == 0xbf) DISPLAY();
else if (x1 == 0xdf) TEMP++;
else if (x1 == 0xef) TEMP--;
}
return 255;
}
㈢ 单片机矩阵键盘扫描程序
P3=0x7f;
temp=P3;
temp的值是实时的P3口的值,还是等于0x7f?
temp 的值,是 P3 外部引脚输入的值。
具体是何值?取决于 P3 外接的电路。
如果 P3 外面,八个引脚,都接地,那么:
temp 就是 0000 0000。
㈣ 51单片机 键盘扫描程序
P2的按键扫描跟实时钟模块共用IO了,虽然几率很小但是还是会有几率误触发导致数据读取错误。
㈤ 单片机键盘扫描。
兄弟,你好
void key()
{uchar key1,key2,key3; 这条语句后就key1=key2=key3=0了,肯定就一直在key()函数中一直不出来了撒,你的key1等是按键,怎么没有分配一个IO口呢
你如果这样的话就可以了
void key()
{uchar key1,key2,key3;
key1=key2=key3=1;这样的话就不会一直在key()中了
要想达到效果,估计你还的弄几个按键
添几句
sbit key1=P3^0;
。。。。。。
再把 uchar key1,key2,key3;这一句删了,
你试一下,祝你成功
㈥ 寻单片机“经典键盘”的扫描程序(要C语言的)
uchar keyscan()
{
uchar key,i,keyscan;
P3=0x3d; //准备读取P3.2~P3.5 51的I/0为准双向I/0口 作为输入是最好先将其置1
//读取接地按键值
if((P1&0x3d)!=0x3d){ //若无按键按下 P3.2~P3.5为高
delay(); //延时去抖动
if((P1&0x3d)!=0x3d){//判断哪个按键按下
key=P1&0x3d;
return key;
}
}
keyscan=0x3D;
for(i=0;i<4;i++){
P1=keyscan; //输出I/O口扫描 输出 判断
if(P1!=keyscan){ //读取I/O口,看输出扫P1.0~P1.5的值是否与扫描不同
key=P1&0x3D; //转换扫描码
return key;
}
keyscan=(keyscan<<1)|0x01; //逐行输出扫描 0
}
return 0;
}
㈦ 单片机4*4键盘扫描程序
这这个循环4次的程序段就是发送扫描码,再分别检测按键情况的。扫描码就是k_out,分别是0xfe;0xfd;0xfb,0xf7;这几个数是靠k_out=crol_(k_out,1);来实现的。键盘扫描,你要理解是“扫描”也就是一行一行的发送扫描码,再检测每“列”的值,这个值就是键值。
㈧ 单片机键盘扫描C程序
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
char scan_key(void)
{
uchar i,j,in,ini,inj;
bit find=0;
for(i=0;i<4;i++)
{ //额 ,先给你解释下4*4
P1=act[i]; //开通读取,并输出高电平
delay(10); //延时
in=P1; //读取单片机值并赋值给in,四种情况4个按键,
in=in>>4; //右移四位,去掉低位
in=in|0xf0; //位或运算,高四位补1,
for(j=0;j<4;j++)
{
if(act[j]==in) //判断具体哪个按键
{
find=1;
inj=j;ini=i;
}
}
}
if(find==0)return-1; //返回值 -1,return 1是正常返回,return -1是非正常返回 程序写法标准而已,即没按键
return(ini*4+inj); //i是判断高四位,j判断低4位
}
0 1 2 3 p1.0 p1.0为零 可判断0,1,2,3 如果开关0导通 p4即为0,即为1110 1110
4 5 6 7 p1.1 右移补1,得 1111 1110,及j为0
8 9 a b p1.2 开关1导通 p5为0, 即 1101 1110, 右移补1111 1101
c d e f p1.3 可判断j为1 同理可类推
p4 5 6 7
按这种思路4个端口只能实现4个开关4*4=16,2*2=4 得换思路,如果是因为端口紧张的话,可以用P3口,或者采用分压读取AD判断按键(AD键盘)
㈨ 单片机按键扫描程序
KEY: MOV A,P1
CLR C
SUBB A,#1
MOV 20H,A
RET
这样得不到键值呀
改:
KEY: MOV A,P1
SETB C
MOV R7,#8
LPKEY:
RRC A
JNC OUTK1
DJNZ R7,LPKEY
OUTK1: DEC R7
MOV 20H,R7 //如果20H=255则表无键
RET
㈩ 单片机的独立键盘扫描程序
这是keil 的语法规定的,在程序中不能有类似的P3^4的写法的。必须在主程序之前用sbit 命令定义成符号,所以,
if(P3^4==0)的写法是错误的,只有if(key==0)的写法才是正确的。
虽然编译是通过的,也没有报错,但是编译后的代码却是错误的。
如果懂得汇编代码,是可以查编译后的汇编代码,就知道是错的。