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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機實現 lcd1602時間顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:433198 發表于 2018-11-26 09:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
主函數
#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));                        //時         
        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)   //延時函數
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

#ifndef         LCD1602_4PINS                 //當沒有定義這個LCD1602_4PINS的時候
void LcdWriteCom(uchar com)                 //寫入命令
{
        LCD1602_E = 0;                  //使能
        LCD1602_RS = 0;                        //選擇發送命令
        LCD1602_RW = 0;                        //選擇寫入
                                          
        LCD1602_DATAPINS = com;         //發送命令
        Lcd1602_Delay1ms(1);                    //等待數據穩定
                                                          
        LCD1602_E = 1;                        //寫入時序
        Lcd1602_Delay1ms(5);                //保持時間
        LCD1602_E = 0;
}
#else                                                   
void LcdWriteCom(uchar com)                //寫入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫入命令
        LCD1602_RW = 0;         //選擇寫入

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

        LCD1602_E = 1;                        //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

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

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

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

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

        LCD1602_E = 1;                            //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

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

        LCD1602_E = 1;                           //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
                  
#ifndef                LCD1602_4PINS
void LcdInit()                                   //LCD初始化子程序
{
        LcdWriteCom(0x38);                 //開顯示
        LcdWriteCom(0x0c);                 //開顯示不顯示光標
        LcdWriteCom(0x06);                 //寫一個指針加1
        LcdWriteCom(0x01);                 //清屏
        LcdWriteCom(0x80);                 //設置數據指針起點
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);                      //將8位總線轉為4位總線
        LcdWriteCom(0x28);                      //在四位線下的初始化
        LcdWriteCom(0x0c);                //開顯示不顯示光標
        LcdWriteCom(0x06);                //寫一個指針加1
        LcdWriteCom(0x01);                //清屏
        LcdWriteCom(0x80);                //設置數據指針起點
}
#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單片機12MHZ時鐘下的延時函數*/

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

#endif


ds1302.c
#include<ds1302.h>

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

uchar TIME[7] = {0, 0, 0x12, 0x24, 0x11, 0x02, 0x18};                                                  //DS1302時鐘初始化2013年1月1日星期二12點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++)                                        //開始傳送八位地址命令                                                                     
        {
                DSIO = addr & 0x01;              //數據從低位開始傳送                                    
                addr >>= 1;
                SCLK = 1;                        //數據在上升沿時,DS1302讀取數據                                    
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)                  //寫入8位數據                                    
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;                       //數據在上升沿時,DS1302讀取數據                                      
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;                           //傳送數據結束                                       
        _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++)                //開始傳送八位地址命令
        {                                                          
                DSIO = addr & 0x01;           //數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;                     //數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;                     //DS1302下降沿時,放置數據
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)                //讀取8位數據
        {
                dat1 = DSIO;                  //從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;                     //DS1302下降沿時,放置數據
                _nop_();
        }

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

void Ds1302Init()
{
        uchar n;                                         
        Ds1302Write(0x8E,0X00);                     //禁止寫保護,就是關閉寫保護功能
        for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
        }
        Ds1302Write(0x8E,0x80);                     //打開寫保護功能
}

void Ds1302ReadTime()                             //讀取7個字節的時鐘信號:分秒時日月周年                                                          
{
        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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:416950 發表于 2019-3-29 00:03 來自手機 | 只看該作者
能把你這個程序打包分享給我嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三 | 亚洲视频在线观看免费 | 国产精品大全 | 亚洲国产一区在线 | 国产乱xxav | 97免费在线视频 | 亚洲精品乱 | 亚洲欧洲精品在线 | 国产日韩欧美一区二区 | 国产乱码精品1区2区3区 | 日日干天天操 | 亚洲美女网站 | 欧美日韩成人影院 | 国产精品久久欧美久久一区 | 日批免费观看 | 天天色综 | 色接久久 | 中文字幕在线不卡 | 成人福利在线视频 | 国产精品亚洲精品 | 天天干夜夜操 | 一区二区三区国产 | 美女视频网站久久 | 一级毛片免费 | 久久国产区 | 国产不卡视频 | 国产精品视频久久久 | 免费视频一区二区 | 国产激情视频在线观看 | 毛片a级毛片免费播放100 | 极品电影院 | 久久精品欧美一区二区三区麻豆 | 日韩成人免费视频 | 亚洲韩国精品 | 久久久久亚洲精品中文字幕 | 国产精品欧美一区二区三区不卡 | 亚洲美女一区 | 日韩一区二区三区av | 亚洲社区在线 | av中文字幕在线 | 欧美一二三区 |