完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
void display()
{ static int i=0; P2=i; P0=TempData[i]; i++; if(i==8 ) i=0; } ///////////////////////////////////////////// void display() { int i; for(i=0;i<8;i++) { P2=i; P0=TempData[i]; delay(1); //延时一毫秒 } } 最近在用ds1302做电子钟,数码管显示。以上是我写的显示程序,放在定时器中断里调用。P2是位码,P0是段码。 只有第一个可以正常显示,动态显示不是要用到延时么?第二个反而会让数码管出现余晖。 |
|
相关推荐
9个回答
|
|
|
|
|
|
|
|
|
这个程序是错的,i 不是全局变量,每次都只显示第一位,i 是不会保持有效数据的。看你这个程序应该不是P2直接驱动的位,因为直接位驱动的话一个时刻只有一个位有效的
第二段又是个死循环8次,时间不够 |
|
|
|
|
|
如果你的是用138来做的位选,这个程序看上去是没的问题的。就是不知道你所谓的余晖是什么。你可以适当的改变延时再试试!
|
|
|
|
|
|
既然用了定时器,为什么还要加延时,不知道你是怎么考虑的?
|
|
|
|
|
|
是的,第二个显示程序放在中断里跑时间不够。第一个显示程序是可以的,p2直接选通位,定时中断2ms,每次就显示一位,i是用static声明过可以保持。刚想明白了,谢谢。 |
|
|
|
|
|
|
|
|
|
|
|
可能是我刚入行不久,也可能因为没有看到你整个程序,不知道你程序调用情况,无法找出具体原因,给你我写过的4位动态数码管显示代码,调试可通过,希望对你有帮助
/************************************************************************** 动态数码管显示 COPYRIGHT (c) 2007 BY GSM. -- ALL RIGHTS RESERVED -- File Name: LEDdt.c Author: Guo Shaoming Created: 2007/2/9 Modified: NO QQ: 1367320 Email: guosim@126.com WEB: http://www.ConOpe.com 小河的技术日志 Revision: 1.0 ***************************************************************************/ #include //函数申明 void disp(unsigned char *x,db); void delay(unsigned int c); void timerint () ; void lshift(void); //D1--D4:四位数码管COM端,在本例中为共阴极;DP:小数位。 ***it D1=P2^0; ***it D2=P2^1; ***it D3=P2^2; ***it D4=P2^3; ***it DP=P0^7; //DT:数码管八位数据总线 #define DT P0 //0--9 位码,0X00:清显示。 unsigned char code dis[13]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, //0xC0,/*0*/ //0xF9,/*1*/ //0xA4,/*2*/ //0xB0,/*3*/ //0x99,/*4*/ //0x92,/*5*/ //0x82,/*6*/ //0xF8,/*7*/ //0x80,/*8*/ //0x90,/*9*/ 0X40,/*-*/ 0XBF,/*0.*/ 0XFF,/*NULL*/ }; //sign:处理负数 unsigned long sign,Num=5678; int count=0; unsigned char DB,X[4]={5,6,7,8}; /*四位要显示的数码:压缩的BCD码表示*/ void main(void) { DB=2; /*小数点位置:0-无小数点,1-末位,4-最高位*/ EA = 1; ET0 = 1; TR0 = 1; TMOD = 0x01; /*50ms定时*/ TH0 = 0x3C; TL0 = 0xB0; while(1) { /* DB=P3&3; 按键控制小数点位置,大家可以自行修改设定*/ if(Num>9999)Num=-50; if(Num<0) { *X=10; sign=-Num; *(X+1)=(sign/100)%10; *(X+2)=(sign/10)%10; *(X+3)=sign%10; } else { *X=(Num/1000)%10; *(X+1)=(Num/100)%10; *(X+2)=(Num/10)%10; *(X+3)=Num%10; } if(*X==0&&DB<4)*X=12; if(*(X+1)==0&&DB<3)*(X+1)=12; if(*(X+2)==0&&DB<2)*(X+1)=12; disp(X,DB); } } void delay(unsigned int c) { unsigned int i,j; for(i=0;i } void disp(unsigned char *x,db) /*本子程序可以做为动态数码管显示的通用程序*/ { DT=~dis[*(x++)]; D1=1; if(db==4)DP=0; delay(1); D1=0; DT=~dis[*(x++)]; D2=1; if(db==3)DP=0; delay(1); D2=0; DT=~dis[*(x++)]; D3=1; if(db==2)DP=0; delay(1); D3=0; DT=~dis[*x]; D4=1; if(db==1)DP=0; delay(1); D4=0; } void lshift(void) { unsigned char temp; temp=*X; *X=*(X+1); *(X+1)=*(X+2); *(X+2)=*(X+3); *(X+3)=temp; } void timerint () interrupt 1 { count++; if(count==10){ count=0; Num++; } TF0 = 0; /*50ms定时*/ TH1=0X3C; TL1=0XB0; TR0 = 1; } |
|
|
|
|
|
en ,谢谢那 |
|
|
|
|
|
main()
{ char i; while(1) { for(i=0;i<100;i++) { P1=0xfe; P0=led[i/10]; delay(); P1=0xfd; P0=led[i%10]; delay(); } } 引脚不同要改 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
506 浏览 0 评论
607 浏览 0 评论
837 浏览 0 评论
832 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
768 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17058 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 07:43 , Processed in 0.913446 second(s), Total 89, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3602