登錄|立即注冊(cè)|使用QQ帳號(hào)登錄
論壇 > 24小時(shí)必答區(qū)
發(fā)帖|
看3903|回9|收藏
樓主 ID:103094 只看他
2016-10-16 14:38
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit lcden=P2^7;
sbit lcdrw=P2^5;
sbit lcdrs=P2^6;
sbit T_CLK=P3^6;
sbit T_IO=P3^4;
sbit T_RST=P3^5;
uchar bdata datbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;  

uchar code table1[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};                         //讀地址命令
uchar code table2[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};                        //寫地址命令
uchar  time[7]={0,0,0x08,0x01,0x10,0x06,0x16};
char week[21]={'M','o','n','T','u','e','W','e','d','T','u','e','F','r','i','S','a','t','S','u','n'};

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}


void writeorder(uchar order)                   //1602寫命令函數(shù)
{
        lcdrs=0;
        P0=order;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}


void writedate(uchar date)                          //1602寫數(shù)據(jù)函數(shù)
{
        lcdrs=1;
        P0=date;
        delayms(5);
        lcden=1;
        delayms(5);
        lcden=0;
}


void lcdinit()                                                  //1602初始化函數(shù)
{
        lcdrw=0;
        writeorder(0x38);
        writeorder(0x0c);
        writeorder(0x06);
        writeorder(0x01);
}
/*************1302寫入一個(gè)字節(jié)*/
void w_1302byte(uchar date)
{
        uchar i;
        datbyte=date;
        for(i=0;i<8;i++)
        {         
                T_CLK=0;  _nop_();
                T_IO=datbyte0;
                T_CLK=1;  _nop_();
                datbyte>>=1;
        }
}
  /************1302讀取一個(gè)字節(jié)********/
uchar r_1302byte(void)
{
        uchar i;
        datbyte=0;
        for(i=0;i<8;i++)
        {
                T_CLK=1;        _nop_();
                datbyte7=T_IO;
                _nop_();
                T_CLK=0; _nop_();
                datbyte>>=1;
        }
        return(datbyte);
}
/**********1302寫數(shù)據(jù)**********/
void write_1302(uchar addr,uchar date)
{
        T_RST=0;
        _nop_();
        T_CLK=0; _nop_();
        T_RST=1;_nop_();
        w_1302byte(addr);
        w_1302byte(date);
        T_CLK=1;  _nop_();
        T_RST=0;  _nop_();
}

/******1302讀取一個(gè)字節(jié)*******/
uchar read_1302(uchar addr)
{
        uchar dat1,dat2,temp;
        T_RST=0; _nop_();
        T_CLK=0; _nop_(); ///sclk為低時(shí)rst才能拉高
        T_RST=1;_nop_();
        w_1302byte(addr);
        temp=r_1302byte();
        T_RST=0;        _nop_();
        T_CLK=1;   _nop_();
        T_IO=0;                  
        _nop_();
        T_IO=1;
        _nop_();
        //dat1=temp/16;
        //dat2=temp%16;
        //temp=dat1*10+dat2;
        return(temp);
}


/***********1302初始化********/
void init_1302(void)
{
        uchar i;
        uchar addr=0x80;
        write_1302(0x8e,0x00);
        for(i=0;i<7;i++)
    {
                write_1302(addr,time);
                addr+=2;
        }
        write_1302(0x8e,0x80);
}

        /*******1302的八個(gè)數(shù)據(jù)讀取*******/
void get_1302(void)
{
        uchar i,addr=0x81;
        for(i=0;i<7;i++)
        {
                time=read_1302(addr);
                addr+=2;
        }
}



void display()
{
        int n;
        writeorder(0x80+0X40);
        writedate('0'+time[2]/16);                                
        writedate('0'+(time[2]&0x0f));                                 
        writedate('-');
        writedate('0'+time[1]/16);                                
        writedate('0'+(time[1]&0x0f));        
        writedate('-');
        writedate('0'+time[0]/16);                        
        writedate('0'+(time[0]&0x0f));

        writeorder(0x80);
        writedate('2');
        writedate('0');
        writedate('0'+time[6]/16);                        
        writedate('0'+(time[6]&0x0f));
        writedate('-');
        writedate('0'+time[4]/16);               
        writedate('0'+(time[4]&0x0f));
        writedate('-');
        writedate('0'+time[3]/16);                        
        writedate('0'+(time[3]&0x0f));
        writeorder(0x8c);
        for(n=0;n<3;n++)                                                   //星期顯示函數(shù)
        {
        writedate(week[(3*(time[5]&0x07)-3)+n]);
        }                        
}

