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

標題: 51單片機TM1637驅動程序 [打印本頁]

作者: a18075128066    時間: 2021-8-12 16:10
標題: 51單片機TM1637驅動程序
#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++);        
}
*/

作者: 51hei團團    時間: 2021-8-12 16:17
樓主你好,有原理圖嗎?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲国产一区二区三区在线观看 | 国产精品日日摸夜夜添夜夜av | www.一区二区三区 | 99影视| 少妇精品久久久久久久久久 | 午夜精品久久久久久久星辰影院 | 国产精品夜间视频香蕉 | 午夜三级网站 | 日日操操 | 免费国产视频 | 日韩精品免费一区二区在线观看 | 国产视频黄色 | 欧美专区在线 | 影音先锋男 | 99re超碰| 亚洲欧美一区二区三区国产精品 | 久久久久久久久久久91 | 久久久妇女国产精品影视 | 国产精品区二区三区日本 | 精品少妇一区二区三区日产乱码 | 久久av资源网 | 国产色网站| 美女视频黄色的 | 国产在线精品一区二区三区 | 亚洲综合二区 | 国家一级黄色片 | 日韩一区二区福利视频 | 亚州一区二区三区 | 啪啪免费网站 | 亚洲成人免费视频 | 国产三级| 国产精品mv在线观看 | 国产欧美精品一区二区色综合 | 欧美激情a∨在线视频播放 成人免费共享视频 | 亚洲国产精品一区二区三区 | 欧美日韩一区二区视频在线观看 | 午夜精品久久久 | 欧美激情国产日韩精品一区18 | 成年免费大片黄在线观看一级 | 午夜精品久久久 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 |