标题: 怎样让单片机数码管时分秒显示小数点? [打印本页]

作者: 爱我你会火灬    时间: 2021-7-9 21:39
标题: 怎样让单片机数码管时分秒显示小数点?
#define         MAIN_Fosc                30000000L        //
#include        <STC15Fxxxx.H>
#define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer


/*****************************************************************************/

#define DIS_DOT          0x80        
#define DIS_BLACK        0x10
#define DIS_                0x11


/*************        **************/


unsigned char code t_display[]={                                       
//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,//0-F
//black          -    H    J           K          L           N          o    P          U    t    G    Q    r    M    y
        0xFF,0xBF,0x89,0xF1,0x8F,0xC7,0xAB,0xA3,0x8C,0xC1,0x87,0xC2,0x98,0xAF,0xC8,0x91,//10-1F
//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F        
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,        
//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F        
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F        
        0x40,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};        //20-2F


unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0XBF};
        
/*************        **************/


sbit        P_HC595_SER   = P2^2;        //pin 14        SER                data input
sbit        P_HC595_RCLK  = P2^3;        //pin 12        RCLk        store (latch) clock
sbit        P_HC595_SRCLK = P2^4;        //pin 11        SRCLK        Shift data clock


/*************        **************/


unsigned char         LED8[8];        
unsigned char        display_index;
bit        B_1ms;               
unsigned char        KeyCode;
unsigned char        cnt10ms;
unsigned char IO_KeyState, IO_KeyState1, IO_KeyHoldCnt;
unsigned char        cnt50ms;
unsigned char        hour,minute,second;
unsigned int        msecond;


/*************        **************/


void        DisplayRTC(void)
{
         
    if(hour >= 10) LED8[0] = hour / 10;
    else            LED8[0] = DIS_BLACK;
    LED8[1] = hour % 10;
    LED8[2] = minute / 10 ;
    LED8[3] = minute % 10;
                LED8[4] = second / 10;
    LED8[5] = second % 10;
    if(msecond >= 500)   LED8[1] &= DIS_DOT;/
               
}


/********************* ************************/
void        RTC(void)
{
        if(++second >= 60)
        {
                second = 0;
                if(++minute >= 60)
                {
                        minute = 0;
                        if(++hour >= 24)        hour = 0;
                }
        }
}


void        IO_KeyScan(void);


/**********************  ************************/
void main(void)
{
        unsigned char        i,k;
        
        P0M1 = 0;        P0M0 = 0;
        P1M1 = 0;        P1M0 = 0;
        P2M1 = 0;        P2M0 = 0;
        P3M1 = 0;        P3M0 = 0;
        P4M1 = 0;        P4M0 = 0;
        P5M1 = 0;        P5M0 = 0;
        P6M1 = 0;        P6M0 = 0;
        P7M1 = 0;        P7M0 = 0;


        AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
        TH0 = (unsigned char)(Timer0_Reload / 256);
        TL0 = (unsigned char)(Timer0_Reload % 256);
        ET0 = 1;        //Timer0 interrupt enable
        TR0 = 1;        //Tiner0 run
        EA = 1;                //
        
        display_index = 0;
        RTC();
        DisplayRTC();
        
        for(i=0; i<8; i++)        LED8[ i] = DIS_BLACK;[ i]
        for(i=0; i<8; i++)        LED8[ i] = i;[ i]
        
        k = 0;
        LED8[6] = 0;
        LED8[7] = 0;
        hour   = 12;
        minute = 0;
        second = 0;




        KeyCode = 0;
        cnt10ms = 0;


        IO_KeyState = 0;
        IO_KeyState1 = 0;
        IO_KeyHoldCnt = 0;
        cnt50ms = 0;


        while(1)
        {
                if(B_1ms)        //1msμ?
                {
                        B_1ms = 0;
                        if(++msecond >= 1000)        //1??μ?
                        {
                                msecond = 0;
                                RTC();
                                DisplayRTC();
                        }
                        
                        
           if(msecond >= 500)   LED8[1] &= DIS_DOT;//D?ê±oóμ?D?êyμ?×???éá
               
                        
                if(++cnt50ms >= 50)                //50msé¨?èò?′?DDáD?ü?ì
                {
                        cnt50ms = 0;
                        IO_KeyScan();
                }
               
               
                if(KeyCode > 0)                //óD?ü°′??
                {
                        LED8[6] = KeyCode / 10;        //??ê??ü??
                        LED8[7] = KeyCode % 10;        //??ê??ü??


                        if(KeyCode == 1)        //hour +1
                        {
                                if(++hour >= 24)        hour = 0;
                                DisplayRTC();
                        }
                        if(KeyCode == 2)        //hour -1
                        {
                                if(--hour >= 24)        hour = 23;
                                DisplayRTC();
                        }
                        if(KeyCode == 3)        //minute +1
                        {
                                second = 0;
                                if(++minute >= 60)        minute = 0;
                                DisplayRTC();
                        }
                        if(KeyCode == 4)        //minute -1
                        {
                                second = 0;
                                if(--minute >= 60)        minute = 59;
                                DisplayRTC();
                        }


                        KeyCode = 0;
                }


                }
        }
}
/**********************************************/
/*****************************************************




                                                                                                                        
   Y     P04      P05      P06      P07
          |        |        |        |
X         |        |        |        |
P00 ---- K00 ---- K01 ---- K02 ---- K03 ----        0
          |        |        |        |
P01 ---- K04 ---- K05 ---- K06 ---- K07 ----        0
          |        |        |        |
P02 ---- K08 ---- K09 ---- K10 ---- K11 ----        0
          |        |        |        |
P03 ---- K12 ---- K13 ---- K14 ---- K15 ----        0
          |        |        |        |
******************************************************/




