久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2458|回復(fù): 1
收起左側(cè)

51單片機(jī)TM1637驅(qū)動程序

[復(fù)制鏈接]
ID:917238 發(fā)表于 2021-8-12 16:10 來自手機(jī) | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include<intrins.h>

sbit CLK = P0^0;  //時鐘信號
sbit DIO = P0^1;  //數(shù)據(jù)/地址數(shù)據(jù)
                                                                                                                                                                 //共陰極數(shù)碼管
unsigned char code SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
unsigned char code SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數(shù)點只用于地址0xc1

unsigned char dpFlag = 0; //控制第二個數(shù)碼管的dp的顯示

void TM1637_start( void );
void TM1637_stop( void );
void TM1637_write1Bit(unsigned char mBit);
void TM1637_write1Byte(unsigned char mByte);
void TM1637_writeCammand(unsigned char mData);
void TM1637_writeData(unsigned char addr, unsigned char mData);
void time_set(char hour, char min);
void time_judge( void );
void time_display( void );
void timer0_init( void );

void delay_140us( void );
void delay_1ms(unsigned int i);

unsigned int countTime = 0;
unsigned char time, sec;
struct {
        char shi;
        char ge;
}Hour;

struct {
        char shi;
        char ge;
}Min;

/***********************************************************
*****
***** 主函數(shù)
*****
***********************************************************/
void main( void )
{
        timer0_init();
        time_set(5, 0);  //設(shè)置5小時倒計時
        while(1)
        {
                time_display();         //顯示時間
                if(countTime <= 10)
                {
                        dpFlag = 0;                        
                }
                else
                if(countTime <= 20)
                {
                        dpFlag = 1;        
                }
                else
                {
                        countTime = 0;
                        time_judge();
                }
        }
}

void time_set(char hour, char min)
{
        if((hour < 0) || (min<0))
        {
                hour = 0;
                min = 0;
        }
        Hour.shi = hour/10;
        Hour.ge = hour%10;
        Min.shi = min/10;
        Min.ge = min%10;               
}

/*************************************************************
* 名稱 : time_judge( void )
* 功能 : 判斷時間變化
* 輸入 : void
* 輸出 : 無
**************************************************************/
void time_judge( void )
{
        if(++sec == 60)           //60秒
        {        
                sec = 0;
                if((Hour.shi || Hour.ge || Min.shi || Min.ge) && (--Min.ge <= -1))
                {
                        Min.ge = 9;
                        if((Hour.shi) ||(Hour.ge) && (--Min.shi <= -1))
                        {
                                Min.shi = 5;
                                if(Hour.shi && (--Hour.ge <= -1))
                                {
                                        Hour.ge = 9;
                                        if(--Hour.shi <= -1)
                                        {
                                                Hour.shi = 0;        
                                        }
                                }
                                else
                                if((!Hour.shi) && (--Hour.ge <= -1))
                                {
                                        Hour.ge = 0;
                                }
                        }
                        else
                        if((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1))
                        {
                                Min.shi = 0;
                        }
                }
                else
                if(((!Hour.shi) && (!Hour.ge) && (!Min.shi) ) && (Min.ge <= -1))
                {
                        Min.ge = 0;
                }
        }        
}
  /*******************************************************************
* 名稱 : void time_display( void )
* 功能 : 顯示時間
* 輸入 : void
* 輸出 : 無
**************************************************************/
void time_display( void )
{
        TM1637_writeCammand(0x44);
        TM1637_writeData(0xc0, SEGData[Hour.shi]);
        if(dpFlag)
                TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小數(shù)點標(biāo)志為1則用小數(shù)點那個數(shù)組
        else
                TM1637_writeData(0xc1, SEGData[Hour.ge]);
        TM1637_writeData(0xc2, SEGData[Min.shi]);
        TM1637_writeData(0xc3, SEGData[Min.ge]);
        TM1637_writeCammand(0x8a);                                
}

/********************************************************************
* 名稱 : void TM1637_start( void )
* 功能 : start信號
* 輸入 : void
* 輸出 : 無
**************************************************************/
void TM1637_start( void )
{
        CLK = 1;
        DIO = 1;
        delay_140us();
        DIO = 0;
        delay_140us();
        CLK = 0;
        delay_140us();
}

/********************************************************************
* 名稱 : void TM1637_stop( void )
* 功能 : stop信號
* 輸入 : void
* 輸出 : 無
**************************************************************/
void TM1637_stop( void )
{
        CLK = 0;
        delay_140us();
        DIO = 0;
        delay_140us();
        CLK = 1;
        delay_140us();
        DIO = 1;
        delay_140us();
}

