完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
while(!key_dec);
delay_ms(10); while(!key_dec); if(num>0) num--; else num=999; } } if(num>999) tempdata[3]=duma[num/1000]; else tempdata[3]=0; if(num>99) tempdata[2]=duma[num%1000/100]; else tempdata[2]=0; if(num>9) tempdata[1]=duma[num%1000%100/10]; else tempdata[1]=0; tempdata[0]=duma[num%1000%100%10]; display(0,3); } } /*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三 个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/ void display(uchar fi***it,uchar num) { static uchar i; for(i=0;i P0=0;//清空数据,防止交替重影 dula=1; dula=0; P0=wema[i+fi***it]; wela=1; wela=0; P0=tempdata; dula=1; dula=0; delay_ms(2); } } void delay_us2x(uchar t) { while(t--); } void delay_ms(uchar t) { while(t--) { delay_us2x(245); delay_us2x(245); } } void init() { key_add=1; key_dec=1; } 这个按键盘可以实现数码管显示加减,不过有闪烁,下面这个程序是想通过定时器消除数码管闪烁,可是按键盘数码管不变化,一直显示0 #include #define uchar unsigned char #define uint unsigned int ***it key_add=P3^3; ***it key_dec=P3^4; ***it dula=P2^6; ***it wela=P2^7; uchar code duma[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code wema[]={ 0x7f,0xbf,0xdf,0xef,0xf7, 0xfb,0xfd,0xfe}; uchar tempdata[8]; void display(uchar fi***it,uchar num); void delay_us2x(uchar t); void delay_ms(uchar t); void init(); void init_timer0(); void main() { uint num=0; init(); init_timer0(); while(1) { if(!key_add) { delay_ms(10); if(!key_add) { while(!key_add); //delay_ms(10); //while(!key_add); num++; if(num==1000) num=0; } } if(!key_dec) { delay_ms(10); if(!key_dec) { while(!key_dec); //delay_ms(10); //while(!key_dec); if(num>0) num--; else num=999; } } if(num>999) tempdata[3]=duma[num/1000]; else tempdata[3]=0; if(num>99) tempdata[2]=duma[num%1000/100]; else tempdata[2]=0; if(num>9) tempdata[1]=duma[num%1000%100/10]; else tempdata[1]=0; tempdata[0]=duma[num%1000%100%10]; //display(0,8); } } void display(uchar fi***it,uchar num) { static uchar i; for(i=0;i P0=0;//清空数据,防止交替重影 dula=1; dula=0; P0=wema[i+fi***it]; wela=1; wela=0; P0=tempdata; dula=1; dula=0; delay_ms(1); } } void delay_us2x(uchar t) { while(t--); } void delay_ms(uchar t) { while(t--) { delay_us2x(245); delay_us2x(245); } } void init_timer0() { TMOD|=0x01; TH0=(65536-2000)/256; // 2ms TL0=(65536-2000)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; display(0,8); } void init() { key_add=1; key_dec=1; } 求大侠解决,我都在这里卡了几个小时了 |
|
相关推荐
6个回答
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
路过学习一下
|
|
|
|
看楼主的程序,楼主的思路不对,还停留在延时的思想中。定时器中断里面还有延时函数。
我们知道数码管是不断扫描现实动态显示。每隔一段时间亮一个数码管。不断扫描实现多个数码管同时显示的效果。如果我们要用定时器中断。那么每次进中断就是点亮下一个数码管。下面这个就是我改的中断程序。每次进入中断就是点亮一个数码管。下次进入中断就点亮下一个数码管。例外提示Num要设置成全局变量不能在中断函数里面定义成局部变量。否则每次进入中断Num的值都是初始值。 void timer0() interrupt 1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; display(Num); Num ++; if(Num == 8) Num =0; } 下面这个就是数码管显示函数。display(uchar i)就是点亮第i个数码管。
定时器中断的时间不能设置太大或太小,太大出现闪烁,太小中断占用CPU的时间比例太高。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
386 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1670 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1123 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1005 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1229 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12019 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:44 , Processed in 0.799438 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号