while(LCD_check_busy()); LCD_DB=cmd; LCD_RS=0; _nop_(); LCD_RW=0; _nop_(); LCD_EN=1; _nop_(); _nop_(); LCD_EN=0; }
void delay_5ms(void) //误差 0us {
unsigned char a,b; for(b=19;b>0;b--)
for(a=130;a>0;a--); }
/*设置显示位置*/
void LCD_pos(unsigned char pos) //设定显示位置 { write_cmd(pos | 0x80); }
/*LCD初始化*/ void init_lcd() { write_cmd(0x38); delay_5ms(); write_cmd(0x0c); write_cmd(0x06); write_cmd(0x01); }
void print(uchar *str) {
while(*str!='\\0') { write_dat(*str); str++; } }
#endif //一定不能掉
DS1302.h文件:
/****************************
31
DS1302内部函数
*****************************/ #ifndef _ds1302_h_ #define _ds1302_h_ #include\sbit T_RST=P3^5; sbit T_CLK=P3^6; sbit T_IO=P3^4; //sbit T_RST=P4^1; //sbit T_CLK=P4^0; //sbit T_IO=P4^2; sbit ACC0=ACC^0; sbit ACC7=ACC^7;
unsigned char l_tmpdate[7]={5,34,15,26,6,3,13};//秒分时日月周年08-05-15 12:00:00
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位 typedef struct systemtime {
uchar second; uchar minute; uchar hour; uchar week; uchar day; uchar month; uchar year; uchar DateString[9]; uchar TimeString[9];
}systemtime; //定义的时间类型 /*向DS1302中写入1BYTE数据*/ void writeB(uchar ucda) {
uchar i; ACC=ucda; for(i=8;i>0;i--) { T_IO=ACC0; T_CLK=1; T_CLK=0; ACC=ACC>>1; }
// T_IO=0; }
/******************************************************************/
32
/* 写入DS1302 */ /******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ) {
T_RST=0; _nop_(); T_CLK=0; _nop_();
T_RST=1;
_nop_(); //启动 writeB(address); //发送地址 writeB(dat); //发送数据 T_RST=0; //恢复 }
/*从DS1302中读出1BYTE数据*/ uchar readB() {
uchar i;
for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=T_IO; T_CLK=1; T_CLK=0; }
// T_IO=0; return(ACC); }
/*单字节读,向DS1302某地址中读出数据, 先写地址后写命令/数据*************/ uchar r_ds1302(uchar ucaddr) {
uchar ucda; T_RST=0; T_CLK=0; T_RST=1;
writeB(ucaddr); ucda=readB(); T_CLK=1; T_RST=0; return(ucda); }
/*--------------------------------------------------------------*/
33
//是否写入保护
void DS1302_SetProtect(bit Flag) { if(Flag) Write_Ds1302(0x8E,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302 else Write_Ds1302(0x8E,0x00); //WP=0 允许数据写入DS1302 }
/*--------------------------------------------------------------*/ //设置时间函数
void DS1302_SetTime(unsigned char Address, unsigned char Value) { DS1302_SetProtect(0); Write_Ds1302(Address,((Value/10)<<4|(Value))); DS1302_SetProtect(1); }
/********************************** 读取 DS1302当前时间, 格式为:
秒,分,时,日,月,星期,年 **********************************/ void get_ds1302(systemtime *Time) { uchar readtime;
readtime = r_ds1302(0x81); //秒寄存器读操作0x81 Time->second = ((readtime&0x70)>>4)*10 + (readtime&0x0f); //十位+个位 readtime = r_ds1302(0x83); //分寄存器读操作0x83 Time->minute = ((readtime&0x70)>>4)*10 + (readtime&0x0f); readtime = r_ds1302(0x85); Time->hour = ((readtime&0x70)>>4)*10 + (readtime&0x0f); readtime = r_ds1302(0x87); Time->day = ((readtime&0x70)>>4)*10 + (readtime&0x0f); //readtime = r_1302(0x8b); //Ttime->week = ((readtime&0x70)>>4)*10 + (readtime&0x0f); readtime = r_ds1302(0x89); Time->month = ((readtime&0x70)>>4)*10 + (readtime&0x0f); readtime = r_ds1302(0x8d); Time->year = ((readtime&0x70)>>4)*10 + (readtime&0x0f);
34
//将十进制数转换为液晶显示的ASCII值 Time->DateString[0] = Time->year/10 + '0'; Time->DateString[1] = Time->year + '0'; Time->DateString[2] = '-'; Time->DateString[3] = Time->month/10 + '0'; Time->DateString[4] = Time->month + '0'; Time->DateString[5] = '-'; Time->DateString[6] = Time->day/10 + '0'; Time->DateString[7] = Time->day + '0'; Time->DateString[8] = '\\0'; //将十进制数转换为液晶显示的ASCII值 Time->TimeString[0] = Time->hour/10 + '0'; Time->TimeString[1] = Time->hour + '0'; Time->TimeString[2] = ':'; Time->TimeString[3] = Time->minute/10 + '0'; Time->TimeString[4] = Time->minute + '0'; Time->TimeString[5] = ':'; Time->TimeString[6] = Time->second/10 + '0'; Time->TimeString[7] = Time->second + '0'; Time->TimeString[8] = '\\0'; }
#endif
35