unsigned char code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};


void IO_KeyDelay(void)
{
        unsigned char i;
        i = 60;
        while(--i)        ;
}


void        IO_KeyScan(void)
{
        unsigned char        j;
        j = IO_KeyState1;


        P0 = 0xf0;
        IO_KeyDelay();
        IO_KeyState1 = P0 & 0xf0;


        P0 = 0x0f;
        IO_KeyDelay();
        IO_KeyState1 |= (P0 & 0x0f);
        IO_KeyState1 ^= 0xff;
        
        if(j == IO_KeyState1)
        {
                j = IO_KeyState;
                IO_KeyState = IO_KeyState1;
                if(IO_KeyState != 0)
                {
                        F0 = 0;
                        if(j == 0)        F0 = 1;
                        else if(j == IO_KeyState)
                        {
                                if(++IO_KeyHoldCnt >= 20)
                                {
                                        IO_KeyHoldCnt = 18;
                                        F0 = 1;
                                }
                        }
                        if(F0)
                        {
                            j = T_KeyTable[IO_KeyState >> 4];
                            if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
                            KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f];
                        }
                }
                else        IO_KeyHoldCnt = 0;
        }
        P0 = 0xff;
}


/****************    ******************/
void Send_595(unsigned char dat)
{               
        unsigned char        i;
        for(i=0; i<8; i++)
        {
                dat <<= 1;
                P_HC595_SER   = CY;
                P_HC595_SRCLK = 1;
                P_HC595_SRCLK = 0;
               
        }
}


/*********************  ***********************/
void DisplayScan(void)
{        
        Send_595(T_COM[display_index]);                                /
        Send_595(t_display[LED8[display_index]]);        /


        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        
        if(++display_index >= 8)        display_index = 0;        /
        
}




/********************** Timer0 1m ************************/
void timer0 (void) interrupt 1
{
        DisplayScan();        //1m
        B_1ms = 1;        //1m


}


作者: hhdsdy    时间: 2021-7-9 23:05
没有电路图,也不说什么时候显示小数点,怎么帮?
作者: 爱我你会火灬    时间: 2021-7-9 23:20
hhdsdy 发表于 2021-7-9 23:05
没有电路图,也不说什么时候显示小数点,怎么帮?



作者: 爱我你会火灬    时间: 2021-7-9 23:24
STC官方的呀
STC学习开发板

作者: wc86110    时间: 2021-7-10 01:16
这类数码管第 ③,⑥ 位数码管只 G 段显示代表时钟的冒号,楼主你看上面的段码要保留哪个?
作者: Dxiaofeng    时间: 2021-7-10 07:26
这问题简单,我可以回答,你数字取模取两组,一组不带小数点的,一组带小数点的即可,然后你想要第几位是小数,哪位就选带有小数的字模
作者: yzwzfyz    时间: 2021-7-10 08:24
方法1:小数点单独用一个IO控制,且每半秒反转一次。
作者: lishengaha    时间: 2021-7-10 09:23
小数点是最高位来控制的,所以你用不带小数点的段位码   |上  0x80就是显示小数点的段位码
作者: hhdsdy    时间: 2021-7-10 09:58
lishengaha 发表于 2021-7-10 09:23
小数点是最高位来控制的,所以你用不带小数点的段位码   |上  0x80就是显示小数点的段位码

我也经常这样用,不过看楼主的字模,这是共阳接法的,高不亮低亮,只能 &0X7F 了
作者: 爱我你会火灬    时间: 2021-7-10 20:50
yzwzfyz 发表于 2021-7-10 08:24
方法1:小数点单独用一个IO控制,且每半秒反转一次。

我也i是怎样想的

作者: 爱我你会火灬    时间: 2021-7-10 20:53
上面有代码

作者: zjf98    时间: 2021-7-11 00:04
需要显示i小数点时,把相应数字的字码取到后,将最高位只零,就是读到的字码&9x7f,在发送到595。
作者: 小枫啊    时间: 2021-7-11 11:43
哪一位数码管需要小数点,直接给它的段选值+0x80就行了
作者: mengsiu    时间: 2021-7-12 23:29
如果让我来做,我绝对不会用两只595来做扫描,这样单片机要不停扫描显示,很浪费运算资源。
我宁可用8只595,每只595驱动一个数码管,数码管静态显示不闪烁,单片机还不用整天扫描。
或者,我会使用一只TM1638,一只芯片可以扫描驱动最多10位数码管,还能同时把按键也兼顾到了。
作者: 揪揪    时间: 2021-7-14 20:36
数码管程序有段码和位码,你给小数点的段码正确电平就行了,共阴数码管和共阳数码管会有点区分




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1