#include #include #define uchar unsigned char #define uint unsigned int ***it RS=P2^5; ***it RW=P2^6; ***it E=P2^7; ***it SCLK = P1^6; //*实时时钟时钟线引脚 ***it IO = P3^5; //*实时时钟数据线引脚 ***it RST = P1^7; //*实时时钟复位线引脚 ***it ACC0=ACC^0; ***it ACC7=ACC^7; void delay() { uint x,y; for(x=10;x>0;x--) for(y=2;y>0;y--); } /******************************************************************** * 名称 : Convert(uchar In_Date) * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。 * 输入 : 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命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void enable(uchar com) { P0=convert(com); RS=0; RW=0; E=0; delay(); E=1; delay(); } /******************************************************************** * 名称 : write(uchar del) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ 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" ,调用该函数如下 L1602_char(1,5,'b') * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ 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数据 { 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数据 { 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数据 { 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数据 { 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) //二进制转换成十进制 { uchar data1; data1 = bcd & 0x0f; //取BCD低4位 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。 data1 += bcd >> 1; data1 += bcd >> 3; //用位移代替乘法运算 return data1; } void init_1302() //往DS1302中写入数据 { 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(); } |
更多回帖