void main()
{
        lcdinit();
         init_1302();
        while(1)
        {
                //readtime();
                get_1302();
                display();        
        }
}
沙發(fā) ID:103094 只看他
2016-10-16 14:41
本帖最后由 45555mkkl 于 2016-10-16 14:42 編輯

/******1302讀取一個(gè)字節(jié)*******/
uchar read_1302(uchar addr)
{
        uchar dat1,dat2,temp;
        T_RST=0; _nop_();
        T_CLK=0; _nop_(); ///sclk為低時(shí)rst才能拉高
        T_RST=1;_nop_();
        w_1302byte(addr);
        temp=r_1302byte();
        T_RST=0;        _nop_();
        T_CLK=1;   _nop_();
        T_IO=0;                 
        _nop_();
        T_IO=1;
        _nop_();/////這個(gè)地方的IO為什么要這么操作,誰能解釋一下
        //dat1=temp/16;
        //dat2=temp%16;
        //temp=dat1*10+dat2;
        return(temp);
}
板凳 ID:79544 只看他
2016-10-16 17:32
一個(gè)跳變沿,低電平變?yōu)楦唠娖健?302的時(shí)序
地板 ID:111634 只看他
2016-10-16 20:52
本帖最后由 zl2168 于 2016-10-16 20:53 編輯

實(shí)例90  開機(jī)顯示PC機(jī)時(shí)間的時(shí)鐘1302(LCD1602顯示)


Proteus仿真一下,確認(rèn)有效。

開機(jī)顯示PC機(jī)時(shí)間的時(shí)鐘1302.jpg


摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版


書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。


5# ID:111634 只看他
2016-10-16 20:54
本帖最后由 zl2168 于 2016-10-16 21:01 編輯

實(shí)例91  具有校正功能的時(shí)鐘1302(LCD1602顯示)


電路設(shè)計(jì)
在上例時(shí)鐘電路的基礎(chǔ)上,加入3個(gè)時(shí)鐘修正按鍵:K0(修正)、K1(移位)和K2(加1),分別與80C51P2.7、P2.5P2.3連接,7-6所示。
圖7-6.jpg


程序設(shè)計(jì)


7-6電路,要求開機(jī)顯示20121113時(shí)4758秒,星期日(7),且要求K0、K1K2具有時(shí)鐘校正功能,其控制過程為:按下K0(帶鎖),進(jìn)入時(shí)鐘修正;首先年數(shù)據(jù)(12)快速閃爍,表示可被修正;按一次K1(不帶鎖),被修正位(快速閃爍)按年、周、月、日、時(shí)、分、秒次序循環(huán)往復(fù);按一次K2(不帶鎖),被修正位加1(最大值不超過時(shí)鐘規(guī)定值,超過復(fù)0);時(shí)鐘修正期間,計(jì)時(shí)繼續(xù)運(yùn)行;釋放K0,退出時(shí)鐘修正。
Proteus仿真
摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版


實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.74 KB)
(下載次數(shù): 6, 2016-10-16 20:58 上傳)

具有校正功能的時(shí)鐘1302.jpg
時(shí)鐘修正鍵.jpg

主函數(shù).jpg
6# ID:123289 只看他
2016-10-17 13:27
T_IO=0                      ;P3.4輸出0                        
_nop_()                       ;讓低電平保持一下
T_IO=1                       ;P3.4輸出1
_nop_()                      ;讓高電平保持一下

其實(shí):就是讓P3.4產(chǎn)生一個(gè)上升沿
7# ID:103094 只看他
2016-10-17 18:33

引用:

騰飛的龍 發(fā)表于 2016-10-16 17:32
一個(gè)跳變沿,低電平變?yōu)楦唠娖健?302的時(shí)序

時(shí)序上面沒有數(shù)據(jù)口的這個(gè)操作吧?我記得只是需要對(duì)sclk和e進(jìn)行操作
8# ID:137078 只看他
2016-10-17 20:17
1302的復(fù)位穩(wěn)定時(shí)間,不可以少的。
9# ID:137078 只看他
2016-10-17 20:21
并不是SCLK的低電平變高電平的轉(zhuǎn)換時(shí)的寫入操作,而是為了1302復(fù)位,有個(gè)穩(wěn)定時(shí)間。
10# ID:103094 只看他
2016-10-17 21:32

引用:

柳鐵鋼 發(fā)表于 2016-10-17 20:17
1302的復(fù)位穩(wěn)定時(shí)間,不可以少的。

嗯,明白了,多謝

51黑電子論壇

Powered by Discuz! X3.1

首頁|標(biāo)準(zhǔn)版|觸屏版|電腦版