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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5994|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)實(shí)現(xiàn) lcd1602時(shí)間顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:433198 發(fā)表于 2018-11-26 09:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
主函數(shù)
#include<reg52.h>

#include<lcd.h>
#include<ds1302.h>

void LcdDisplay();

void main()
{
    LcdInit();                                                                   //lcd初始化
        Ds1302Init();                                                           //Ds1302初始化                 
    while(1)
    {
           Ds1302ReadTime();
       LcdDisplay();
    }                                                           //lcd顯示
}

void LcdDisplay()
{
        LcdWriteCom(0x80);                                                        //第一行
        LcdWriteData('2');
        LcdWriteData('0');
        LcdWriteData('0'+TIME[6]/16);                            
        LcdWriteData('0'+(TIME[6]&0x0f));                        //年
        LcdWriteData('-');
        LcdWriteData('0'+TIME[4]/16);                    
        LcdWriteData('0'+(TIME[4]&0x0f));                        //月
        LcdWriteData('-');
        LcdWriteData('0'+TIME[3]/16);                            
        LcdWriteData('0'+(TIME[3]&0x0f));                        //日                                       

        LcdWriteCom(0x80+0x40);                                                //第二行
        LcdWriteData('0'+TIME[2]/16);
        LcdWriteData('0'+(TIME[2]&0x0f));                        //時(shí)         
        LcdWriteData('-');
        LcdWriteData('0'+TIME[1]/16);                               
        LcdWriteData('0'+(TIME[1]&0x0f));                         //分
        LcdWriteData('-');
        LcdWriteData('0'+TIME[0]/16);                       
        LcdWriteData('0'+(TIME[0]&0x0f));                         //秒
        LcdWriteData(' ');
        LcdWriteData(' ');
}

lcd.c

#include<lcd.h>

void Lcd1602_Delay1ms(uint c)   //延時(shí)函數(shù)
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

#ifndef         LCD1602_4PINS                 //當(dāng)沒(méi)有定義這個(gè)LCD1602_4PINS的時(shí)候
void LcdWriteCom(uchar com)                 //寫(xiě)入命令
{
        LCD1602_E = 0;                  //使能
        LCD1602_RS = 0;                        //選擇發(fā)送命令
        LCD1602_RW = 0;                        //選擇寫(xiě)入
                                          
        LCD1602_DATAPINS = com;         //發(fā)送命令
        Lcd1602_Delay1ms(1);                    //等待數(shù)據(jù)穩(wěn)定
                                                          
        LCD1602_E = 1;                        //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);                //保持時(shí)間
        LCD1602_E = 0;
}
#else                                                   
void LcdWriteCom(uchar com)                //寫(xiě)入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫(xiě)入命令
        LCD1602_RW = 0;         //選擇寫(xiě)入

        LCD1602_DATAPINS = com;                 //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;                        //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4;    //發(fā)送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;                        //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //寫(xiě)入數(shù)據(jù)
{
        LCD1602_E = 0;                            //使能清零
        LCD1602_RS = 1;                            //選擇輸入數(shù)據(jù)
        LCD1602_RW = 0;                            //選擇寫(xiě)入
                                                                          
        LCD1602_DATAPINS = dat;             //寫(xiě)入數(shù)據(jù)
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;                      //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);                //保持時(shí)間
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //寫(xiě)入數(shù)據(jù)
{
        LCD1602_E = 0;                            //使能清零
        LCD1602_RS = 1;                            //選擇寫(xiě)入數(shù)據(jù)
        LCD1602_RW = 0;                            //選擇寫(xiě)入

        LCD1602_DATAPINS = dat;                 //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;                            //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4;        //寫(xiě)入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;                           //寫(xiě)入時(shí)序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
                  
#ifndef                LCD1602_4PINS
void LcdInit()                                   //LCD初始化子程序
{
        LcdWriteCom(0x38);                 //開(kāi)顯示
        LcdWriteCom(0x0c);                 //開(kāi)顯示不顯示光標(biāo)
        LcdWriteCom(0x06);                 //寫(xiě)一個(gè)指針加1
        LcdWriteCom(0x01);                 //清屏
        LcdWriteCom(0x80);                 //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);                      //將8位總線轉(zhuǎn)為4位總線
        LcdWriteCom(0x28);                      //在四位線下的初始化
        LcdWriteCom(0x0c);                //開(kāi)顯示不顯示光標(biāo)
        LcdWriteCom(0x06);                //寫(xiě)一個(gè)指針加1
        LcdWriteCom(0x01);                //清屏
        LcdWriteCom(0x80);                //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#endif


lcd.h
#ifndef __LCD_H_
#define __LCD_H_

//#define LCD1602_4PINS

#include<reg52.h>

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

#define LCD1602_DATAPINS P0

sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;


void Lcd1602_Delay1ms(uint c);    /*在51單片機(jī)12MHZ時(shí)鐘下的延時(shí)函數(shù)*/

void LcdWriteCom(uchar com);      /*LCD1602寫(xiě)入8位命令子函數(shù)*/
       
void LcdWriteData(uchar dat);     /*LCD1602寫(xiě)入8位數(shù)據(jù)子函數(shù)*/
               
void LcdInit();                                          /*LCD1602初始化子程序*/          

#endif


ds1302.c
#include<ds1302.h>

uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};           //DS1302寫(xiě)入和讀取時(shí)分秒的地址命令
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};          //秒分時(shí)日月周年 最低位讀寫(xiě)位

uchar TIME[7] = {0, 0, 0x12, 0x24, 0x11, 0x02, 0x18};                                                  //DS1302時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒

void Ds1302Write(uchar addr, uchar dat)
{
        uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;                            //先將SCLK置低電平                                    
        _nop_();                                                  
        RST = 1;                                                            //然后將RST(CE)置高電平                                                       
        _nop_();

        for (n=0; n<8; n++)                                        //開(kāi)始傳送八位地址命令                                                                     
        {
                DSIO = addr & 0x01;              //數(shù)據(jù)從低位開(kāi)始傳送                                    
                addr >>= 1;
                SCLK = 1;                        //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)                                    
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)                  //寫(xiě)入8位數(shù)據(jù)                                    
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;                       //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)                                      
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;                           //傳送數(shù)據(jù)結(jié)束                                       
        _nop_();
}

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;                          //先將SCLK置低電平。                                       
        _nop_();
        RST = 1;                          //然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)                //開(kāi)始傳送八位地址命令
        {                                                          
                DSIO = addr & 0x01;           //數(shù)據(jù)從低位開(kāi)始傳送
                addr >>= 1;
                SCLK = 1;                     //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;                     //DS1302下降沿時(shí),放置數(shù)據(jù)
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)                //讀取8位數(shù)據(jù)
        {
                dat1 = DSIO;                  //從最低位開(kāi)始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;                     //DS1302下降沿時(shí),放置數(shù)據(jù)
                _nop_();
        }

        RST = 0;
        _nop_();                              //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}

void Ds1302Init()
{
        uchar n;                                         
        Ds1302Write(0x8E,0X00);                     //禁止寫(xiě)保護(hù),就是關(guān)閉寫(xiě)保護(hù)功能
        for (n=0; n<7; n++)//寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
        }
        Ds1302Write(0x8E,0x80);                     //打開(kāi)寫(xiě)保護(hù)功能
}

