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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5903|回復: 14
打印 上一主題 下一主題
收起左側

怎樣讓單片機數碼管時分秒顯示小數點?

[復制鏈接]
跳轉到指定樓層
樓主
#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


}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:88256 發表于 2021-7-9 23:05 | 只看該作者
沒有電路圖,也不說什么時候顯示小數點,怎么幫?
回復

使用道具 舉報

板凳
ID:951344 發表于 2021-7-9 23:20 | 只看該作者
hhdsdy 發表于 2021-7-9 23:05
沒有電路圖,也不說什么時候顯示小數點,怎么幫?


回復

使用道具 舉報

地板
ID:951344 發表于 2021-7-9 23:24 | 只看該作者
STC官方的呀
STC學習開發板
回復

使用道具 舉報

5#
ID:96682 發表于 2021-7-10 01:16 來自觸屏版 | 只看該作者
這類數碼管第 ③,⑥ 位數碼管只 G 段顯示代表時鐘的冒號,樓主你看上面的段碼要保留哪個?
回復

使用道具 舉報

6#
ID:942056 發表于 2021-7-10 07:26 來自觸屏版 | 只看該作者
這問題簡單,我可以回答,你數字取模取兩組,一組不帶小數點的,一組帶小數點的即可,然后你想要第幾位是小數,哪位就選帶有小數的字模
回復

使用道具 舉報

7#
ID:123289 發表于 2021-7-10 08:24 | 只看該作者
方法1:小數點單獨用一個IO控制,且每半秒反轉一次。
回復

使用道具 舉報

8#
ID:939710 發表于 2021-7-10 09:23 | 只看該作者
小數點是最高位來控制的,所以你用不帶小數點的段位碼   |上  0x80就是顯示小數點的段位碼
回復

使用道具 舉報

9#
ID:88256 發表于 2021-7-10 09:58 | 只看該作者
lishengaha 發表于 2021-7-10 09:23
小數點是最高位來控制的,所以你用不帶小數點的段位碼   |上  0x80就是顯示小數點的段位碼

我也經常這樣用,不過看樓主的字模,這是共陽接法的,高不亮低亮,只能 &0X7F 了
回復

使用道具 舉報

10#
ID:951344 發表于 2021-7-10 20:50 | 只看該作者
yzwzfyz 發表于 2021-7-10 08:24
方法1:小數點單獨用一個IO控制,且每半秒反轉一次。

我也i是怎樣想的
回復

使用道具 舉報

11#
ID:951344 發表于 2021-7-10 20:53 | 只看該作者
上面有代碼
回復

使用道具 舉報

12#
ID:473244 發表于 2021-7-11 00:04 | 只看該作者
需要顯示i小數點時,把相應數字的字碼取到后,將最高位只零,就是讀到的字碼&9x7f,在發送到595。
回復

使用道具 舉報

13#
ID:486153 發表于 2021-7-11 11:43 | 只看該作者
哪一位數碼管需要小數點,直接給它的段選值+0x80就行了
回復

使用道具 舉報

14#
ID:16255 發表于 2021-7-12 23:29 | 只看該作者
如果讓我來做,我絕對不會用兩只595來做掃描,這樣單片機要不停掃描顯示,很浪費運算資源。
我寧可用8只595,每只595驅動一個數碼管,數碼管靜態顯示不閃爍,單片機還不用整天掃描。
或者,我會使用一只TM1638,一只芯片可以掃描驅動最多10位數碼管,還能同時把按鍵也兼顧到了。
回復

使用道具 舉報

15#
ID:952985 發表于 2021-7-14 20:36 | 只看該作者
數碼管程序有段碼和位碼,你給小數點的段碼正確電平就行了,共陰數碼管和共陽數碼管會有點區分
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表