1602液晶显示DS1302实时时钟程序要点_第1页
1602液晶显示DS1302实时时钟程序要点_第2页
1602液晶显示DS1302实时时钟程序要点_第3页
1602液晶显示DS1302实时时钟程序要点_第4页
1602液晶显示DS1302实时时钟程序要点_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、#include <reg51.h>#include <intrins.h> unsigned char code dis_week="SUN,MON,TUE,WED,THU,FRI,SAT"unsigned char code para_month13=0,0,3,3,6,1,4,6,2,5,0,3,5;/ 星期月参变数unsigned char data dis_buf116;unsigned char data dis_buf216;区unsigned char data year,month,date,week;/ unsigned char

2、 data armhour,armmin,armsec;/ unsigned char data hour,min,sec,sec100; / unsigned char data flag,vkey,skey;/ 当前值 bit alarm; / 标识是否启用闹钟, sbitrs = P2A0;(H/L)sbitrw = P2A1;/lcd 上排显示缓冲区/lcd 下排显示缓冲年、月、日、星期 闹钟时、分、秒 时、分、秒、百分之一秒sbitep=P2A2;sbitPRE =P1A6;sbitSET =P1A7;sbitSPK =P3A7;void delayms(unsigned char

3、ms); / bit lcd_busy();void lcd_wcmd(char cmd);void lcd_wdat(char dat);void lcd_pos(char pos);void lcd_init();void pro_timedate();void pro_display();void pro_key();void time_alarm();unsigned char scan_key(); unsigned char week_proc();bit leap_year();void lcd_sef_chr();设置状态计数标志、按键先前值、按键1- 启用, 0- 关闭/LC

4、D 数据/ 命令选择端/LCD 读 / 写选择端 (H/L)/LCD 使能控制/ 调整键 (k3)/ 调整键 (k4)延时程序/测试LCD忙碌状态程序/写入指令到LCD程序/写入数据到LCD程序/LCD 数据指针位置程序/LCD 初始化设定程序/ 时间日期处理程序/ 显示处理程序/ 按键处理程序/ 定时报警功能 ( 闹钟)/ 按键扫描程序/ 星期自动计算与显示函数/ 判断是否为闰年/LCD 自定义字符程序void update_disbuf(unsigned char t1,unsigned char t2,unsigned char dis_h,unsigned char dis_m,uns

5、igned char dis_s);/ 更新显示缓冲区函 数/ 延时程序void delay(unsigned char ms)while(ms-)/执行一条_nop_()指令 unsigned char i; for(i = 0; i 250; i+) nop();为一个机器周期_nop_();_nop_(); _nop_(); /测试LCD忙碌状态bit lcd_busy()bit result; rs = 0;rw = 1; ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(PO&0x80); /LCD 的 D0-D7 中,

6、D7=1 为忙碌,D7=0 为空 闲ep = 0;return result;/ 写入指令到 LCDvoid lcd_wcmd(char cmd)while(lcd_busy();/ 当 lcd_busy 为 1 时,再次检测 LCD忙碌状态,lcd-busy 为0时,开始写指令 一rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_(); ep = 0;/ 写入数据到 LCDvoid lcd_wdat(char dat

7、)while(lcd_busy();/ 当 lcd_busy 为 1 时,再次检测 LCD忙碌状态,lcd-busy为0时,开始写数据 一rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_(); ep = 0;/LCD 数据指针位置程序void lcd_pos(char pos)Icd_wcmd(pos|0x80); /数据指针=80+地址码(00H27H,40H67H)/设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00-0x0

8、7,即 可定义 8 个字符 )/ 这里我们设定把一个自定义字符放在 0x00 位置( 000), 另一个放在 0x01 位子 (001)void lcd_sef_chr()/ 第一个自定义字符lcd_wcmd(0x40); /"01 000 000"第 1 行地址 (D7D6 为地址设定命令形式D5D4D3为字符存放位置(0-7) ,D2D1D为字符行地址(0-7)lcd_wdat(0x1f); /"XXX 11111" 为任意数 ( 一般用 000),lcd_wcmd(0x41); /"01 000 001" lcd_wdat(0x

9、11); /"XXX 10001" lcd_wcmd(0x42); /"01 000 010" lcd_wdat(0x15); /"XXX 10101" lcd_wcmd(0x43); /"01 000 011" lcd_wdat(0x11); /"XXX 10001" lcd_wcmd(0x44); /"01 000 100" lcd_wdat(0x1f); /"XXX 11111" lcd_wcmd(0x45); /"01 000 101&q

10、uot; lcd_wdat(0x0a); /"XXX 01010" lcd_wcmd(0x46); /"01 000 110" lcd_wdat(0x1f); /"XXX 11111" lcd_wcmd(0x47); /"01 000 111" lcd_wdat(0x00); /"XXX 00000" / 第二个自定义字符 lcd_wcmd(0x48); /"01 001 000" lcd_wdat(0x01); /"XXX 00001" lcd_wcmd

11、(0x49); /"01 001 001" lcd_wdat(0x1b); /"XXX 11011" lcd_wcmd(0x4a); /"01 001 010" lcd_wdat(0x1d); /"XXX 11101" lcd_wcmd(0x4b); /"01 001 011" lcd_wdat(0x19); /"XXX 11001" lcd_wcmd(0x4c); /"01 001 100" lcd_wdat(0x1d); /"XXX 1110

12、1" lcd_wcmd(0x4d); /"01 001 101" lcd_wdat(0x1b); /"XXX 11011" lcd_wcmd(0x4e); /"01 001 110" lcd_wdat(0x01); /"XXX 00001" lcd_wcmd(0x4f); /"01 001 111" lcd_wdat(0x00); /"XXX 00000"D4D3D2D1D为字符行数据(1-点亮,第1行数据(D7D6D为XXX表示 0-熄灭)第 2 行地址 第 2

13、行数据 第 3 行地址 第 3 行数据 第 4 行地址 第 4 行数据 第 5 行地址 第 5 行数据 第 6 行地址 第 6 行数据 第 7 行地址 第 7 行数据 第 8 行地址 第 8 行数据第 1 行地址 第 1 行数据 第 2 行地址 第 2 行数据 第 3 行地址 第 3 行数据 第 4 行地址 第 4 行数据 第 5 行地址 第 5 行数据 第 6 行地址 第 6 行数据 第 7 行地址 第 7 行数据 第 8 行地址 第 8 行数据/LCD 初始化设定 void lcd_init()lcd_wcmd(0x38);/设置LCD为16X2显示,5X7点阵,八位数据借delay(1)

14、;lcd_wcmd(0x0c); "-")delay(1); lcd_wcmd(0x06); 屏显示不移动 )delay(1); lcd_wcmd(0x01); delay(1);/LCD 开显示及光标设置 (光标不闪烁 , 不显示/LCD 显示光标移动设置 (光标地址指针加 1, 整/清除LCD的显示内容/闰年的计算bit leap_year()bit leap;if(year%4=0&&year%100!=0)|year%400=0)/ 闰年的条件 leap=1;elseleap=0;return leap; / 星期的自动运算和处理unsigned c

15、har week_proc() unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;/ 自 00 年起到 year 所经历的闰年 数if( leap_year()&& month=2 ) / 既是闰年且是 1 月和 2 月 c=5;elsec=6;week=(year+para_monthmonth+date+num_leap+c)%7;/ 计算对应的星 期return week; / 更新显示缓冲区void update_disbuf(unsigned char t1,unsigne

16、d char t2,unsigned char dis_h,unsigned char dis_m,unsigned char dis_s) dis_buf10=t1;/dis_buf11=0x20;/ 空格dis_buf12=50;/'2'dis_buf13=48;/'0'dis_buf14=year/10+48;dis_buf15=year%10+48;dis_buf16=0x2d;dis_buf17=month/10+48;dis_buf18=month%10+48;dis_buf19=0x2d; /'-'dis_buf110=date/1

17、0+48;dis_buf111=date%10+48;dis_buf112=0x20;dis_buf113=dis_week4*week;dis_buf114=dis_week4*week+1;dis_buf115=dis_week4*week+2;dis_buf20=t20;dis_buf21=t21;dis_buf22=t22;dis_buf23=t23;dis_buf24=t24;dis_buf25=t25;dis_buf26=0x20;if (alarm)dis_buf27=0x01;二个自定义字符)elsedis_buf27=0x20;致dis_buf28=dis_h/10+48;d

18、is_buf29=dis_h%10+48;dis_buf210=0x3a;dis_buf211=dis_m/10+48;dis_buf212=dis_m%10+48;dis_buf213=0x3a;dis_buf214=dis_s/10+48;dis_buf215=dis_s%10+48; / 空格/alarm=1 ,显示闹钟启用标致 (第/alarm=0 ,不显示闹钟启用标/':'/ 时间和日期处理程序void pro_timedate()sec+; if(sec > 59)sec = 0; min+; if(min>59)min=0;hour+;if(hour&

19、gt;23)hour=0; date+; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)if (date>31)date=1;month+; / 大月 31 天if(month=4|month=6|month=9|month=11)date=1;month+;date=1;month+;date=1;month+;if (date>30)/ 小月 30 天 if (month=2)if( leap_year()/ 闰年的条件if (date>29)/ 闰年 2 月为 29 天elseif (date&

20、gt;28)/ 平年 2 月为 28 天if (month>12) month=1;year+;if (year>99) year=0; week_proc();if (sec=armsec && min=armmin && hour=armhour)/ 闹钟启用时,报警if (alarm)TR1=1;时间到 , 启动 Timer1 / 显示处理程序void pro_display()unsigned char i;lcd_pos(0x00);for (i=0;i=15;i+)lcd_wdat(dis_buf1i); lcd_pos(0x40);fo

21、r (i=0;i=15;i+) lcd_wdat(dis_buf2i); /Timer0 中断处理程序 , 秒的产生void timer0() interrupt 1 THO=Oxdc;/TimerO 置 10ms定时初值dc00H(2A16=65536D,dc00H=56320D)TL0=0x00;/ 定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)sec100+;if(sec100 >= 100)/1 秒时间 (100*10ms=1000ms=1s)sec100 = 0;pro_timedate();/ 调用时间和日期处理程

22、序if(sec&0x01)/"willar" 闪一秒,停一秒update_disbuf(0x00,"",hour,min,sec);/0x00 表示显示 00 位置的自定义字符else update_disbuf(0x00,"willar",hour,min,sec);pro_display();/ 调用显示处理函数/ 按键扫描程序unsigned char scan_key()skey=0x00;/给变量 vkey 置初值skey|=PRE;/读取PRE键的状态skey=skey<<1;/ 将PRE键的状态存于s

23、key的B1位skey|=SET;/读取SET键的状态,并存于skey的B0位return skey;/返回skey的键值(即PRE,SET的状态)/ 外部中断 INT0 中断处理程序void int0() interrupt 0TR0=0;/ 禁止 Timer0IE=0;/ 禁止中断lcd_wcmd(0x0e); / 显 示光标 "_", 整个光标不闪烁alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); / 更 新显示数据, 0x50 表示要显示 "P"pro_di

24、splay();/ 调用显示处理程序lcd_pos(0x47);/ 使光标位于第一个调整项下flag=0;vkey=0x03;while(flagAOxOa)skey = scan_key();/ 扫描按键状态if (skeyZkey)/ 若skey 与 vkey 相同 , 跳出循环 , 相异执行循环体 delay(1O);/去按键抖动skey = scan_key();/ 转回扫描按键状态if (skeyAvkey)/ 若skey 与 vkey 相同 , 跳出循环 , 相异执行循环体 vkey=skey;/将 skey 的值付给 vkeyif (skey=OxO1)/PRE键按下flag+;

25、/ 调整标志位加 1switch(flag)/ 将光标置于相应调整位置case 1: lcd_pos(0x49);break;/ 光标置小时报警设置位e 2: lcd_pos(0x4c);break;e 3: lcd_pos(0x4f);break;cas / 光标置分钟报警设置位cas / 光标置秒时报警设置位置case 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break;/ 光标置年调整位e 5: lcd_pos(0x08);break;e 6: lcd_pos(0

26、x0b);break;e 7: lcd_pos(0x49);break;e 8: lcd_pos(0x4c);break;e 9: lcd_pos(0x4f);break;ault:break;(skey=0x02) /SET 键按下/ 转设置按键处理程序cas / 光标置月调整位置cas / 光标置日调整位置cas / 光标置时调整位置cas / 光标置分调整位置cas / 光标置秒调整位置def if pro_key();/ 设/ 清/ 主程序, 初始化及初值设定 void main()lcd_init();LCDlcd_sef_chr();号hour=0;min=0;sec=0; 显示a

27、rmhour=0;armmin=0;armsec=0; 初值year= 5; month=1;date=1; 期显示week_proc();alarm=1; 用闹钟IE = 0x8f;断,INT0,INT1,Timer0,Timer1开中断IP = 0x04;断最高优先级IT0=0;IT1=0;INT0,INT1 设置为电平触发方式(注意,TMOD = 0x11;工作于模式 1, 16 位定时方式TH0 = 0xdc;TL0 = 0x00; 初值TH1 = 0xff;TL1 = 0x00;值TR0 = 1;动TR1 = 0;/ 初始化/ 写入自定义字符/ 开机时的时 , 分, 秒/ 开机时的时

28、 , 分, 秒报警/ 开机时的年 , 月, 日, 星/ 初始开机,启/CPU 开中/ 设置 INT0 为中/ 外部触发不要选边沿方式,易误动)/Timer0,Timer1/TimerO 置 10ms定时/Timer1 置初/Timer0 启lcd_wcmd(0x0c);置LCD开显示及光标不闪烁,不显示"-lcd_wcmd(0x01);除LCD的显示内容IE=0x8f;/CPU开中断,INT0,INT1,开中断 TR0=1;/Timer0 启动while(1);/ 设置按键处理程序void pro_key()switch (flag)case 0:alarm=!alarm; / 启用

29、或关闭闹钟 ( alarm=1: 启用 ,alarm=0: 关闭 ) update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); / 更新显示数据pro_display();/ 调用显示处理lcd_pos(0x47);break;/ 光标回到原调整位置case 1:armhour+;if (armhour>23) armhour=0; update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); / 更新显示数据pro_display();/ 调用显示处理 l

30、cd_pos(0x49);break; / 光标回到原调整位置 case 2:armmin+;if (armmin>59) armmin=0; update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display(); lcd_pos(0x4c);break;case 3:armsec+;if (armsec>59) armsec=0; update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display(); lcd_pos(

31、0x4f);break;case 4:year+;if(year> 99) year= 0;week_proc();/ 星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x05);break;case 5:month+;if (month>12) month=1;week_proc();/ 星期自动运算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x08);break;c

32、ase 6:date+;if (month=1|month=3|month=5|month=7|month=8|month=10|month= 12)if (date>31) date=1; / 大月 31天if (month=4|month=6|month=9|month=11)if (date>30) date=1; / 小月 30天if (month=2)if(leap_year()/ 闰年的条件if (date>29) date=1; / 闰年 2 月为 29 天elseif (date>28) date=1; / 平年 2 月为 28 天week_proc()

33、;/ 星期自动运算update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x0b);break;case 7:hour+;if (hour>23) hour=0;update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x49);break;case 8:min+;if (min>59) min=0;update_disbuf(0x50,"time:",hour,min,sec)

34、;pro_display();lcd_pos(0x4c);break;case 9:sec+;if (sec>59) sec=0;update_disbuf(0x50,"time: ",hour,min,sec);pro_display(); lcd_pos(0x4f);break; default:break ;/Timer1 中断处理程序 , 产生报警的声音 void timer1() interrupt 3TH1=0xff;TL1=0x00; SPK=SPK;/ 外部中断 INT1 中断处理程序 , 停止报警声音 void int1() interrupt 2i

35、f(TR1) TR1=0;/DS1302 时钟程序#include <stc89c52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int/ 少占鱼制作 河北正定欢迎您 长沙航空职业技术学院 /2010 年 QQ:411656434/ 版权所有 :#define LCD1602_RS P2_5 / 定义引脚#define LCD1602_RW P2_6#define LCD1602_E P2_7#define LCD1602_IO P0#define Busy 0x8

36、0 /用于检测LCD1602犬态字中的Busy标识const uchar num=" 3456789+"uchar code a = " E N v"void WriteData(uchar DAT);void WriteCommand(uchar command,BuysC); uchar ReadData(void);void Readbusy(void);void LCD1602_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void Displaystring(ucha

37、r X, uchar Y, uchar *DData);void Delay5Ms(void);void Delay400Ms(void);void delayms(uint);void delays(uint m) ;void delayus(uchar x) ;sbit DS1302_CLK =P2A0;/ P1A0;sbit DS1302O =卩2八1; PMi;sbit DS1302_RST =P2A2;/ P1A2;uchar shuju;初始化时unsigned char time=0x11,0x03,0x28,0x01,0x12,0x39,0x00;/ 间年月日星期时分秒ucha

38、r Display_Buffer12="12:25:00"/ 时、分、秒 的格式uchar riqi12="11-03-28"/ 年、月、日 的格式uchar xingqi5="week"/ 星期unsigned char second,minute,hour,week,day,month,year;1602函数*/* /void delays(uint m)uint i,j;for(i=0;i<m;i+)for(j=0;j<1000;j+); void Delay(void)unsigned char i; unsign

39、ed int j;for(i=0;i<200;i+) for(j=300;j>0;j-);/*函数功能:向DS1302送一字节数据子程序入口参数 :出口参数 :*/void InputByte(unsigned char BYTE)char i;for(i=8;i>0;i-) / 前面在read_ds1302()函数里已经把 CLK青0 了DS1302_CLK=0;/ 这里再清 0一次,看着清楚。呵呵_nop_();DS1302_IO=(bit)(BYTE&0x01);/ 取出低位数据给数据引脚_nop_();_nop_();DS1302_CLK=1;/ 置1,时钟上

40、升沿,引脚上的数据传入 1 302寄存器中_nop_();_nop_();BYTE>>=1;因为这里移位的BYTE不是最后要的结果,虽然最后循环完会多移一位,但没影响。_nop_();/ 循环最后一次后,时钟状态是高电平。_nop_();_nop_();/*函数功能:读DS130L个字节子程序,读数据是下降沿读入口参数 :出口参数 :*/unsigned char OutputByte(void)unsigned char i;unsigned char ucdat=0;for(i=8;i>0;i-) / 前面时钟状态是高电平。ucdat>>=1; / 移位注意,

41、移位不能放在循环语句末,否则最后循环完会多 移一位。得到结果就错了。DS1302_IO=1;/ 单片机端置高防止破坏 1 302传来的数据,开始接收 1302端 的高低数据对数据线的改变。DS1302_CLK=0;/ 紧接着时钟变低,下降沿数据输出。if(DS1302_IO)/ 数据已经输出,判断是 1 还是 0.ucdat|=0x80;/ 如果引脚是高则此位保存 1 。低不保存, 右移的时候自然补 0 了。_nop_();DS1302_CLK=1;/ 读完一位数据,再置高时钟,准备读下一个。_nop_();/ 延时一下。/ 读完数据还是把时钟清 0,下次好直接用DS1302_CLK=0;/

42、读完数据还是把时钟清 0 ,下次好直接用 _nop_();_nop_();DS1302_RST=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();DS1302_CLK=0;_nop_();_nop_();_nop_();_nop_();DS1302_RST=0;_nop_();_nop_();_nop_();_nop_();_nop_();return(ucdat);/*函数功能:向DS1302某地址写一字节数据子程序入口参数 :addr,TDat出口参数 : */void write_ds1302(unsigned char addr,uns

43、igned char TDat)DS1302_RST=0;_nop_();_nop_();DS1302_CLK=0;_nop_();_nop_();DS1302_RST=1;_nop_();_nop_();_nop_();_nop_();InputByte(addr);/ 先写地址_nop_();_nop_();InputByte(TDat);/ 再写数据DS1302_IO=1;/ 单片机端置高防止破坏 1302 传来的数据,开始接收 1302 端的 高低数据对数据线的改变。DS1302_RST=0;delayus(10);DS1302_CLK=0;delayus(10);*函数功能:读DS1

