DS1302时钟 LCD1206 显示 C程序_第1页
DS1302时钟 LCD1206 显示 C程序_第2页
DS1302时钟 LCD1206 显示 C程序_第3页
DS1302时钟 LCD1206 显示 C程序_第4页
DS1302时钟 LCD1206 显示 C程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STC12C5A08AD 单片机DS1302 时钟芯片LCD1602 液晶显示#include <stc12c5a08ad.h> /stc单片机专用的头文件#include <reg52.h> #include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define dat P0/定义LCD1602的数据口为P0void delay(unsigned int xms );/声明延时函数void delay2(unsign

2、ed int xms);void display(void); /显示程序 void keyscan(void);sbit key0=P20;sbit key1=P21;sbit key2=P22;sbit key3=P23;sbit beep=P34; /*ds1302*/#define DS1302_SECOND_WRITE 0x80 #define DS1302_MINUTE_WRITE 0x82#define DS1302_HOUR_WRITE 0x84#define DS1302_DAY_WRITE 0x86#define DS1302_MONTH_WRITE 0x88#define

3、 DS1302_WEEK_WRITE 0x8A#define DS1302_YEAR_WRITE 0x8Cvoid Set_MIN(uchar s);void Set_HR(uchar s);void Init_DS1302(void) ;void DS1302WriteByte(uchar dat);void DS1302Write(uchar cmd,uchar dat);uchar DS1302Read(uchar cmd);uchar DS1302Read_1(uchar cmd);uchar DS1302ReadByte();uchar DS1302ReadByte_1();sbit

4、 RST=P14;sbit SCLK=P36;sbit SDA=P37; /* lcd1206*/sbit rs=P10;/定义RS口为P10sbit rw=P11;/定义RW口为P11sbit e=P12;/定义E口为P12void xianshi_sfm(uchar wei,uchar dat);void shj_1602(uchar a); /液晶写数据程序void int_1602(void); /液晶初始化void zhl_1602(uchar a); /液晶写指令程序uchar a,b,c,d;uchar code table07="time is" /定义LC

5、D1602显示2行的字符uchar code table310="0123456789"uchar code table41=":" /*延时函数*/ void delay(unsigned int xms)/延时函数, unsigned int i,j ; for(i=xms;i>0;i-) for(j=110;j>0;j-); /*LCD1602 显示程序*/ void zhl_1602(uchar a)/写指令到LCM程序 / busy_1602(); /查询忙碌标志信号程序 e=0; rs=0; rw=0; e=1; dat=a; d

6、elay(5); e=0;void shj_1602(uchar a)/写数据到LCM程序 / busy_1602(); /查询忙碌标志信号程序 e=0; rs=1; rw=0; e=1; dat=a; delay(5); e=0;void int_1602(void)/启动LCM程序 zhl_1602(0x38); / 设置显示模式,数据接口位数 zhl_1602(0x0c); / 设置显示开关,是否显示光标,是否闪动光标 zhl_1602(0x06);/ 设置光标移动方向左或右,设置所有文字是否移动 /*液晶LCD1602显示主程序程序*/void display(void)/液晶显示程序

7、 uchar i,ri,yue,nian;/定义计数值int_1602();/初始化1602zhl_1602(0x80);delay(5);/写指令(11000000) 指定从第一行指针位置开始写for(i=0;i<7;i+)/发送数据第一行 time is: shj_1602(table0i);delay(5);zhl_1602(0x80+10);delay(5);/for(i=0;i<1;i+)/发送数据第一行时间显示的“: ”shj_1602(table4i);delay(5);zhl_1602(0x80+13);delay(5);/for(i=0;i<1;i+)/发送

8、数据第一行时间显示的“: ”shj_1602(table4i);delay(5);a=(DS1302Read(0x81)/16)*10+(DS1302Read(0x81)%16); /转换为十进制c=(DS1302Read(0x83)/16)*10+(DS1302Read(0x83)%16);d=(DS1302Read(0x85)/16)*10+(DS1302Read(0x85)%16);ri=(DS1302Read(0x87)/16)*10+(DS1302Read(0x87)%16); yue=(DS1302Read(0x89)/16)*10+(DS1302Read(0x89)%16);ni

9、an=(DS1302Read(0x8d)/16)*10+(DS1302Read(0x8d)%16); xianshi_sfm(8,d); / 时钟显示 时 delay(20);xianshi_sfm(11,c); / 时钟显示 分 delay(20);xianshi_sfm(14,a); / 时钟显示 秒 delay(20); xianshi_sfm(0X48,ri); / day 0X48 为换第二行写入显示 年 月 日 delay(20); xianshi_sfm(0X45,yue); / yue delay(20);xianshi_sfm(0X42,nian); / nian delay

10、(20);xianshi_sfm( 0x40,20); / 显示20 xx 年份的前缀 /*时间显示子程序*/void xianshi_sfm(uchar wei,uchar dat) uchar shi,ge; shi=dat/10;ge=dat%10;zhl_1602(0x80+wei);/第一行显示+位选择delay(5); shj_1602(table3shi); delay(5); shj_1602(table3ge); delay(5); /*DS1302程序* / cmd: 要写入的控制字节 dat: 读取的数据*uchar DS1302Read_1(uchar cmd) /十二

11、小时制调用 uchar dat; RST=0; / 初始 CE 线置为 0 SCLK=0; / 初始时钟线置为 0 RST=1; / 初始 CE 置为 1 ,传输开始 DS1302WriteByte(cmd); / 传输命令字,要读取的时间 dat=DS1302ReadByte_1(); / 读取要得到的时间 SCLK=1; / 时钟线拉高 RST=0; / 读取结束, CE 置为 0 ,结束数据的传输 return dat; / 返回得到的时间 / / / / 日期 /* 读操作*/uchar DS1302ReadByte_1() /十二小时制调用 uchar i,dat,dat1,dat2

