阳光豆苗的个人空间 https://bbs.21ic.com/?881050 [收藏] [复制] [RSS]

日志

单片机数码管显示任意2位数

已有 646 次阅读2018-3-26 23:09 |个人分类:单片机数码管|系统分类:单片机

任意两位数,所以必须要用动态显示! 2位数,打开2个位选就行。使用delay很简单,这里使用定时器中断计时,数码管1显示shi,数码管2显示ge,数码管1现实后5ms再显示数码管2.
代码:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char 
  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. uchar temp,ge,shi;
  8. uchar tt;
  9. uchar code table[]={
  10. 0x3f,0x06,0x5b,0x4f,
  11. 0x66,0x6d,0x7d,0x07,
  12. 0x7f,0x6f,0x77,0x7c,
  13. 0x39,0x5e,0x79,0x71,0x00};
  14. void main()
  15. {
  16.         temp=25; //任意2位数
  17.         shi=temp/10;
  18.         ge=temp%10;
  19.         TMOD=0X1;
  20.         TH0=(65536-5000)/256;
  21.         TL0=(65536-5000)%256;
  22.         EA=1;
  23.         ET0=1;
  24.         TR0=1;
  25.         while(1) //因为要用while大循环来显示,所以不可将延时程序写到time0 中断里面。
  26.         {
  27.                 if(tt==1)  //第一个数码管延时
  28.                 {
  29.                         tt=0;
  30.                         dula=1;
  31.                         P0=table[shi];
  32.                         dula=0;
  33.                        
  34.                         wela=1;
  35.                         P0=0xfe;
  36.                         wela=0;
  37.                 }
  38.                
  39.                 if(tt==1) //第二个数码管延时
  40.                 {
  41.                         tt=0;
  42.                         dula=1;
  43.                         P0=table[ge];
  44.                         dula=0;
  45.                        
  46.                         wela=1;
  47.                         P0=0xfd;
  48.                         wela=0;
  49.                 }
  50.         }

  51. }
  52. void time0() interrupt 1
  53. {
  54.         TH0=(65536-50000)/256;
  55.         TL0=(65536-50000)%256;
  56.         tt++;
  57. }
搞定,最后动态显示25.


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 阳光豆苗 2018-3-26 23:13
想了好久才想明白,1、延时必须写在大循环while里;2、数码管1延时后,在数码管2延时,不能一起延时。
当然如果用软件延时就很简单了。但时间不准啊。