標題: 基于1602的ds1302驅(qū)動 這個地方的IO為什么要這么操作,誰能解釋一下 [打印本頁]
作者: 45555mkkl 時間: 2016-10-16 14:38
標題: 基于1602的ds1302驅(qū)動 這個地方的IO為什么要這么操作,誰能解釋一下
#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寫入一個字節(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讀取一個字節(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讀取一個字節(jié)*******/
uchar read_1302(uchar addr)
{
uchar dat1,dat2,temp;
T_RST=0; _nop_();
T_CLK=0; _nop_(); ///sclk為低時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的八個數(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();
}
}
作者: 45555mkkl 時間: 2016-10-16 14:41
本帖最后由 45555mkkl 于 2016-10-16 14:42 編輯
/******1302讀取一個字節(jié)*******/
uchar read_1302(uchar addr)
{
uchar dat1,dat2,temp;
T_RST=0; _nop_();
T_CLK=0; _nop_(); ///sclk為低時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_();/////這個地方的IO為什么要這么操作,誰能解釋一下
//dat1=temp/16;
//dat2=temp%16;
//temp=dat1*10+dat2;
return(temp);
}
作者: 騰飛的龍 時間: 2016-10-16 17:32
一個跳變沿,低電平變?yōu)楦唠娖健?302的時序
作者: zl2168 時間: 2016-10-16 20:52
本帖最后由 zl2168 于 2016-10-16 20:53 編輯
實例90 開機顯示PC機時間的時鐘1302(LCD1602顯示)
先Proteus仿真一下,確認有效。
實例90 開機顯示PC機時間的時鐘1302(LCD1602顯示).rar
(50.36 KB, 下載次數(shù): 6)
2016-10-16 20:53 上傳
點擊文件名下載附件
開機顯示PC機時間的時鐘1302.jpg (106.32 KB, 下載次數(shù): 87)
下載附件
2016-10-16 20:53 上傳
摘自張志良編著《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
書中電路和程序設(shè)計有詳細說明,程序語句條條有注解。
作者: zl2168 時間: 2016-10-16 20:54
本帖最后由 zl2168 于 2016-10-16 21:01 編輯
實例91 具有校正功能的時鐘1302(LCD1602顯示)
⒈ 電路設(shè)計
在上例時鐘電路的基礎(chǔ)上,加入3個時鐘修正按鍵:K0(修正)、K1(移位)和K2(加1),分別與80C51P2.7、P2.5和P2.3連接,如圖7-6所示。
圖7-6.jpg (38.67 KB, 下載次數(shù): 88)
下載附件
2016-10-16 20:56 上傳
⒉ 程序設(shè)計
按圖7-6電路,要求開機顯示2012年1月1日13時47分58秒,星期日(7),且要求K0、K1和K2具有時鐘校正功能,其控制過程為:按下K0(帶鎖),進入時鐘修正;首先年數(shù)據(jù)(12)快速閃爍,表示可被修正;按一次K1(不帶鎖),被修正位(快速閃爍)按年、周、月、日、時、分、秒次序循環(huán)往復(fù);按一次K2(不帶鎖),被修正位加1(最大值不超過時鐘規(guī)定值,超過復(fù)0);時鐘修正期間,計時繼續(xù)運行;釋放K0,退出時鐘修正。
先Proteus仿真
摘自張志良編著《單片機實驗實訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版
實例91 帶校正時鐘1302(LCD1602顯示).rar
(52.74 KB, 下載次數(shù): 6)
2016-10-16 20:58 上傳
點擊文件名下載附件
具有校正功能的時鐘1302.jpg (201.72 KB, 下載次數(shù): 82)
下載附件
2016-10-16 20:58 上傳
時鐘修正鍵.jpg (189.16 KB, 下載次數(shù): 87)
下載附件
2016-10-16 20:59 上傳
主函數(shù).jpg (110.68 KB, 下載次數(shù): 98)
下載附件
2016-10-16 20:59 上傳
作者: yzwzfyz 時間: 2016-10-17 13:27
T_IO=0 ;P3.4輸出0
_nop_() ;讓低電平保持一下
T_IO=1 ;P3.4輸出1
_nop_() ;讓高電平保持一下
其實:就是讓P3.4產(chǎn)生一個上升沿
作者: 45555mkkl 時間: 2016-10-17 18:33
時序上面沒有數(shù)據(jù)口的這個操作吧?我記得只是需要對sclk和e進行操作
作者: 柳鐵鋼 時間: 2016-10-17 20:17
1302的復(fù)位穩(wěn)定時間,不可以少的。
作者: 柳鐵鋼 時間: 2016-10-17 20:21
并不是SCLK的低電平變高電平的轉(zhuǎn)換時的寫入操作,而是為了1302復(fù)位,有個穩(wěn)定時間。
作者: 45555mkkl 時間: 2016-10-17 21:32
嗯,明白了,多謝
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |