#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS=P2^5; sbit RW=P2^6; sbit E=P2^7; sbit SCLK = P1^6; //*實(shí)時時鐘時鐘線引腳 sbit IO = P3^5; //*實(shí)時時鐘數(shù)據(jù)線引腳 sbit RST = P1^7; //*實(shí)時時鐘復(fù)位線引腳 sbit ACC0=ACC^0; sbit ACC7=ACC^7;
void delay() { uint x,y; for(x=10;x>0;x--) for(y=2;y>0;y--); } /******************************************************************** * 名稱 : Convert(uchar In_Date) * 功能 : 因?yàn)殡娐吩O(shè)計時,P0.0--P0.7接法剛好了資料中的相反,所以設(shè)計該函數(shù)。 * 輸入 : 1602資料上的值 * 輸出 : 送到1602的值 ***********************************************************************/ uchar convert(uchar In_Date) { uchar i, Out_Date = 0, temp = 0; for(i=0; i<8; i++) { temp = (In_Date >> i) & 0x01; Out_Date |= (temp << (7 - i)); } return Out_Date; } /******************************************************************** * 名稱 : enable(uchar del) * 功能 : 1602命令函數(shù) * 輸入 : 輸入的命令值 * 輸出 : 無 ***********************************************************************/ void enable(uchar com) { P0=convert(com);
RS=0; RW=0; E=0; delay(); E=1; delay(); } /******************************************************************** * 名稱 : write(uchar del) * 功能 : 1602寫數(shù)據(jù)函數(shù) * 輸入 : 需要寫入1602的數(shù)據(jù) * 輸出 : 無 ***********************************************************************/ void write(uchar date) { P0=convert(date); RS=1; RW=0; E=0; delay(); E=1; delay(); } /******************************************************************** * 名稱 : L1602_char(uchar hang,uchar lie,char sign) * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調(diào)用該函數(shù)如下 L1602_char(1,5,'b') * 輸入 : 行,列,需要輸入1602的數(shù)據(jù) * 輸出 : 無 ***********************************************************************/ void L1602_char(uchar hang,uchar lie,char sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; enable(a); write(sign); } void init_1602() { enable(0x01); enable(0x38); enable(0x0c); enable(0x06);
} void input_1302(uchar dat) //向1302中寫入1bytes數(shù)據(jù) { uchar i; ACC=dat; RST=1; for(i=8;i>0;i--) { IO=ACC0; SCLK=1; SCLK=0; ACC>>=1; } } uchar output_1302() //1302輸出1bytes數(shù)據(jù) { uint i; RST=1; for(i=8;i>0;i--) { ACC>>=1; ACC7=IO; SCLK=1; SCLK=0; } return ACC; } void write_1302(uchar address,uchar date) //向1302某地址寫入1bytes數(shù)據(jù) { RST=0; SCLK=0; RST=1; input_1302(address); _nop_(); _nop_(); input_1302(date); SCLK=1; RST=0;
} uchar read_1302(uchar address) //從1302讀出1bytes數(shù)據(jù) { uchar date; RST=0; SCLK=0; RST=1; input_1302(address); _nop_(); _nop_(); date=output_1302(); SCLK=1; RST=0; return date; }
uchar BCD_to_DEC(uchar bcd) //二進(jìn)制轉(zhuǎn)換成十進(jìn)制 { uchar data1; data1 = bcd & 0x0f; //取BCD低4位 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。 data1 += bcd >> 1; data1 += bcd >> 3; //用位移代替乘法運(yùn)算 return data1; } void init_1302() //往DS1302中寫入數(shù)據(jù) { write_1302(0x8e,0); write_1302(0x80,0x50);//寫入秒 write_1302(0x82,0x59);//寫入分
write_1302(0x84,0x07);//寫入小時
write_1302(0x86,0x08);//寫入日
write_1302(0x88,0x08);//寫入月
write_1302(0x8a,0x05);//寫入星期
write_1302(0x8c,0x08);//寫入年 } void display_1302() //讀時間并送1602顯示 { uchar sec,min,hour,day,month,year; while(1) { write_1302(0x8f,0); sec=BCD_to_DEC(read_1302(0x81)); min=BCD_to_DEC(read_1302(0x83)); hour=BCD_to_DEC(read_1302(0x85)); day=BCD_to_DEC(read_1302(0x87)); month=BCD_to_DEC(read_1302(0x89)); year=BCD_to_DEC(read_1302(0x8d)); L1602_char(2, 6, hour/10 + 48); L1602_char(2, 7, hour%10 + 48); L1602_char(2, 8, ':'); L1602_char(2, 9, min/10 + 48); L1602_char(2, 10, min%10 + 48); L1602_char(2, 11, ':'); L1602_char(2, 12, sec/10 + 48); L1602_char(2, 13, sec%10 + 48); L1602_char(1, 8, year/10 + 48); L1602_char(1, 9, year%10 + 48); L1602_char(1, 10, '-'); L1602_char(1, 11, month/10 + 48); L1602_char(1, 12, month%10 + 48); L1602_char(1, 13, '-'); L1602_char(1, 14, day / 10 + 48); L1602_char(1, 15, day % 10 + 48); } } void main() { init_1602(); init_1302(); display_1302(); }
|