一个4*4键盘控制两块单片机矩阵键盘原理的问题!!!!求教高手!...

查看:786|回复:6
本人是新手,刚开始学单片机,自己写了一个矩阵键盘程序,希望效果是,按键后数码管显示相应数字,显示到8位数字后数码管清零,重新开始。编写前也参考了别人的程序,感觉没有啥错误,但就是无法正常显示,每次一按键数码管就乱闪,然后在一个随机的数码管位显示按键对应数字,而且无法稳定显示8位,有时能显示两位,有时三位,有时一位,自己感觉应该是数码管定时器扫描和按键防抖延迟在时间上有冲突,打断了数码管扫描,可是改了很久都无法正常。求高手帮忙看一下,谢谢!
#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
#define numpor P0
#define keypor P1
sbit Wlatch=P2^3;
sbit Dlatch=P2^2;
uchar code Dtable[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0xf1};
uchar code Wtable[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,
0xfd,0xfe};
uchar temp[10],a;
void delay(uint z);
void display(uchar c);
uint matrixscan();
void main()
& && && &uint b,
& && && &TMOD=0x01;
& && && &EA=1;
& && && &ET0=1;
& && && &TR0=1;
& && && &while(1)
& && && &{
& && && && && &&&num=matrixscan();
& && && && && &&&if(num)
& && && && && &&&{
& && && && && && && && & if(a&7)
& && && && && && && && & temp[a]=Dtable[num-1];
& && && && && && && && & a++;
& && && && && && && && & if(a==9)
& && && && && && && && & {
& && && && && && && && && && && &for(b=0;b&8;b++)
& && && && && && && && && && && && && &&&temp=0;
& && && && && && && && && && && &a=0;
& && && && && && && && & }
& && && && && &&&}
& && && &}
void delay(uint z)
& && && &uint x,y;
& && && &for(x=z;x&0;x--)
& && && && && &&&for(y=110;y&0;y--);
void display(uchar c)
& && && &for(t=0;t&c;t++)
& && && &{
& && && && && &&&numpor=0;
& && && && && &&&Dlatch=1;
& && && && && &&&Dlatch=0;
& && && && && &&&numpor=Wtable[7-t];
& && && && && &&&Wlatch=1;
& && && && && &&&Wlatch=0;
& && && && && &&&numpor=temp[c];
& && && && && &&&Dlatch=1;
& && && && && &&&Dlatch=0;
& && && &}
void timer0() interrupt 1
& && && &TH0=()/256;
& && && &TL0=()%256;
& && && &display(a);
uint matrixscan()
& && && &uchar fortemp,
& && && &keypor=0x0f;
& && && &if(keypor!=0x0f)
& && && &{
& && && && && &&&delay(10);
& && && && && &&&if(keypor!=0x0f)
& && && && && &&&{
& && && && && && && && & fortemp=
& && && && && && && && & keypor=0xf0;
& && && && && && && && & revtemp=
& && && && && && && && & fortemp=fortemp|
& && && && && && && && & switch(fortemp)
& && && && && && && && & {
& && && && && && && && && && && &case 0x7e:key=1;
& && && && && && && && && && && &case 0xbe:key=2;
& && && && && && && && && && && &case 0xde:key=3;
& && && && && && && && && && && &case 0xee:key=4;
& && && && && && && && && && && &case 0x7d:key=5;
& && && && && && && && && && && &case 0xbd:key=6;
& && && && && && && && && && && &case 0xdd:key=7;
& && && && && && && && && && && &case 0xed:key=8;
& && && && && && && && && && && &case 0x7b:key=9;
& && && && && && && && && && && &case 0xbb:key=10;
& && && && && && && && && && && &case 0xdb:key=11;
& && && && && && && && && && && &case 0xeb:key=12;
& && && && && && && && && && && &case 0x77:key=13;
& && && && && && && && && && && &case 0xb7:key=14;
& && && && && && && && && && && &case 0xd7:key=15;
& && && && && && && && && && && &case 0xe7:key=16;
& && && && && && && && && && && &default:key=0;
& && && && && && && && & }
& && && && && &&&}
& && && && && &&&else
& && && && && && && && & key=0;
& && && &}
& && && &return (key);
版规,发帖可获2无忧币
求助高手哇
版规,回帖可获2无忧币
我顶!有没有高手关注一下呀,求助啦
版规,回帖可获2无忧币
我觉得你还是先确定硬件的时钟是同步的吧
版规,回帖可获2无忧币
没图没真相
版规,回帖可获2无忧币
了解啊。。。。。。。。。
版规,回帖可获2无忧币
初来乍到 顶一个 谢谢
版规,回帖可获2无忧币单片机4*4矩阵键盘,求高手_百度知道
单片机4*4矩阵键盘,求高手
&#47,如何让显示的数保持住;
_nop_(),0x71};&#47,0x5e,0x4f,但松开按键时又再次显示4;返回取得的按键
temp &lt#include&
_nop_();/ for(j=0;
for(i=0, 0 j++)
P1= Buffer[j];8~b0x39,0x7d,再次有按键按下时显示其它数字!(P1& temp))
return (i+j*4);问题2 当按键按下时显示某个数,同时检测低四位
uchar Keyscan(void)
/#define uchar unsigned char#define uint unsigned intuchar code table[]= {0x3f,0x79; i& i++)
&#47,例如当按键按下时显示0;j&4;作用为让 P1 口的状态稳定*&#47,0x6f;t&gt,如何写程序让按键松开时一直显示0;= 1,
//
}void main(){
uchar key=;0, Buffer[4]= {0&#47,0x6d;0~30x66;*以下三个_nop_();数码管段码}}问题1 为什么没按键按下时数码管显示4;数码管位码
key=keyscan(),0x77,0x5b;}
void delay_50us(uint t)
/0; &#47, 0
{P2=0, 0x7f},0x06;t--)
for(j=19;4~70x7f;&
for(,0x07;
temp= 0x01,j;
_nop_();/ j&
P0=table[key];/
#include&lt.h&reg51;/ 分别给高四位 置0
提问者采纳
但是:1! 我还没搞明白为什么会是4,扫描没有按键按下,key值应该是一个随机的数,也就没有返回值,显示键值,当你按下按键时、没有按键按下时、主函数一直在对key值进行扫描,当你松开按键时,你的键盘扫描程序并没有返回值程序有问题,这个没问题;
其他类似问题
您可能关注的推广
矩阵键盘的相关知识
按默认排序
其他3条回答
html" target="_blank">http参考一下:<a href="http://hi.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5ae7685173fca.baidu://hi.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5ae7685173fca.baidu
看看初值的设置,用锁存器可以保持住上次的值
松手等待。。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
电子工程系毕业论文--单片机4×4矩阵键盘控制LED
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口谁知道用4*4的矩阵键盘设定某个参数的值吗?
& &我在用单片机做一个步进电机的控制器,但是我想用矩阵键盘设定转速和角位移的初值,我不知道怎么弄,麻烦各位高手告诉我一下,现在这里谢谢了!
你可以控制脉冲的频率来变速,扫描键盘按键,改变脉冲之间的时间,具体的你就按键来改变延时的长短,应该就可以了,不过启动时应该慢一些,快的话就只能震动而无法启动!
如果你想看到设置的参数的话 需要加显示部分 比如液晶,至于设定转数和角位移 你可以通过按键修改变量的值 来控制步进的频率 这个需要程序上的调整
站长推荐 /3
Powered by

我要回帖

更多关于 单片机矩阵键盘原理 的文章

 

随机推荐