12、; delay(2); for(i=0;i<8;i+) dat>>=1; / 要返回的数据左移一位 if(SDA=1) / 当数据线为高时,证明该位数据为 1 dat|=0x80; / 要传输数据的当前值置为 1, 若不是则为 0 SCLK=1; / 拉高时钟线 delay(5); SCLK=0; / 制造下降沿 delay(5); / RST=0; / 初始CE 线置为 0 dat1=dat-0x80; /-0x80 是设置12小时制后 去掉 ”DS1302_HOUR_WRITE 0x84“ 设置的最高位1 以免影响取值错误 否则时显示错误 dat2=dat1/16; /数

13、据进制转换 dat1=dat1%16; /十六进制转十 dat1=dat1+dat2*10; return (dat1); / 返回读取出的数据 /* 读操作*/uchar DS1302Read(uchar cmd) /二四小时制调用 uchar dat; RST=0; / 初始 CE 线置为 0 SCLK=0; / 初始时钟线置为 0 RST=1; / 初始 CE 置为 1 ,传输开始 DS1302WriteByte(cmd); / 传输命令字,要读取的时间 dat=DS1302ReadByte(); / 读取要得到的时间 SCLK=1; / 时钟线拉高 RST=0; / 读取结束, CE

14、置为 0 ,结束数据的传输 return dat; / 返回得到的时间 / / / / 日期 /*写数据*/void DS1302Write(uchar cmd, uchar dat) RST=0; / 初始CE 线置为 0 SCLK=0; / 初始时钟线置为 0 RST=1; / 初始CE 置为 1 ,传输开始 DS1302WriteByte(cmd); DS1302WriteByte(dat); / 写入要修改的时 SCLK=1; / 时钟线拉高 RST=0; / 读取结束, CE 置为 0 , /*写操作*/ void DS1302WriteByte(uchar dat) uchar i

15、; SCLK=0; / 初始时钟线置为 0 delay(5); for(i=0;i<8;i+) / 开始传输 8 个字节的数据 SDA=dat&0x01; / 取最低位,注意 DS130的数据和地址都是从最低位开始传输的 delay(5); SCLK=1; / 时钟线拉高,制造上升沿, SDA 的数据被传输 delay(5); SCLK=0; / 时钟线拉低,为下一个上升沿做准备 dat>>=1; / 数据右移一位,准备传输下一位数据 / RST=0; / 初始CE 线置为 0 /* 读操作*/ uchar DS1302ReadByte() /二四小时制调用 ucha

16、r i,dat; delay(2); for(i=0;i<8;i+) dat>>=1; / 要返回的数据左移一位 if(SDA=1) / 当数据线为高时,证明该位数据为 1 dat|=0x80; / 要传输数据的当前值置为 1, 若不是则为 0 SCLK=1; / 拉高时钟线 delay(5); SCLK=0; / 制造下降沿 delay(5); RST=0; / 初始CE 线置为 0 return (dat); / /*DS1302初始化*/ void Init_DS1302(void) DS1302Write(0x8e,0x00); / 写保护关 DS1302Write(

17、DS1302_SECOND_WRITE,0x55); / 初始秒值为 55 DS1302Write(DS1302_MINUTE_WRITE,0x59); / 初始分钟值为 59 DS1302Write(0x84,0x23);/24小时模式/若设置(0X84 0X92)初始为12小时模式 ,初始时间为12点,读程序时调用 uchar DS1302Read_1(uchar cmd) DS1302Write(DS1302_DAY_WRITE,0x18); /年月日星期 初值设置 DS1302Write(DS1302_MONTH_WRITE,0x05); DS1302Write(DS1302_YEAR

18、_WRITE,0x13); DS1302Write(DS1302_WEEK_WRITE,0x06); DS1302Write(0xc0,0xf0); / 初始化一次标示 DS1302Write(0x8e,0x80); /开启写入保护 /主程序 void main() Init_DS1302(); delay(5); while(1) display(); / 显示 keyscan(); /*键控设置时间程序 调整时,分的显示值可对时间校准*/void Set_MIN(uchar s) /1为分钟加,0为分钟减 unsigned char temp;DS1302Write(0x8E,0x00);

19、/去除写保护temp=DS1302Read(0x83);if(s) temp+=1;if(temp>0x59)temp=0; if(temp&0x0f)>0x09) /if(temp%0x10>0x09) 当低四位大于9时 temp=(temp+16)&0xf0; / temp=(temp+0x10) & 0xf0);高四位进1位 低四位归零 else if(temp>0)/temp-=1;else/TEMP 等于0 时;·temp=0x59; if(temp%0x10)>0x09)/减到低位为0后 再减一次低位为1111,为15

20、 取余运算后大于9 ,同时高位被低位借位减1,降了一个十位数temp=(temp&0xf0+0x09); /temp=(temp/0x10)*0x10 + 0x09) 则取高位值,低位置9,从而达到0至9循环 DS1302Write(0x82,temp);DS1302Write(0x8e,0x80);void Set_HR(uchar s) /1为小时加,0为小时减 unsigned char temp;DS1302Write(0x8E,0x00);/去除写保护temp=DS1302Read(0x85);/小时数保存在低5位/temp<<=3;/temp>>=3;if(s)temp+=1; if(temp=0x0a) /加到0000 1010 时 分位不需要10 手动加一操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论