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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機TM1637驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:917238 發表于 2021-8-12 16:10 來自觸屏版 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#include<intrins.h>

sbit CLK = P0^0;  //時鐘信號
sbit DIO = P0^1;  //數據/地址數據
                                                                                                                                                                 //共陰極數碼管
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}; //有小數點只用于地址0xc1

unsigned char dpFlag = 0; //控制第二個數碼管的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;

/***********************************************************
*****
***** 主函數
*****
***********************************************************/
void main( void )
{
        timer0_init();
        time_set(5, 0);  //設置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]); //小數點標志為1則用小數點那個數組
        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);  //獲得應答位         
}

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

/********************************************************************
* 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
* 功能 : 固定地址寫數據1byte
* 輸入 : unsigned char addr, unsigned char mData
* 輸出 : 無
**************************************************************/
void TM1637_writeData(unsigned char addr, unsigned char mData)
{
        TM1637_start();
        TM1637_write1Byte(addr);  //地址
        TM1637_write1Byte(mData);  //數據
        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 (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
/*
void Delay_1ms(unsigned int i)//1ms延時
{
    unsigned char x,j;
    for(j=0;j<i;j++)
    for(x=0;x<=148;x++);        
}
*/

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:328014 發表于 2021-8-12 16:17 | 只看該作者
樓主你好,有原理圖嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人网在线播放 | 黄片毛片免费看 | 久久久久久亚洲精品 | 久久av一区二区三区 | 日韩激情网 | 一区精品在线观看 | 中文字幕在线一区 | 国产二区视频 | 中文字幕在线一区二区三区 | 国产在线精品一区二区三区 | 人人种亚洲 | 天天躁日日躁狠狠的躁天龙影院 | 精品毛片 | 成人免费视频网站在线观看 | 国产真实精品久久二三区 | 69堂永久69tangcom | 日韩欧美在线不卡 | 欧美日韩国产在线观看 | 欧美视频免费在线 | 97高清国语自产拍 | 日韩欧美国产一区二区 | 久久国产精品视频观看 | 午夜黄色影院 | 国产在线播 | 精品欧美一区免费观看α√ | 欧美另类视频 | 国产欧美二区 | 美女露尿口视频 | 超碰97人人人人人蜜桃 | 久精品视频 | 成人一区在线观看 | 亚洲国产精品区 | 黄一级| 成人在线视频观看 | 日韩在线资源 | 新疆少妇videos高潮 | 91在线综合 | 中文字幕日韩三级 | 极品久久| 久久久久久免费免费 | 日韩欧美国产一区二区三区 |