void Ds1302ReadTime()                             //讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年                                                          
{
        uchar n;
        for (n=0; n<7; n++)      
        {
                TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
               
}



ds1302.h

#ifndef __DS1302_H_
#define __DS1302_H_

#include<reg52.h>
#include<intrins.h>

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;

void Ds1302Write(uchar addr, uchar dat);

uchar Ds1302Read(uchar addr);

void Ds1302Init();

void Ds1302ReadTime();

extern uchar TIME[7];   //加入全局變量

#endif





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

使用道具 舉報(bào)

沙發(fā)
ID:416950 發(fā)表于 2019-3-29 00:03 來(lái)自手機(jī) | 只看該作者
能把你這個(gè)程序打包分享給我嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利专区 | 精品二区视频 | 国产免费一区二区 | 亚洲一二三区在线观看 | 中文字幕免费观看 | www中文字幕 | 男女羞羞视频免费看 | 在线中文字幕亚洲 | 日韩在线视频一区 | 亚洲在线免费 | 精品国产一区二区国模嫣然 | 亚洲二区在线观看 | 国产精品久久久久久妇女6080 | 久久久久中文字幕 | 一区二区三区高清在线观看 | 91精品国产欧美一区二区成人 | 精品国产一区二区三区四区在线 | 天天色官网| 在线免费观看黄色 | 国产精品18久久久久久白浆动漫 | 欧美日本一区 | 视频在线观看亚洲 | 国产精品成人一区二区三区夜夜夜 | 国产永久免费 | 成人a免费| 国产区在线免费观看 | 国产精品色婷婷久久58 | 中文字幕一区二区三区四区 | 中文字幕在线看第二 | 亚洲精品1区 | 日韩国产免费 | 国产精品美女久久久久aⅴ国产馆 | 一级黄色在线 | 欧美一区二区三区四区五区无卡码 | 久久久久久国产免费视网址 | 狠狠色香婷婷久久亚洲精品 | 超碰在线免费公开 | 插插插干干干 | 蜜桃视频在线观看免费视频网站www | 九九九色 | 在线日韩av电影 |