欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 怎樣讓單片機數(shù)碼管時分秒顯示小數(shù)點? [打印本頁]

作者: 愛我你會火灬    時間: 2021-7-9 21:39
標題: 怎樣讓單片機數(shù)碼管時分秒顯示小數(shù)點?
#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
沒有電路圖,也不說什么時候顯示小數(shù)點,怎么幫?
作者: 愛我你會火灬    時間: 2021-7-9 23:20
hhdsdy 發(fā)表于 2021-7-9 23:05
沒有電路圖,也不說什么時候顯示小數(shù)點,怎么幫?



作者: 愛我你會火灬    時間: 2021-7-9 23:24
STC官方的呀
STC學習開發(fā)板

作者: wc86110    時間: 2021-7-10 01:16
這類數(shù)碼管第 ③,⑥ 位數(shù)碼管只 G 段顯示代表時鐘的冒號,樓主你看上面的段碼要保留哪個?
作者: Dxiaofeng    時間: 2021-7-10 07:26
這問題簡單,我可以回答,你數(shù)字取模取兩組,一組不帶小數(shù)點的,一組帶小數(shù)點的即可,然后你想要第幾位是小數(shù),哪位就選帶有小數(shù)的字模
作者: yzwzfyz    時間: 2021-7-10 08:24
方法1:小數(shù)點單獨用一個IO控制,且每半秒反轉(zhuǎn)一次。
作者: lishengaha    時間: 2021-7-10 09:23
小數(shù)點是最高位來控制的,所以你用不帶小數(shù)點的段位碼   |上  0x80就是顯示小數(shù)點的段位碼
作者: hhdsdy    時間: 2021-7-10 09:58
lishengaha 發(fā)表于 2021-7-10 09:23
小數(shù)點是最高位來控制的,所以你用不帶小數(shù)點的段位碼   |上  0x80就是顯示小數(shù)點的段位碼

我也經(jīng)常這樣用,不過看樓主的字模,這是共陽接法的,高不亮低亮,只能 &0X7F 了
作者: 愛我你會火灬    時間: 2021-7-10 20:50
yzwzfyz 發(fā)表于 2021-7-10 08:24
方法1:小數(shù)點單獨用一個IO控制,且每半秒反轉(zhuǎn)一次。

我也i是怎樣想的

作者: 愛我你會火灬    時間: 2021-7-10 20:53
上面有代碼

作者: zjf98    時間: 2021-7-11 00:04
需要顯示i小數(shù)點時,把相應(yīng)數(shù)字的字碼取到后,將最高位只零,就是讀到的字碼&9x7f,在發(fā)送到595。
作者: 小楓啊    時間: 2021-7-11 11:43
哪一位數(shù)碼管需要小數(shù)點,直接給它的段選值+0x80就行了
作者: mengsiu    時間: 2021-7-12 23:29
如果讓我來做,我絕對不會用兩只595來做掃描,這樣單片機要不停掃描顯示,很浪費運算資源。
我寧可用8只595,每只595驅(qū)動一個數(shù)碼管,數(shù)碼管靜態(tài)顯示不閃爍,單片機還不用整天掃描。
或者,我會使用一只TM1638,一只芯片可以掃描驅(qū)動最多10位數(shù)碼管,還能同時把按鍵也兼顧到了。
作者: 揪揪    時間: 2021-7-14 20:36
數(shù)碼管程序有段碼和位碼,你給小數(shù)點的段碼正確電平就行了,共陰數(shù)碼管和共陽數(shù)碼管會有點區(qū)分




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1