DS1302+18B20万年历1602显示1的程序

上传人:cn****1 文档编号:563635716 上传时间:2022-10-15 格式:DOC 页数:17 大小:109.50KB
返回 下载 相关 举报
DS1302+18B20万年历1602显示1的程序_第1页
第1页 / 共17页
DS1302+18B20万年历1602显示1的程序_第2页
第2页 / 共17页
DS1302+18B20万年历1602显示1的程序_第3页
第3页 / 共17页
DS1302+18B20万年历1602显示1的程序_第4页
第4页 / 共17页
DS1302+18B20万年历1602显示1的程序_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《DS1302+18B20万年历1602显示1的程序》由会员分享,可在线阅读,更多相关《DS1302+18B20万年历1602显示1的程序(17页珍藏版)》请在金锄头文库上搜索。

1、/* 该程序实现了用单片机来控制时钟芯片DS1302进行万年历的显示。 这个代码相对来说很复杂,注释比较多,大家可以仔细分析。 程序运行,首先设置时间。 按S19,进行某一位的设置,会看到某一位上面会闪烁。 按S20,数值加1. 按S21,数值减1. 设置完后,时间会进行运行。 另外,1602上也会有时间显示的。 */#include#includeDS18B20_3.H#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;/flag用于

2、读取头文件中的温度值,和显示温度值#define yh 0x80 /LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)/液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit rs=P25;sbit rw=P26; /如果硬件上rw接地,就不用写这句和后面的rw=0了sbit en=P27;sbit SCLK = P16; /实时时钟时钟线引脚 sbit IO = P35; /实时时钟数据线引脚 sbit RST = P17;

3、/实时时钟复位线引脚 sbit ACC0=ACC0;sbit ACC7=ACC7;sbit key1=P32; /设置键sbit key2=P33; /加键sbit key3=P34; /减键uchar code tab1=20 - - ; /年显示的固定字符uchar code tab2= : : ;/时间显示的固定字符void delay(uint xms)/延时函数,有参函数uint x,y;for(x=xms;x0;x-) for(y=110;y0;y-);/在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面write_1602com(uchar com

4、)/液晶写入指令函数rs=0;/数据/指令选择置为指令rw=0; /读写选择置为写P0=com;/送入数据delay(1);en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);en=0;/en由高变低,产生下降沿,液晶执行命令write_1602dat(uchar dat)/液晶写入数据函数rs=1;/数据/指令选择置为数据rw=0; /读写选择置为写P0=dat;/送入数据delay(1);en=1; /en置高电平,为制造下降沿做准备delay(1);en=0; /en由高变低,产生下降沿,液晶执行命令lcd_init()/液晶初始化函数write_1602com(0x38)

5、;/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标write_1602com(0x06);/整屏不移动,光标自动右移write_1602com(0x01);/清显示write_1602com(yh+1);/日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a14;a+)write_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分/delay(3);write_1602com(er+2);/时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a0;a-)IO=ACC0;SCLK=0;S

6、CLK=1;ACC=ACC1;uchar read_byte()/读一个字节RST=1;for(a=8;a0;a-)ACC7=IO;SCLK=1;/下降沿读数据SCLK=0;ACC=ACC1;return (ACC);void write_1302(uchar add,uchar dat)/向1302芯片写函数,指定写入地址,数据RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=

7、0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制 uchar Decimal; Decimal=bcd4; return(Decimal=Decimal*10+(bcd&=0x0F);void ds1302_init() /1302芯片初始化子函数(2012-07-20,12:00:00,week4)RST=0;SCLK=0;write_1302(0x8e,0x00); /允许写,禁止写保护 write_13

8、02(0x8e,0x80); /打开写保护 /温度显示子函数void write_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add); /er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf); /显示温度的小圆圈符号,0xd

9、f是液晶屏字符库的该符号地址码 write_1602dat(0x43); /显示C符号,0x43是液晶屏字符库里大写C的地址码/时分秒显示子函数void write_sfm(uchar add,uchar dat)/向LCD写时分秒,有显示位置加、现示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字

10、的LCD1602显示码/年月日显示子函数void write_nyr(uchar add,uchar dat)/向LCD写年月日,有显示位置加数、显示数据,两个参数uchar gw,sw;gw=dat%10; /取得个位数字sw=dat/10; /取得十位数字write_1602com(yh+add); /设定显示位置为第一个位置+addwrite_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码/写星期函数void write_week(uchar week)write_1

11、602com(yh+0x0c);/星期字符的显示位置switch(week)case 1:write_1602dat(M);/星期数为1时,显示 write_1602dat(O); write_1602dat(N); break; case 2:write_1602dat(T);/星期数据为2时显示 write_1602dat(U); write_1602dat(E); break;case 3:write_1602dat(W);/星期数据为3时显示 write_1602dat(E); write_1602dat(D); break;case 4:write_1602dat(T);/星期数据为

12、4是显示 write_1602dat(H); write_1602dat(U); break;case 5:write_1602dat(F);/星期数据为5时显示 write_1602dat(R); write_1602dat(I); break;case 6:write_1602dat(S);/星期数据为6时显示 write_1602dat(T); write_1602dat(A); break;case 7:write_1602dat(S);/星期数据为7时显示 write_1602dat(U); write_1602dat(N); break;/键盘函数void keyscan()if(key1=0)/key1为功能键(设置键) delay(9);/延时,用于消抖动if(key1=0)/延时后再次确认按键按下while(!key1);key1n+;if(key1n=9)key1n=1;/设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号