8位数码管显示时间(proteus)

注: 此例程基本完全抄袭博客---利用单片机的数码管模拟时钟的显示时间---

  • 原理图如下:

8位数码管显示时间(proteus)_第1张图片
原理图.png

锁存器使用的74LS373
8位共阴极数码管
时间不太准
代码如下:

#include 
#define SEGPORT P0
//段选和位选引脚,其中段选控制数码管的显示内容,位选控制哪一个数码管亮
sbit seg_select = P2^0;        
sbit bit_select = P2^1;        
//共阴极数码管编码表
unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};               
//位码
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; 
unsigned char TempData[8];
//初始化时间
unsigned char shi = 9, fen = 28, miao = 30;
//显示
void display()
{
      static unsigned char i = 0;
//初始化数码管,让数码管都灭
      SEGPORT = 0x0;
      seg_select = 1;
      seg_select = 0;
      SEGPORT = 0xff;
      bit_select = 1;
      bit_select = 0;
//显示
      SEGPORT = TempData[i];
      seg_select = 1;
      seg_select = 0;
      SEGPORT = weima[i];
      bit_select = 1;
      bit_select = 0;
        i++;
      if(8 == i)//只有8位
        {
                i = 0;
    }  
}
void time0_init(void)//定时器0初始化
{
      EA = 1;                             
      TMOD |= 0x01;                        
//一次定时20ms
      TH0 = (65536 - 20000) / 256;
      TL0 = (65536 - 20000) % 256;        
      ET0 = 1;                    
      TR0 = 1;
}
//定时器0中断
void timer0_isr() interrupt 1
{
      static unsigned char i = 0;
          TH0 = (65536 - 20000) / 256;
      TL0 = (65536 - 20000) % 256;    
      i++;  
        if(50 == i) //1s
        {
                i = 0;
                miao++;
                if(60 == miao)
                {
                        miao = 0;
                        fen++;
                        if(60 == fen)
                        {
                            fen = 0;
                                shi++;
                                if(24 == shi)
                                {
                                        shi = 0;
                                }
                        }
                    }
        }

        TempData[0] = duanma[shi / 10];
        TempData[1] = duanma[shi % 10];
        TempData[2] = 0x40;
        TempData[3] = duanma[fen / 10];
        TempData[4] = duanma[fen % 10];
        TempData[5] = 0x40;
        TempData[6] = duanma[miao / 10];
        TempData[7] = duanma[miao % 10];

}

 
//定时器1初始化
void time1_init(void)
{

          EA = 1;
      TMOD |= 0x10;
      TH1 = (65536 - 20000) / 256;
      TL1 = (65536 - 20000) % 256;
      ET1 = 1;
      TR1 = 1;
}
void time1_isr() interrupt 3
{
          TH1 = (65536 - 1000) / 256;
      TL1 = (65536 - 1000) % 256;     
      display();
} 
void main()

{
     time0_init();
     time1_init();
     while(1)
     {
           }
}

你可能感兴趣的:(8位数码管显示时间(proteus))