4*4矩阵键盘

wenjinzaime 2010-10-18 08:31:39
ORG 0H
SJMP Star
Star:
MOV P1,#0H
MOV DPTR,#Table
LOOP:MOV P3,#11111111B
MOV R3,#11101111B
MOV P3,R3
MOV R0,#0
MOV R1,#4
D1: JNB P3.3,LED7
INC R0
JNB P3.2,LED7
INC R0
JNB P3.1,LED7
INC R0
JNB P3.0 ,LED7
INC R0

MOV A,R3
RL A
MOV R3,A
MOV P3,A
DJNZ R1,D1
JMP LOOP



LED7:
CALL DELEY
MOV A,#0H
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
JMP LOOP


Table: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,77H,7cH ,39H,5eH,79H,71H

DELEY: MOV R7,#5
DELEY_LOOP: MOV R6,#250
DELEY1_LOOP: MOV R5,#200
DJNZ R5,$
DJNZ R6,DELEY1_LOOP
DJNZ R7,DELEY_LOOP
RET

END






小弟这个程序是想实现个简单的键盘按几 在数码管上就数据多少 我的思路就是 一直循环 如果检测到了跳出循环 就显示到数码管上 程序没有问题 但是不能实现功能 希望大家指点下我
...全文
943 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰满 2010-11-02
  • 打赏
  • 举报
回复
呵呵,汇编还是慢慢来吧,只是学习可以最好不要用汇编哦
kelvinzhouzsz 2010-11-02
  • 打赏
  • 举报
回复
楼主的汇编看起来恼火。跟帖的值得一看。
leafsoar 2010-11-01
  • 打赏
  • 举报
回复
哈,我也贴个C的吧


#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar num,temp;

void init();
void display(uchar);
void keyscan();
void main()
{
init();
while(1)
{
keyscan();
display(num);
}
}
void init()
{
//初始化时显示所有数码管
num=1;
dula=1;
P0=0;
dula=0;
wela=1;
P0=0xc0;
wela=0;
}
void display(uchar i)
{
dula=1;
P0=table[i-1];
dula=0;
}
void keyscan()
{
uchar i;
P3=0xfe; //初始化检测第一排键盘
for(i=0;i<4;i++)
{
//由于是用Proteus模拟,所以没有消抖检测
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp&0xf0) //因为用了for循环,所以只比较高4位即可
{
case 0xe0:num=1;
break;
case 0xd0:num=2;
break;
case 0xb0:num=3;
break;
case 0x70:num=4;
break;
}
num=num+i*4; //i表示第几排
while(temp!=0xf0) //键盘释放显示数字
{
temp=P3&0xf0;
}
}
P3=_crol_(P3,1); //每左移一位检测下一排按键
}
}

wenjinzaime 2010-11-01
  • 打赏
  • 举报
回复
其实我已经搞定了这个问题 也是用汇编写的 。 我在这里就是看看大家有没有别的思路的。谢谢大家的意见 也谢谢楼上的C语言程序 继续等待 我感觉我上面的程序在延时有个问题
zhyt_213 2010-11-01
  • 打赏
  • 举报
回复
键盘扫描那块代码有问题!这样写好乱啊,而且逻辑上貌似也有问题

LOOP:
MOV P3,#11101111B
LOOP1:
CLR ACC
XRL A, P3
CJNE A, #11101111B, CHECK_KEY
SJMP LOOP1

CHECK_KEY:
CALL DELEAY
XRL A, P3
JNZ LOOP

LED7:
;显示
……

CHECK_KEY_UP:
;参照前面的代码检测键是否抬起
LJMP LOOP
Wayne-Woo 2010-10-23
  • 打赏
  • 举报
回复
没有进行松手检测....
houyu123 2010-10-23
  • 打赏
  • 举报
回复
在列线上加上拉电阻试试!!!
jamesliu2010 2010-10-23
  • 打赏
  • 举报
回复
汇编可以做对硬件命令执行的解读,实际编程还是C或其他的语言简洁一点
zhenxing2000 2010-10-23
  • 打赏
  • 举报
回复
图片发不成???


我做了个C语言程序,调试通过,可以在板子上正常运行,希望有用,我不会汇编。

#include<reg51.h>
#define uchar unsigned char;
#define uint unsigned int;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code tablew[]={0xfe,0xfd,0xfb,0xf7};
uchar temp,num,i,j,t;

delay(t)
{

for(i=t;i>0;i--)
for(j=110;j>0;j--) ;
}

void main()
{

P1=0xff;
P0=0x00;
while(1)
{

P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5); // 确认是否真有键按下
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1; //读回键的值
switch(temp)
{
case 0xee: num=1;
break;
case 0xde: num=2;
break;
case 0xbe: num=3;
break;
case 0x7e: num=4;
break;

}
while(temp!=0xf0) //松手检测 ,否则跳不出循环
{
temp=P1;
temp=temp&0xf0;
}
P0=table[num-1];
delay(1000);

}
}




P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed: num=5;
break;
case 0xdd: num=6;
break;
case 0xbd: num=7;
break;
case 0x7d: num=8;
break;

}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}

P0=table[num-1];
delay(1000);

}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb: num=9;
break;
case 0xdb: num=10;
break;
case 0xbb: num=11;
break;
case 0x7b: num=12;
break;

}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}

P0=table[num-1];
delay(1000);

}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7: num=13;
break;
case 0xd7: num=14;
break;
case 0xb7: num=15;
break;
case 0x77: num=16;
break;

}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}

P0=table[num-1];
delay(1000);

}
}
}
}


zhenxing2000 2010-10-23
  • 打赏
  • 举报
回复
wopabe 2010-10-19
  • 打赏
  • 举报
回复
楼上的说的很好,但汇编学的都忘了,还是C好
keepm 2010-10-19
  • 打赏
  • 举报
回复
哈哈,用汇编能对硬件熟悉,先汇编再C挺好
a691662 2010-10-18
  • 打赏
  • 举报
回复
还是用c吧 简洁 看着也方便 也不容易出错
coding码场 2010-10-18
  • 打赏
  • 举报
回复
汇编写程序,已经不多了!用c写应该方便很多,现在用c写的程序能达到汇编90%的效率,其实也挺好了。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