E=1; //高电平期间写入 delay1ms(5); //保持时间 E=0; //变低 }
/*********函数功能:向1602写入一个字节的数据*********/ void writedata(uchar dat) { E=0; RW=0; RS=1; //高电平选择写入数据 P0=dat; delay1ms(1); E=1; delay1ms(5); E=0; }
/*********函数功能:初始化LCD1602*********/ void lcd1602Init() { writecom(0x38); //开显示 writecom(0x0c); //开显示,不显示光标 writecom(0x06); //写一个字符指针加1 writecom(0x01); //清屏 writecom(0x80); //设置数据指针起点 }
-------------------------------------------分割线--------------------------------------------------- #ifndef _DS1302_H_ #define _DS1302_H_
//---包含头文件---// #include
//---宏定义关键词---// #ifndef uint
#define uint unsigned int #endif
#ifndef uchar
#define uchar unsigned char #endif
//---定义1302的IO口---// sbit IO=P2^7; sbit CE=P2^5; sbit SCLK=P2^6;
//---声明全局函数---//
void ds1302write(uchar addr,uchar dat); uchar ds1302read(uchar addr); void ds1302Init();
void ds1302readtime();
//---加入全局变量---// extern uchar TIME[7];
#endif
#include\
uchar READ_ADDR[]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //DS1302的读取地址,与下面的数组时间对应
uchar WRITE_ADDR[]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //DS1302的写入地址,与下面的数组时间对应
uchar TIME[7] = {0x00,0x00,0x12,0x01,0x01,0x02,0x14}; //---TIME[7]数组存储分别是 秒 分 时 日 月 星期 年---//
/*********函数功能:向ds1302写数据*********/ void ds1302write(uchar addr,uchar dat) { uchar n; CE=0; SCLK=0; //先将SCLK置低电平 _nop_(); CE=1; //然后将CE置高电平 _nop_(); for(n=0;n<8;n++)//开始传送8位地址命令 { IO=addr&0x01;//从低位开始传送 addr>>=1; SCLK=1; //上升沿读取数据 _nop_(); SCLK=0; //下降沿放置数据
_nop_(); } for(n=0;n<8;n++)//写入8位数据 { IO=dat&0x01; dat>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } CE=0; //数据传送结束 _nop_(); }
/*********函数功能:从ds1302读数据*********/ uchar ds1302read(uchar addr) { uchar n,dat,dat1; CE=0; SCLK=0; //先将SCLK置低电平 _nop_(); CE=1; //然后将CE置高电平 _nop_(); for(n=0;n<8;n++)//开始传送八位地址命令 { IO=addr&0x01; addr>>=1; SCLK=1; _nop_(); SCLK=0; _nop_(); } for(n=0;n<8;n++)//读取8位数据 { dat1=IO; dat=(dat>>1)|(dat1<<7); SCLK=1; _nop_(); SCLK=0; _nop_(); } CE=0; _nop_(); //以下为DS1302复位的稳定时间,必须的
SCLK=1; _nop_(); IO=0; _nop_(); IO=1; _nop_(); return dat; }
/*********函数功能:初始化DS1302*********/ void ds1302Init() { uchar n; ds1302write(0x8e,0x00); //关闭写保护 for(n=0;n<7;n++) { ds1302write(WRITE_ADDR[n],TIME[n]); } ds1302write(0x8e,0x80); //打开写保护 }
/*********函数功能:读取时钟信息*********/ void ds1302readtime() { uchar n; for(n=0;n<7;n++) { TIME[n]=ds1302read(READ_ADDR[n]);//将读取到的时间存入TIME[7]数组里 } }
以下为仿真图片,K4键没有设置功能