void TM1637_write1Bit(unsigned char mBit )
{
        CLK = 0;
        delay_140us();
        if(mBit)
                DIO = 1;
        else
                DIO = 0;
        delay_140us();        
        CLK        = 1;
        delay_140us();
}

/********************************************************************
* 名稱 : void TM1637_write1Byte(unsigned char mByte)
* 功能 : 寫1byte
* 輸入 : unsigned char mByte
* 輸出 : 無
**************************************************************/
void TM1637_write1Byte(unsigned char mByte)
{
        char loop = 0;
        for(loop = 0; loop < 8; loop++)
        {
                TM1637_write1Bit((mByte>>loop)&0x01); //取得最低位        
        }
        CLK = 0;
        delay_140us();
        DIO = 1;
        delay_140us();
        CLK = 1;
        delay_140us();
        while(DIO == 1);  //獲得應(yīng)答位         
}

/********************************************************************
* 名稱 : void TM1637_writeCammand(unsigned char mData)
* 功能 : 寫指令1byte
* 輸入 : unsigned char mData
* 輸出 : 無
**************************************************************/
void TM1637_writeCammand(unsigned char mData)
{
        TM1637_start();
        TM1637_write1Byte(mData);  //數(shù)據(jù)
        TM1637_stop();        
}

/********************************************************************
* 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
* 功能 : 固定地址寫數(shù)據(jù)1byte
* 輸入 : unsigned char addr, unsigned char mData
* 輸出 : 無
**************************************************************/
void TM1637_writeData(unsigned char addr, unsigned char mData)
{
        TM1637_start();
        TM1637_write1Byte(addr);  //地址
        TM1637_write1Byte(mData);  //數(shù)據(jù)
        TM1637_stop();        
}


void timer0_init( void )
{
        TMOD=0X01;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;        
}              


/********************************************************************
* 名稱 :
* 功能 : 定時50ms,實際運行中由于指令運行造成的延時,實際時間肯定大于50ms
* 輸入 : 無
* 輸出 : 無
**************************************************************/
void timer0_isr() interrupt 1
{
        TH0=(65535-50000)/256;  //50ms
        TL0=(65535-50000)%256;        //
        countTime++;
}


/********************************************************************
* 名稱 : Delay_1ms(unsigned int i)
* 功能 : 延時子程序,延時時間為 140us
* 輸入 :
* 輸出 : 無
**************************************************************/
void delay_140us( void )
{
    int i;
    for(i=0; i<20; i++)
      _nop_();
}

/********************************************************************
* 名稱 : Delay_1ms(unsigned int i)
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數(shù))
* 輸出 : 無
***********************************************************************/
/*
void Delay_1ms(unsigned int i)//1ms延時
{
    unsigned char x,j;
    for(j=0;j<i;j++)
    for(x=0;x<=148;x++);        
}
*/

評分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:328014 發(fā)表于 2021-8-12 16:17 | 顯示全部樓層
樓主你好,有原理圖嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天插天天搞 | 国产精品久久久久久久久免费丝袜 | 亚洲精品久久久一区二区三区 | 色综合久| 色综合一区二区 | 鸳鸯谱在线观看高清 | 免费人成在线观看网站 | 欧美一区二区三区四区五区无卡码 | 日本久久精品视频 | 麻豆国产一区二区三区四区 | 五月网婷婷 | 午夜成人免费视频 | 亚洲视频免费 | 欧美日韩国产一区二区三区 | 成av在线 | 欧美在线视频一区二区 | 老司机狠狠爱 | 欧美日韩精品一区二区三区视频 | 亚洲国产精品va在线看黑人 | 久久久91 | 9久久婷婷国产综合精品性色 | 久久综合伊人 | 二区久久 | 久久久精彩视频 | 亚洲综合日韩精品欧美综合区 | 狠狠入ady亚洲精品经典电影 | 美女视频一区二区 | 日韩一二三区 | 国产精品一区二区三区在线 | 在线毛片网 | 日韩av黄色 | 毛片一区 | 国产视频在线观看一区二区三区 | 狠狠色综合网站久久久久久久 | 亚洲国产一区二区三区在线观看 | 黄a网站| 久久国产精彩视频 | 色欧美片视频在线观看 | 久草网免费| 久久久久国产精品一区三寸 | 91 视频网站|