完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序1:
#include #define GPIO_DIG P0 //定义字形接口 ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; //74LS138定义字位 unsigned char code DIG_NUM[8]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, };//字形库 void main() { unsigned char i,j; while(1) //为什么这个while循环一定要加,不然显示不正常,具体现象为最高位的所有数码管都微亮,而且显示出7的亮度 很大。其他位值数码管显示正确数字,但亮度为微亮, { for(i=0;i<8;i++) { switch(i) { case 0:LSA=0;LSB=0;LSC=0;break; case 1:LSA=1;LSB=0;LSC=0;break; case 2:LSA=0;LSB=1;LSC=0;break; case 3:LSA=1;LSB=1;LSC=0;break; case 4:LSA=0;LSB=0;LSC=1;break; case 5:LSA=1;LSB=0;LSC=1;break; case 6:LSA=0;LSB=1;LSC=1;break; case 7:LSA=1;LSB=1;LSC=1;break; } GPIO_DIG=DIG_NUM; j=100; //扫描间隔 while(j--); GPIO_DIG=0x00; //消隐 } } } 程序2: #include #define GPIO_DIG P0 //定义字形接口 #define GPIO_KEY P1 //定义4x4矩阵按键接口 ***it LSA=P2^2; ***it LSB=P2^3; ***it LSC=P2^4; //74LS138定义字位 unsigned char keystate; //按键是否按下判断值 unsigned char keyvalue; //按键值 unsigned char DIG_DATA[8]; //字形临时数据 unsigned char code DIG_NUM[17]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00 }; //字形库 void delay10ms(); //延时10ms void keydown(); //按键判断 void DIG_display(); //显示 void delay10ms() //延时子程序10ms { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } void keydown() //按键判断子程序 { unsigned int n=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) { delay10ms(); if(GPIO_KEY!=0x0f) { keystate=1; GPIO_KEY=0x0f; switch(GPIO_KEY) { case 0x07:keyvalue=0;break; case 0x0b:keyvalue=1;break; case 0x0d:keyvalue=2;break; case 0x0e:keyvalue=3;break; default:keyvalue=17; } GPIO_KEY=0xf0; switch(GPIO_KEY) { case 0x70:keyvalue=keyvalue;break; case 0xb0:keyvalue=keyvalue+4;break; case 0xd0:keyvalue=keyvalue+8;break; case 0xe0:keyvalue=keyvalue+12;break; default:keyvalue=17; } while((n<1000)&&(GPIO_KEY!=0xf0)) { delay10ms(); n++; } n=0; } } } void DIG_display() //显示子程序 { unsigned char i,j; // while(1) //为什么这里不用while??? // { for(i=0;i<8;i++) { switch(i) { case 0:LSA=0;LSB=0;LSC=0;break; case 1:LSA=1;LSB=0;LSC=0;break; case 2:LSA=0;LSB=1;LSC=0;break; case 3:LSA=1;LSB=1;LSC=0;break; case 4:LSA=0;LSB=0;LSC=1;break; case 5:LSA=1;LSB=0;LSC=1;break; case 6:LSA=0;LSB=1;LSC=1;break; case 7:LSA=1;LSB=1;LSC=1;break; // default: i=17;break; } GPIO_DIG=DIG_DATA; j=100; while(j--); GPIO_DIG=0x00; } } //} void main() { keystate=0; while(1) { keydown(); if(keystate==1) //左移 { DIG_DATA[7]=DIG_DATA[6]; DIG_DATA[6]=DIG_DATA[5]; DIG_DATA[5]=DIG_DATA[4]; DIG_DATA[4]=DIG_DATA[3]; DIG_DATA[3]=DIG_DATA[2]; DIG_DATA[2]=DIG_DATA[1]; DIG_DATA[1]=DIG_DATA[0]; DIG_DATA[0]=DIG_NUM[keyvalue]; keystate=0; } DIG_display(); } } 两个程序,程序1是8个数码管从低位到高位,依次显示0到7;程序2是显示按键的值,并且之前按下的值会左移。 问题是程序1显示的程序需要加while才能显示正常,而程序2里面显示子程序不能加while,否则不显示,有大神能解释一下疑惑么? |
|
相关推荐
5个回答
|
|
同样很想知道这个问题该如何解决
|
|
|
|
其实这两个程序是一样的,只不过第二个程序是把显示部分做成了子程序,主体main里的while(1)还是都一样的。这只是你还没理解动态显示的原理。
如果把显示部分放在定时器里,那你是不是就更迷糊了 |
|
|
|
本帖最后由 JCARSON 于 2019-6-10 11:29 编辑
人中狼 发表于 2018-6-20 15:53 |
|
|
|
我百度了下,程序1的while(1)这个死循环是为了保证程序的正常运行,虽然没有这个死循环,该程序还是会重复运行,但是会因编译器不同而有差异,具体你可以百度一下。 程序2,主程序里面有while(1),也是同样的道理,显示子程序里面不能有这个死循环,不然你还没按键,程序就跑到显示子程序里面的while(1)死循环里面出不来了,不管你按不按键,它不会运行到键盘识别子程序的。 |
|
|
|
是不是动态显示与静态显示的区别
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
551 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
853 浏览 0 评论
2529 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2268 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1708 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5781 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 22:14 , Processed in 0.566498 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号