找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5141|回复: 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 单片机教程网

快速回复 返回顶部 返回列表