单片机学习小组
直播中

陈丽

7年用户 1523经验值
私信 关注

基于单片机CT107D的数码管动态显示程序该怎样去编写呢

基于单片机CT107D的数码管动态显示程序该怎样去编写呢?

回帖(1)

刘斯宁

2022-2-23 13:51:24
#include
***it S7 = P3^0;
unsigned char a = 0;  //状态位
bit b = 1;      
unsigned char count = 0;
unsigned char month = 1;
unsigned char code SEG_code[19] =
        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
         0xbf,0x7f,0xff};                     //定义共阳数码管段码内容:0~F,—,.            

void Delay(unsigned int t)
{
        while(t--);
}

//void delay_m(unsigned int n)   //延时n秒
//{
//    unsigned int i=0,j=0;
//    for(i=0;i
//        for(j=0;j<21738;j++);
//}

void Select_HC138(unsigned char n)
{
        switch(n)
        {
                case 5:
                        P2 = (P2 & 0x1f) | 0xa0;
                        break;
                case 6:
                        P2 = (P2 & 0x1f) | 0xc0;
                        break;
                case 7:
                        P2 = (P2 & 0x1f) | 0xe0;
                        break;
        }
}

void Show_tube(unsigned char position,unsigned char value)
{
        Select_HC138(6);
        P0 = 0x01 << position;
        Select_HC138(7);
        P0 = value;
}

void Dynamic_display()
{
        if((a == 1)&&(b == 1))
        {
                Show_tube(0,SEG_code[18]);
                Show_tube(1,SEG_code[18]);
        }
        else
        {
                Show_tube(0,SEG_code[2]);
                Delay(500);
                Show_tube(1,SEG_code[3]);
                Delay(500);
        }

        Show_tube(2,SEG_code[16]);
        Delay(500);
      
        if((a == 2)&&(b == 1))
        {
                Show_tube(3,SEG_code[18]);
                Show_tube(4,SEG_code[18]);
        }
        else
        {
                Show_tube(3,SEG_code[5]);
                Delay(500);
                Show_tube(4,SEG_code[9]);
                Delay(500);
        }

        Show_tube(5,SEG_code[16]);
        Delay(500);

        if((a == 3)&&(b == 1))
        {
                Show_tube(6,SEG_code[18]);
                Show_tube(7,SEG_code[18]);
        }
        else
        {
                Show_tube(6,SEG_code[5]);
                Delay(500);
                Show_tube(7,SEG_code[0]);
                Delay(500);
        }
}

//void Delay_dynamic(unsigned char t)            //延时,让最后两位数码管的值发生变化(从1变到12)
//{
//        while(t--)
//        {
//                Dynamic_display();
//        }
//}

void Init_timer0()      //定时器0初始化(中断初始化)
{
        TMOD = 0x01;                  //选择定时器0(16位定时器),定时50ms(间隔50000个脉冲)
    TH0 = (65535 - 50000) / 256;  //取高八位(3c)给TH0寄存器
        TL0 = (65535 - 50000) % 256;  //取低八位(af)给TL0寄存器

        EA = 1;              //打开总中断
        ET0 = 1;          //打开定时器0的中断
        TR0 = 0;           //关闭定时器
}

void Service_timer0() interrupt 1   //定时器0中断服务函数
{
        TH0 = (65535 - 50000) / 256;
        TL0 = (65535 - 50000) % 256;    //一次计时完后需要给TH0和TL0赋初值
        count++;
        if(count == 10)      //定时0.5s(间隔1s)
        {
                b = ~b;                  
                count = 0;
        }
}

void Delay_keys()
{
        unsigned char i,j;
        i = 108;
        j = 145;
        do
        {
                while(--j);
        }while(--i);
}

void Press_keys()
{
        if(S7 == 0)
        {      
                Delay_keys();
                if(S7 == 0)
                {
                        switch(a)
                        {
                                case 0:
                                        a = 1;
                                        TR0 = 1;
                                        break;
                                case 1:
                                        a = 2;
                                        break;
                                case 2:
                                        a = 3;
                                        break;
                                case 3:
                                        a = 0;
                                        TR0 = 0;
                                        break;
                        }
                        while(S7 == 0)
                        {
                                Dynamic_display();
                        }
                }
        }
}
               
void main()
{
        Init_timer0();
        Select_HC138(5);
        P0 = 0x00;
        while(1)
        {
                //Dynamic_display();
//                if(month > 12)
//                {
//                        month = 1;
//                }      
//                Delay_dynamic(200);
//                month++;
                Dynamic_display();
                Press_keys();
        }
}
举报

更多回帖

×
20
完善资料,
赚取积分