完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
复位后数码管亮一会(时间极短),全灭。
什么原因????? 程序在此 #include char key,num,temp; char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 }; char cbit[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; char buffer[]={ 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40 }; /*******************************************delay*****************************/ void delay(int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } /*void display(num) { P0=table[num]; P1=0xfe; } */ /**********************************************keyscan*********************/ void keyscan() { int i,j; i=8; while(i--) { P1=cbit[i]; P0=buffer[i]; } P2=0xff; temp=P2; if(temp!=0xff) delay(10); temp=P2; if(temp!=0xff) { j++; /* if(temp==0xfe)key=0; else if(temp==0xfd)key=1; else if(temp==0xfb)key=2; else if(temp==0xf7)key=3; else if(temp==0xef)key=4; else if(temp==0xdf)key=5; else if(temp==0xbf)key=6; else if(temp==0x7f)key=7; */ switch(temp!=0xff) { case 0xfe: key=0; break; case 0xfd: key=1; break; case 0xfb: key=2; break; case 0xf7: key=3; break; case 0xef: key=4; break; case 0xdf: key=5; break; case 0xbf: key=6; break; case 0x7f: key=7; break; } buffer[j]=table[key]; if(temp!=0xff); delay(4); } } void main() { while(1) { keyscan(); } } |
|
相关推荐
10个回答
|
|
P2连独立键盘,P1八位共阴极数码管位选,P0数码管段选
|
|
|
|
代码真是乱啊,既然都粘上来了,怎么还是没有把没用的注释去掉,看着挺烦的。
首先程序居然没有初始化, 还有那个关于 j 的句子是干嘛的,我到底没弄明白,直接键盘扫描后给位选赋值不就得了, 加就加吧,但你好赖给他赋个初值,加个边界啊。 另外 switch(temp!=0xff) 我怎么感觉不太对,如果这样的话括号里面不应该永远是 1 吗? 还有,大哥,,,,51里面一共才多少RAM,你就敢设这么多这样的数组,真勇敢。。。。。 |
|
|
|
谢谢指出错误,不好意思,移位显示程序(计算机式或计算器式)我编了三四天了,一直没思路,头都大了,程序乱了,重新整理了一下,switch用法确实错了,已改正。j我是想实现移位功能,但没用。移位程序在网上只搜到了一个汇编的 #include char key,num,temp; char table[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 }; char cbit[]= { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; char buffer[]= { 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40 }; void delay(int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void keyscan() { int i=0; int j=0; if(i<8) { i++; P1=cbit; P0=buffer; P2=0xff; temp=P2; if(temp!=0xff) { delay(10); temp=P2; if(temp!=0xff) { j++; switch(temp) { case 0xfe: key=0; break; case 0xfd: key=1; break; case 0xfb: key=2; break; case 0xf7: key=3; break; case 0xef: key=4; break; case 0xdf: key=5; break; case 0xbf: key=6; break; case 0x7f: key=7; break; } buffer[j]=table[key]; if(temp!=0xff); delay(4); } } } } void main() { while(1) { keyscan(); } } 下载后只在第二位数码管显示键值 继续求移位程序 |
|
|
|
我用的这个应该是528的ram,应该够吧
|
|
|
|
我又改了一下程序,按下面这个程序,下载后八位数码管初始不应全显示为—(减号,g段)亮吗?
为什么实际是P1.1连得那位数码管显示0;奇怪。 #include char key,num,temp; char table[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 }; char cbit[]= { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; char buffer[]= { 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40 }; void delay(int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void keyscan() { int i=0; int j=0; if(i<8) { i++; P1=cbit[i]; P0=buffer[i]; delay(10); P2=0xff; } temp=P2; if(temp!=0xff) { delay(10); temp=P2; if(temp!=0xff) { j++; switch(temp) { case 0xfe: key=0; break; case 0xfd: key=1; break; case 0xfb: key=2; break; case 0xf7: key=3; break; case 0xef: key=4; break; case 0xdf: key=5; break; case 0xbf: key=6; break; case 0x7f: key=7; break; } buffer[j]=table[key]; if(temp!=0xff); delay(4); } } } void main() { while(1) { keyscan(); } } |
|
|
|
不是吧,你能正确的显示出键值? 这个程序明显会陷入没有意义的循环,每一次 keyscan() 调用时都会给 i,j 赋初值0, 接下来的 if(i<8) 就没有意义了,下面在 if 的执行语句块里,又给P0,P1,P2 附了初值,相当于每次运行到这个地方就会初始化一下(也就是说只要键盘没按下去就会一直的出现初始化,我实在想不通会有正确的键值,还是在第二位,我板子刚让我整废也没法在板子上试,不好意思,这些全是我想的),接下来是消抖,还行吧,至于那个 j 我感觉没作用,如果想进行移位的话,可以在键盘扫描完之后,对P0进行赋值的时候,可以也对 P1 进行向左或向右的移位处理,实现位选信号的改变,这样那个 buffer[] 和 cbit[] 以及变量 j 就不需要了。 至于对数码管P1和P0的初始化,你可以写在main函数中 while() 的前面,或者为了规范,可以另外写一个初始化函数。 RAM即使是528的,说到底他也是个51,弱得很,能少占用内存就少占用吧,还是养成习惯的好,你的这个程序中想那些 table[] 之类不会改变的数组,定义时用 code char 定义,可以不占用RAM,而是当做程序的一部分。 上面的纯粹是脑子想的,没试验,如果有不对见谅啊。。。 |
|
|
|
听楼上的再改一下程序,检测按键放开的while语句不屏蔽数码管第八位位显示0,其余不亮,按下键后状态不变,好奇怪。对P1如何移位啊?想不到哎!!!!!,
#include char key,num,temp; char table[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 }; char cbit[]= { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f }; char buffer[]= { 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40 }; void delay(int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void keyscan() { int i=0; int j=0; for(i=0;i<8;i++) { P1=cbit[i]; P0=buffer[i]; delay(2);} P2=0xff; temp=P2; if(temp!=0xff) { delay(5); temp=P2; if(temp!=0xff) { j++; switch(temp) { case 0xfe: key=0; break; case 0xfd: key=1; break; case 0xfb: key=2; break; case 0xf7: key=3; break; case 0xef: key=4; break; case 0xdf: key=5; break; case 0xbf: key=6; break; case 0x7f: key=7; break; } buffer[j]=table[key]; //while(temp!=0xff) // buffer[j]=table[key]; } } } void main() { while(1) { keyscan(); } } |
|
|
|
可能咱们两个说的根本不是一个意思,,,, 我还是写段完整的代码算了,这才是王道,我不知道你板子上的数码管是怎么连得,移位方向可能不太对,还有你数码管应该是共阳极的吧,我是按共阳极写的。 #include #include #define uint unsigned int #define uchar unsigned char uchar code table[]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 }; void init(); //初始化数码管 void delay(int); //延时 void keyscan(); //键盘扫描+数码管显示 void main() { init(); while(1) { keyscan(); } } void init() { P0=0xff; //初始化数码管全灭 P1=0x7f; //位选信号在最高位,为下一次移位做准备 } void keyscan() { uchar key,temp,temp1; //temp,temp1用作键盘消抖 P2=0xff; //检测键盘 temp=P2; if(temp!=0xff) //这两个if嵌套用于键盘按下时的消抖检测 { delay(5); temp=P2; if(temp!=0xff) { temp1=temp; //一旦确定键盘按下,将键值赋给temp1,用于按键抬起时的消抖检测 switch(temp) { case 0xfe:key=0;break; case 0xfd:key=1;break; case 0xfb:key=2;break; case 0xf7:key=3;break; case 0xef:key=4;break; case 0xdf:key=5;break; case 0xbf:key=6;break; case 0x7f:key=7;break; } P0=0xff; //让数码管位置变换时,先灭,再移动,避免出现闪烁 P1=_crol_(P1,1); //位选信号左移一位 P0=table[key]; //段选信号赋值 while(1) //用于按键抬起检测 { P2=0xff; //获取键盘状态 temp=P2; if(temp!=temp1) //消抖 { delay(5); if(temp!=temp1)break; } } } } } void delay(int x) { int a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } 可能个人写的习惯不一样,我写的是这个样子,也是在你的基础上写的。你可以再写写,我用软件仿真过了,可以,不知道在板子上是什么样子。 |
|
|
|
看程序看的头都大了,汇编又不会,这可如何是好
|
|
|
|
给你一个AD转换的实例,有程序,还有proteus仿真。相当于一个简单地电压表
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
54 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
395 浏览 0 评论
439 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1265 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
529 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11749 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 21:14 , Processed in 0.743122 second(s), Total 92, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号