📄 ds1302.c
字号:
data Uchar yjdispbuff[32]; //液晶屏显示缓冲区
data Uchar clockdata2[7]; //时钟数据缓冲区
data Uchar *clockdatain;
data Uchar *clockdataout;
data Uchar cmddata;
data Uchar indata,outdata;
data Uchar houtdatal,houtdatah,moutdatal,moutdatah,soutdatal,soutdatah; //时、分、秒
data Uchar noutdatal,noutdatah,youtdatal,youtdatah,routdatal,routdatah; //年、月、日
data Uchar woutdatal, woutdatah; //星期
void main() {
Uchar j;
for(j=0;j<32;j++) {
yjdispbuff[j]=32;
}
Delayms(100);
Lcdreset();
cmddata=0x8e;
indata=0x00;
v_W1302(cmddata, indata); //init
cmddata=0x80;
indata=0x33;
v_W1302(cmddata, indata);//秒
cmddata=0x82;
indata=0x00;
v_W1302(cmddata, indata);//分
cmddata=0x84;
indata=0x00;
v_W1302(cmddata, indata);//小时
cmddata=0x86;
indata=0x31;
v_W1302(cmddata, indata);//日
cmddata=0x88;
indata=0x03;
v_W1302(cmddata, indata);//月
cmddata=0x8A;
indata=0x03;
v_W1302(cmddata, indata);//星期
cmddata=0x8C;
indata=0x05;
v_W1302(cmddata, indata);//年
while(1) {
clockdataout=&clockdata2;
v_BurstR1302T(clockdataout);
soutdatal=clockdata2[0]&0x0f;
soutdatah=(clockdata2[0]>>4)&0x07;
moutdatal=clockdata2[1]&0x0f;
moutdatah=(clockdata2[1]>>4)&0x07;
houtdatal=clockdata2[2]&0x0f;
houtdatah=(clockdata2[2]>>4)&0x07;
routdatal=clockdata2[3]&0x0f;
routdatah=(clockdata2[3]>>4)&0x07;
youtdatal=clockdata2[4]&0x0f;
youtdatah=(clockdata2[4]>>4)&0x07;
woutdatal=clockdata2[5]&0x0f;
woutdatah=(clockdata2[5]>>4)&0x07;
noutdatal=clockdata2[6]&0x0f;
noutdatah=(clockdata2[6]>>4)&0x07;
yjdispbuff[0]=50; //50代表数字‘2’的ASC码,液晶屏是按照ASC码来显示字符的
yjdispbuff[1]=48; //48代表数字‘0’的ASC码
yjdispbuff[2]=noutdatah+48; //48表示对应数字的实际值和相对应的ASC码的偏移量
yjdispbuff[3]=noutdatal+48;
yjdispbuff[5]=youtdatah+48;
yjdispbuff[6]=youtdatal+48;
yjdispbuff[8]=routdatah+48;
yjdispbuff[9]=routdatal+48;
yjdispbuff[13]=woutdatal+48;
yjdispbuff[17]=houtdatah+48;
yjdispbuff[18]=houtdatal+48;
yjdispbuff[20]=moutdatah+48;
yjdispbuff[21]=moutdatal+48;
yjdispbuff[23]=soutdatah+48;
yjdispbuff[24]=soutdatal+48;
yjdispbuff[4]=45; //‘-’的ASC码
yjdispbuff[7]=45;
yjdispbuff[10]=32; //空格的ASC码
yjdispbuff[11]=32;
yjdispbuff[12]=32;
yjdispbuff[14]=32;
yjdispbuff[15]=32;
yjdispbuff[16]=32;
yjdispbuff[19]=45;
yjdispbuff[22]=45;
for(j=0;j<32;j++)
{
Disponechar(0,j+2,yjdispbuff[j]);
}
}
}
/*******************************************************
液晶屏显示模块
********************************************************/
#include<config.h>
#define RS1602 P1_0 //数据/命令选择
#define RW1602 P1_1 //读/写选择
#define EL1602 P1_2 //使能信号
#define DataPort P0 // 数据端口
#define Busy 0x80
/*=======================================================
正常读写操作之前必须检测LCD控制器状态: CS=1 RS1602=0 RW1602=1
DB7: 0 LCD控制器空闲; 1 LCD控制器忙
========================================================*/
void WaitForEnable( void ) {
DataPort = 0xff;
RS1602=0; RW1602=1; _nop_(); EL1602=1; _nop_(); _nop_();
while( DataPort & Busy );
EL1602=0;
}
/*=======================================================
写控制字符子程序: E=1 RS1602=0 RW1602=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) { //送控制字符子程序
if (AttribC) WaitForEnable(); // 检测忙信号?
RS1602=0; RW1602=0; _nop_();
DataPort=CMD; _nop_();
EL1602=1;_nop_();_nop_();EL1602=0; // 操作允许脉冲信号
}
/*=======================================================
当前位置写字符子程序: E =1 RS1602=1 RW1602=0
=======================================================*/
void LcdWriteData( char dataW ) {
WaitForEnable(); // 检测忙信号
RS1602=1; RW1602=0; _nop_();
DataPort=dataW; _nop_();
EL1602=1; _nop_(); _nop_(); EL1602=0; // 操作允许脉冲信号
}
/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void Lcdreset( void ) {
LcdWriteCommand( 0x38, 0); // 显示模式设置(不检测忙信号)
Delayms(10);
LcdWriteCommand( 0x38, 0); // 共三次
Delayms(10);
LcdWriteCommand( 0x38, 0);
Delayms(10);
LcdWriteCommand( 0x38, 1); // 显示模式设置(以后均检测忙信号)
LcdWriteCommand( 0x08, 1); // 显示关闭
LcdWriteCommand( 0x01, 1); // 显示清屏
LcdWriteCommand( 0x06, 1); // 显示光标移动设置
LcdWriteCommand( 0x0c, 1); // 显示开及光标设置
}
/*=======================================================
显示光标定位(X表示行 ,Y表示列)
=======================================================*/
void Disp_XY( char posx,char posy) {
Uchar temp;
temp = posy & 0x0f;
posx &= 0x1;
if ( posy>15 ) temp |= 0x40;
if (posx==1) temp |=0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}
/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void Disponechar(Uchar x,Uchar y,Uchar Wdata) {
Disp_XY( x, y ); // 定位显示地址
LcdWriteData( Wdata ); // 写字符
}
/*=======================================================
液晶屏上显示字符串
=======================================================*/
void Eputstr(Uchar x,Uchar y, Uchar code *ptr) {
Uchar i,l=0;
while (*ptr++ >0){l++;}; //统计字符的个数(字符串数组的最后一位是‘\0')
ptr=ptr-(l+1); //使指针重新指向首个字符
for (i=0;i<l;i++) { Disponechar(x,y++,*ptr++);
if ( y == 31 ) { y = 0; x ^= 0; }
}
}
/**************************************************************
头文件
***************************************************************/
#include <at89x51.h>
#include<intrins.h>
#define Uchar unsigned char
#define Uint unsigned int
extern void Delayus(Uchar j); //延时时间为 j*10+8 us (根据生成的汇编代码计算)
extern void Delayms(Uint n) ; //延时时间大约为n ms
extern void Dsenddata(Uchar dd); //8位数据从74HC164的串行输入端输入,从输出端并行输出
//数码管显示和按键扫描用到此函数
extern void Display(Uchar *p); //数码管显示子程序
extern void Lcdreset( void ); //液晶屏初始化
extern void Disponechar(Uchar x,Uchar y,Uchar Wdata); //液晶屏指定位置输出一个字符(Wdata代表欲显示字符的ASC码)
extern void Eputstr(Uchar x,Uchar y, Uchar code *ptr); //液晶屏指定位置输出字符串
extern void Read24c02(Uchar *RamAddress,Uchar RomAddress,Uchar bytes); //读24C02 的子程序
extern void Write24c02(Uchar *Wdata,Uchar RomAddress,Uchar number); //写24C02 的子程序
extern Uchar Key_s(void); //按键扫描子程序
extern Uchar Adconvert(sign); //ADC0832 的转换子程序
extern void Write_18b20(Uchar ddata); //DS18B20 的写子程序
extern Uchar Read_18b20(void); //DS18B20 的读子程序
extern void Init_18b20(void) ; //DS18B20 的初始化子程序
extern void Skip(void); //DS18B20 的‘跳过’子程序
extern void Convert(void); //DS18B20 的温度转换子程序
extern void Read_scrat(void) ; //DS18B20 的读‘SCRAT存储器’子程序
extern void v_BurstW1302T(Uchar *pSecDa); //DS1302 的连续写子程序
extern void v_W1302(Uchar ucAddr, Uchar ucDa); //DS1302 的单字节写子程序
extern void v_BurstR1302T(Uchar *pSecDa); //DS1302 的连续读子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -