微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > |数码管显示时钟

|数码管显示时钟

时间:10-02 整理:3721RD 点击:
用动态扫描方法和定时器0在数码管的后五位显示出秒表,精确到1%秒,即最后一位显示1%秒,一直循环下去
数码管显示为    ×××:××   。
我的代码如下://程序运行的结果是数码管压根不亮……求大神指教[抱拳]
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;                                      //138译码器,用于控制数码管位选
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                           0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                           0x39,0x5e,0x79,0x71};
u8 b,s,g,sf,bf,tempt,x;
void initial();                                                        //初始化子函数
void delay(u16 a);                                                //延时子函数
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf);             //显示子函数
void main()
{
        initial();
        while(1)
        {
                if(x==10)                                          //x在定时器中,每1ms++
                {
                        tempt++;
                        if(tempt==100000)                 //加到五位数则tempt清零
                                tempt=0;
                        b=tempt/10000;                     //b即百,即×××:××中第一位,b××:××
                        s=tempt%10000/1000;           //s即十,即×××:××中第一位,×s×:××
                        g=tempt%1000/100;              //以此类推
                        sf=tempt%100/10;
                        bf=tempt%10;
                        display(b,s,g,sf,bf);
                }                       
        }
       
}
void delay(u16 a)
{
        while(a--);       
}
void initial()
{
        tempt=0;
        b=0;
        s=0;
        g=0;
        bf=0;
        sf=0;
        TMOD|=0x01;                                                //TMOD=TMOD|0x01
        //TH0=(65535-10000)/256;
        //TL0=(65535-10000)%256;
        TH0=0xfc;
        TL0=0x18;                                                     //初值使定时器显示1ms
        EA=1;
        ET0=1;
        TR0=1;
}
void display(u8 b,u8 s,u8 g,u8 sf,u8 bf)
{
        u8 i;
        for(i=0;i<5;i++)
        {
                switch(i)
                {
                        case 0:
                                LSA=0;LSB=0;LSC=0; break;              //LSA,LSB,LSC为138译码器的三个输入端
                                P0=smgduan[bf];                          //LSA=0;LSB=0;LSC=0位选第一个数码管
                                delay(50);
                        case 1:
                                LSA=1;LSB=0;LSC=0; break;
                                P0=smgduan[sf];
                                delay(50);               
                        case 2:
                                LSA=0;LSB=1;LSC=0; break;
                                P0=smgduan[g];
                            delay(50);
                        case 3:
                                LSA=1;LSB=1;LSC=0; break;
                                P0=smgduan[s];
                                delay(50);
                        case 4:
                                LSA=0;LSB=0;LSC=1; break;
                                P0=smgduan[b];
                                delay(50);
                        }
                        delay(50);
                        P0=0x00;                                                //消影
                }       
}
void timer0() interrupt 1                                             //定时器0
{
        //TH0=(65535-10000)/256;
        //TL0=(65535-10000)%256;
        TH0=0xfc;
        TL0=0x18;   
        x++;       
}

看看位选断码对不对

是不是共阴或共阳数码管选错了

位选使用三输入八输出的138译码器,段选使用数码管表,好像不存在共阴和共阳的选择问题?

段选码表我校对一下是对的,位选使用138译码器,也是对的,就是不知道问题出在哪里?

段选码表我校对一下是对的,位选使用138译码器,也是对的,就是不知道问题出在哪里?

看看最小系统的复位电路和时钟电路

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top