44、302地址子程序入口参数 :add出口参数 :timedata*/unsigned char read_ds1302(unsigned char addr)unsigned char timedata;DS1302_RST=0;_nop_();DS1302_CLK=0;_nop_();DS1302_RST=1;InputByte(addr);/ 先写入读命令timedata=OutputByte();/ 再读出数据DS1302_IO=1;/ 单片机端置高防止破坏 1 302传来的数据,开始接收 1302端的 高低数据对数据线的改变。DS1302_RST=0;delayus(10);DS1302

45、_CLK=0;delayus(10);return(timedata);/*函数功能:初始化DS1302子程序*入口参数 :time( 全局变量 )出口参数 :*/ void initial_ds1302()DS1302_IO=1;/ 单片机端置高防止破坏 1302 传来的数据,开始接收 1302 端的 高低数据对数据线的改变。DS1302_RST=0;delayms(100);DS1302_CLK=0;delayms(100);write_ds1302(0x8e,0x00); /写保护寄存器,在对时钟或RAM写前W定要为0write_ds1302(0x8c,time0);/write_ds1

46、302(0x88,time1);/write_ds1302(0x86,time2);/write_ds1302(0x8A,time3);/星期write_ds1302(0x84,time4);/write_ds1302(0x82,time5);/write_ds1302(0x80,time6);/write_ds1302(0x8e,0x80); /写保护寄存器*函数功能:读DS1302时间子程序入口参数 :出口参数 : 全局变量 (second,minute,hour,week,day,month,year)*/void read_time()second=read_ds1302(0x81);

47、 / 秒寄存器 _nop_();minute=read_ds1302(0x83); / 读分 _nop_();hour=read_ds1302(0x85); / 读时 _nop_();week=read_ds1302(0x8B); / 读星期 _nop_();day=read_ds1302(0x87); / 日 _nop_();month=read_ds1302(0x89); / 月 _nop_();year=read_ds1302(0x8d); / 年 _nop_(); void main(void)uchar shuju;delayms(2);Delay400Ms(); / 启动等待,等L

48、CM讲入工作状态 delays(1);LCD1602_Init(); /LCM 初始化Delay5Ms(); / 延时片刻(可不要)DS1302_RST=0;delayms(1000);DS1302_CLK=0;delayms(1000); shuju=ReadData(); Displaystring(2, 0, a); Delay();Delay(); delayms(2000); Displaystring(3,0,riqi); Displaystring(12,0,xingqi); delayms(4000);/ initial_ds1302(); / delayms(1200);wh

49、ile(1)read_time();/ 读取时间 Display_Buffer0=hour/16+'0'/ Display_Buffer1=hour%16+'0'/ Display_Buffer3=minute/16+'0'/ 面液晶显示。Display_Buffer4=minute%16+'0'/ 面液晶显示。Display_Buffer6=second/16+'0'Display_Buffer7=second%16+'0' riqi0=year/16+'0'riqi1=year%

50、16+'0'riqi3=month/16+'0'riqi4=month%16+'0'riqi6=day/16+'0'riqi7=day%16+'0'Displaystring(3,0,riqi);初始化 DS1302存储下时的高位进数组存储下时的低位进数组注意 +'0' 后存储的是 ASCII注意 +'0' 后存储的是 ASCII用于下用于下delayms(1);DisplayOneChar(14,1,week+'0');Displaystring(3,1,Display_Buffer);/ 写数据void WriteData(uchar DAT)Readbusy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_IO = DAT;LCD1602_E = 0; / 若晶振速度太高可以在这后加小的延时LCD1602_E = 0; / 延时LCD1602_E = 1;LCD1602_E=1;LCD1602_E=0; / 写指令void WriteCommand(uchar command,

温馨提示

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

评论

0/150

提交评论