智能电子钟 (LCD显示)
课 程 设 计
课程名称 单片机原理与接口技术 题目名称 智能电子钟
学生学院 材料与能源学院
专业班级
学 号
学生姓名
指导教师
2016年06月15日
广东工业大学课程设计任务书
题目名称
学生学院
专业班级 姓 名 学 号 智能电子钟(LCD 显示) 材料与能源学院
一、课程设计的内容
用STC89C52RC 单片机制作一智能电子钟:
1. 设计并绘制硬件电路图;
2. 绘制PCB 板图(条件许可的话可进行PCB 板的制作)并焊接好元器件;
3. 编写程序并将调试好的程序固化到单片机中。
二、课程设计的要求与数据
以STC89C52RC 单片机为核心,制作一个LCD 显示的智能电子钟:
(1) 计时:秒、分、时、天、周、月、年。
(2) 自由调整时间。
(3) 定时输出,可任意关断,重置。
(4) 倒计时功能,最高可定时100小时。
(5) 计时功能,最高可计时100小时。
(6) 计时精度:误差≤1秒/月(具有微调设置)。
(7) 键盘采用动态扫描方式查询。所有的查询、设置功能均由矩阵键盘完
成。
三、课程设计应完成的工作
1. 完成下载线的制作,为程序下载到单片机芯片中做好准备;
2. 完成软件、硬件的设计,并进行硬件的焊接制作,并将调试成功的程序
固化到单片机中,最后进行硬件与软件的调试;
3. 撰写设计说明书。
四、课程设计进程安排
摘要
随着时代的进步和发展,单片技术已经普及到我们的生活、工作、科研等各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的LCD 显示时钟的设计,时间可由键盘调整。主要用到的芯片有单片机STC89C52RC 、液晶显示屏LCD1602A 模块、时钟芯片DS1302模块。
关键词:单片机STC89C52RC 、LCD1602A 模块、DS1302模块
目录
1 系统需要分析 . .............................................................................................................................. 5
1.1 智能电子钟研究背景及意义 . .......................................................................................... 5
1.2 系统实用功能分析 . .......................................................................................................... 5
2 设计要求与方案 . .......................................................................................................................... 6
2.1 设计要求 . .......................................................................................................................... 6
2.1.1 基本要求 . ............................................................................ 错误!未定义书签。
2.1.2发挥部分 . ............................................................................. 错误!未定义书签。
2.2 系统基本方案选择 . .......................................................................................................... 6
2.2.1 芯片的选择 . .......................................................................................................... 6
2.2.2 显示模块选择方案 . .............................................................................................. 7
2.2.3 时钟信号的选择方案 . .......................................................................................... 7
2.3 电路设计最终方案决定 . .................................................................................................. 7
3 系统硬件设计与实现 . .................................................................................................................. 8
3.1 智能电子钟设计框图 . ...................................................................................................... 8
3.2 系统硬件概述 . .................................................................................................................. 8
3.3 硬件电路结构设计 . .......................................................................................................... 8
3.3.1 单片机主控制模块的设计 . .................................................................................. 8
3.3.2 显示模块的设计 . .................................................................................................. 8
3.3.3 LCD原理说明 . ..................................................................... 错误!未定义书签。
3.3.4 开关模块说明 . ...................................................................................................... 9
4 系统软件设计 . ............................................................................................................................ 13
4.1程序流程框图 . ................................................................................................................. 13
4.2 LCD的初始化及显示程序 . ............................................................................................. 14
5 系统调试..................................................................................................................................... 14
5.1 软件调试 . ........................................................................................................................ 14
5.2 硬件调试 . ........................................................................................................................ 14
参考文献......................................................................................................................................... 14
附录 ................................................................................................................................................ 15
1 系统需要分析
1.1 智能电子钟研究背景及意义
20世纪末,电子技术得到了飞速发展,在此推动下现代电子产品几乎渗透到了社会的各个领域,有力地推动和提高了社会生产力的发展和信息化程度,同时现代电子产品性能进一步提升,产品的更新迭代也越来越快。时间对人们来说是那么宝贵,工作的忙碌和繁杂易使人们忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己和他人造成很大的麻烦。平时我们要求上班准时,约会或者召开会议必然要提及时间,火车要准时到达,航班要准时起飞,工业生产中的很多环节也需要时间来确定工序替换时刻,等等。所以说能随时知道准确的时间是我们生活中必不可少的一件事情。
想知道时间,收表当然是很好的选择,但是在忙碌中,我们还需要一个“助理”时不时的给我们提醒时间。所以,手表最好有一个定时系统,随时提醒忘记时间的人。最早能够定时、报时的时钟属于机械式钟表,但这种时钟收到机械结构、动力和体积的限制,在功能性以及造价上都没有办法与电子时钟相媲美。
电子时钟是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人、家庭、车站、办公室等场所,成为人们日常生活中的必需品。由于集成电路的发展和石英晶振的广泛应用,使得电子时钟的精度远远超过老式钟表,钟表的数字化跟人们生产和生活带来了极大的方便,而且大大扩展了钟表的功能。诸如整点报时、定时报警、定时广播、自动启闭路灯、定时开关烘箱、同多动力设备、甚至各种定时电器的自动启动等,所有这些,都是以电子时钟为基础的。因此,研究电子时钟及其扩展应用,都有非常重要的现实意义。
1.2 系统实用功能分析
本文研究的数字时钟是一种利用单片机原理实现对时、分、秒计时的装置,与机械时钟相比具有更高准确性和直观性,且无机械装置,具有更长的使用寿命。其实现了对时、分、秒的准确及时、计时及定时功能。
2 设计要求与方案
2.1 设计要求
以STC89C52RC 单片机为核心,制作一个LCD 显示的智能电子钟:
(1) 计时:秒、分、时、天、周、月、年。
(2) 自由调整时间。
(3) 定时输出,可任意关断,重置。
(4) 倒计时功能,最高可定时100小时。
(5) 计时功能,最高可计时100小时。
(6) 计时精度:误差≤1秒/月(具有微调设置)。
(7) 键盘采用动态扫描方式查询。所有的查询、设置功能均由矩阵键盘完
成。
2.2 系统基本方案选择
2.2.1 芯片的选择
采用STC89C52,其是STC 公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash ,512字节RAM , 32 位I/O 口线,看门狗定时器,内置4KB EEPROM , MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz ,6T/12T可选。
2.2.2 显示模块选择
采用LCD 显示,电路较为简单,且在软件设计上也相对简单,功耗较低,能满足设计最优的要求。LCD1602A 模块集成了驱动电路和背光等,能够显示16*02(16列2行)即32个字符。
2.2.3 时钟信号的选择
采用DS1302时钟芯片实现时钟计时。DS1302时钟芯片是一种高性能的时钟芯片,可自动实现对秒、分、时、日、周、月、年及闰年补偿的年进行计数,精度较高,256位的RAM 作为数据暂存区,工作电压2.5V ~5.5V 范围内,2.5V 时耗电小于300nA 。且硬件电路较为简单,程序设计容易实现。
DS1302模块接有32.768K 晶振和纽扣电池作为备用电源,可实现长时间不停地计时。
2.2.4 按键选择
选择4*4矩阵键盘作为功能实现和调节按键。矩阵键盘又称行列式键盘,它是用4条I/O线作为行线,4条IO 线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键个数是4*4个。这种行列式键盘结构能够有效地提高单片机系统中I/O的利用率。
2.3 电路设计最终方案
宗上所述,对此次智能电子钟的方案选择为:采用STC89C52SC 芯片作为主控制系统并提供定时,并由DS1302模块提供时钟,LCD1602A 模块作为显示时间。
3 系统硬件设计与实现
3.1 智能电子钟设计框图
3.2 系统硬件概述
该电路是由STC89C52SC 单片机为控制核心,具有在线编程功能,低功耗,能在3V 超低工作;晶振电路外接晶振;复位电路接按键复位系统;矩阵键盘由4*4行列式键盘构成;LCD 显示模块由LCD1602A 构成;时钟电路模块由DS1302芯片等组成。
3.3 硬件电路结构设计
3.3.1 单片机主控制模块的设计
图1为用proteus 软件画的时钟系统原理图。
3.3.2 LCD显示模块
图2为LCD 显示模块原理图。如图所示,时钟信号显示在LCD 上,文字清晰可见而且
图1 时钟原理
图2 LCD1602A
省电也易于控制。数据的传输采用P0口,其引脚 VSS 接地,VDD 接VCC ,RS 、RW 、E 端分别接单片机引脚P2.0、P2.1、P2.2。而VEE 作为液晶显示器的灰度调节引脚,接一变阻器来改变其显示的清晰度。
3.3.3 矩阵键盘模块
图3为矩阵键盘模块。矩阵键盘又称行列式键盘,它是用4条I/O线作为行线,4条IO 线作为列线组成的键盘,8条线接到P1口上。在行线和列线的每一
个交叉点上,设置一个按键。这样键盘中按键个数是4*4个。这种行列式键盘结构能够有效地提高单片机系统中I/O的利用率。
矩阵键盘是嵌入式计算机系统中不可缺少的外围电路,是实现人机对话的纽带,借助键盘可以向计算机输入程序、置数、逻辑操作以及写入程序和程序检测等,可实现调试、计时、倒计时等功能。
图3 矩阵键盘
3.3.4 时钟系统模块
图4是时钟系统模块原理图。DS1302是美国 DALLAS 公司推出的一种
图4 时钟系统DS1302
高性能、低功耗的实时 时钟芯片,附加31字节静态 RAM,采用 SPI 三线接口与 CPU 进行 同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与 31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~ 5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电 方式,提供了对后背电源进行涓细电流充电的能力。DS1302的RST 端接P2.5口,SCLK 端接P2.6口,I/O端接P2.7口,VCC1端接备用电源纽扣电池,VCC2接5.0V 电源,X1、X2接32.768K 晶振。
3.3.5 蜂鸣器模块
图5 蜂鸣器模块
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于电子产品中作为发声器件。蜂鸣器I/O端接到P2.4口上,用三极管驱动,给低电平就能持续发声。
11
3.3.6 复位电路
图6 复位电路
图6为复位电路。只要按下按钮,给单片机RST 口加上超过2个机器周期的高电平,就能把单片机复位。
3.3.7 晶振电路
图7为晶振电路。STC19C51RC 单片机时钟信号由内部时钟方式产生,在XTAL1和XTAL2引脚外接晶振。图中,电容C1和C2的作用是稳定频率和快速起振,电容值22pF 。晶振CXY 的振荡频率为11.0592Hz 。
12
图7 晶振电路
4 系统软件设计 4.1
4.2 程序
具体程序见附录。
5 系统调试 5.1 软件调试
打开程序调试软件Keil uVision4,在里面新建一个工程,命名为:clock 。接着新建文件,编写相应程序。编写好的程序进行编译。如有错误,按照提示修改错误,直到程序编译通过。
5.2 硬件调试
用proteus 画好电路原理图,加上Keil uVision4生成的HEX 文件进行仿真,并修改程序逻辑错误,直到仿真无错误。
参考文献
[1].李朝青. 单片机原理及接口技术(第3版). 北京航天航空大学出版社,2005
年10月.
[2].求是科技. 单片机典型外围器件及应用实例. 北京:人民邮电出版社,2006
年2月.
[3].谭浩强.C 语言程序设计(第二版). 北京:清华大学出版社,1999年12
月.
[4].阎石. 数字电子技术基础(第五版). 高等教育出版社,1983年4月.
附录
#include #define uchar unsigned char #define uint unsigned int
sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; //1602
sbit rst=P2^5; sbit sclk=P2^6; sbit io=P2^7; //1302
sbit bee=P2^4; //蜂鸣器
uchar table[]=" 2016-06-12 MON"; //日期格式 uchar table1[]=" 00:00:00 A"; //时间格式 uchar time[]={11,1,11,11,00,00,00}; //年周月日时分秒
uchar code write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//1302写数据地址 uchar code read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //1302读数据地址
uchar n1,n2,y1,y2,r1,r2,s1,s2,f1,f2,m1,m2,xq; uchar key;//矩阵键盘数值 uchar sp,sn1,sn2;
void delay(uint z) //延时函数 {
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)//写1602命令 { rs=0; rw=0; e=0; P0=com; delay(5); e=1; delay(5); e=0;
}
void write_data(uchar dat)//写1602数据 { rs=1; rw=0; e=0; P0=dat; delay(5); e=1; delay(5); e=0;
}
void start() //1602初始化
}
void show_init()//在1602显示时间格式 { }
void write_byte(uchar dat)//向1302写1byte 数据 {
uchar i; for(i=8;i>0;i--) {
io=dat&0x01; sclk=1;
write_com(0x01);//清屏
write_com(0x38);//16*2显示,5*7点阵,8位数据 write_com(0x0c);//显示开,光标关
write_com(0x06);//显示方式:AC 加一,光标右移一格
uchar num;
write_com(0x80);//第一行显示数据 for(num=0;num
write_com(0x80+0x40);//第二行显示 for(num=0;num
write_data(table1[num]); write_data(table[num]);
}
}
dat=dat>>1;
void write_1302(uchar add,uchar dat)//按地址向1302写数据 { }
unsigned char read(uchar add)//按地址读取1302数据 {
uchar i,value=0x00; rst=0; sclk=0; rst=1;
write_byte(add); for(i=0;i
value=value>>1; sclk=0;
if(io) value=value|0x80; sclk=1;
rst=0; sclk=0; rst=1;
write_byte(add); write_byte(dat); sclk=1; rst=0;
} sclk=1; rst=0; return(value);
}
void time_pors()//取时间函数{ m1=time[6]/16;//秒 m2=time[6]%16;
f1=time[5]/16;//分 f2=time[5]%16;
s1=time[4]/16;//时 s2=time[4]%16;
r1=time[3]/16;//日 r2=time[3]%16;
y1=time[2]/16;//月 y2=time[2]%16;
n1=time[0]/16;//年 n2=time[0]%16;
xq=time[1];//星期
}
void show_date()//显示日期 { write_com(0x83); write_data(0x30+n1); write_data(0x30+n2); write_com(0x86); write_data(0x30+y1); write_data(0x30+y2); write_com(0x89); write_data(0x30+r1); write_data(0x30+r2);
}
void show_xq()//显示星期 { write_com(0x8d); if(time[1]==1)//SUN { write_data(0x53); write_data(0x55); write_data(0x4e);
}
if(time[1]==2)//MON { write_data(0x4d); write_data(0x4f); write_data(0x4e);
}
if(time[1]==3)//TUE
{ write_data(0x54); write_data(0x55); write_data(0x45);
}
if(time[1]==4)//WED { write_data(0x57); write_data(0x45); write_data(0x44);
}
if(time[1]==5)//THU { write_data(0x54); write_data(0x48); write_data(0x55);
}
if(time[1]==6)//FRI { write_data(0x46); write_data(0x52); write_data(0x49);
}
if(time[1]==7)//SAT { write_data(0x53); write_data(0x41); write_data(0x54);
}
21
}
void keyscan()//键盘扫描函数 { uchar temp; P1=0xfe;//第一行 delay(5); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0x7e:key=10;break; case 0xbe:key=3;break; case 0xde:key=2;break; case 0xee:key=1;break; }
while(P1!=0xfe) { P1=0xfe; delay(5);
}
}
22
}
P1=0xfd;//第二行 delay(5); temp=P1; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0x7d:key=11;break; case 0xbd:key=6;break; case 0xdd:key=5;break; case 0xed:key=4;break;
}
while(P1!=0xfd) { P1=0xfd; delay(5);
}
}
}
P1=0xfb;//第三行 delay(5); temp=P1;
23
temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0x7b:key=12;break; case 0xbb:key=9;break; case 0xdb:key=8;break; case 0xeb:key=7;break;
}
while(P1!=0xfb) { P1=0xfb; delay(5);
}
}
}
P1=0xf7;//第四行 delay(5); temp=P1; temp=temp&0xf0; if(temp!=0xf0) {
delay(5);
24
temp=temp&0xf0; if(temp!=0xf0) { temp=P1; switch(temp) { case 0x77:key=15;break; case 0xb7:key=14;break; case 0xd7:key=0;break; case 0xe7:key=13;break;
}
while(P1!=0xf7) { P1=0xf7; delay(5);
}
}
}
}
void show_time()//显示时间 { write_com(0x82+0x40); write_data(0x30+s1); write_data(0x30+s2); write_com(0x85+0x40); write_data(0x30+f1); write_data(0x30+f2);
write_com(0x88+0x40);
25
}
write_data(0x30+m2);
void choose1()//指定位置 { }
void change_num()//改变数字 {
switch(sn1) {
26
sn1++; switch(sn1) { }
case 1:write_com(0x84);break; case 2:write_com(0x86);break; case 3:write_com(0x87);break; case 4:write_com(0x89);break; case 5:write_com(0x8a);break; case 6:write_com(0x8d);break;
//年个位
//月十位 //月个位 //日十位 //日个位 //星期
case 7:write_com(0x82+0x40);break; //时十位 case 8:write_com(0x83+0x40);break; //时个位 case 9:write_com(0x85+0x40);break; //分十位 case 10:write_com(0x86+0x40);break; //分个位 case 11:write_com(0x88+0x40);break; //秒十位 case 12:write_com(0x89+0x40);break; //秒个位 case 13:write_com(0x83);sn1=0;break; //年十位
case 1:n2=key;write_data(0x30+n2);write_com(0x84);break;
case 2:if(key
if(y1==0){y2=key;write_data(0x30+y2);}if(y1==1&&key
case 4:if(key
if(r1
case 6:if(key
if(s1
void change_1302()//修改1302时间 {
time[6]=m1*16+m2; time[5]=f1*16+f2; time[4]=s1*16+s2; time[3]=r1*16+r2; time[2]=y1*16+y2;
27
}
case 9:if(key
case 11:if(key
}
time[0]=n1*16+n2;
write_1302(0x8e,0x00);//去除写保护 write_1302(0x80,0x00);//时间停止 write_1302(0x8c,time[0]);//写年 write_1302(0x8a,time[1]);//写星期 write_1302(0x88,time[2]);//写月 write_1302(0x86,time[3]);//写日 write_1302(0x84,time[4]);//写时 write_1302(0x82,time[5]);//写分 write_1302(0x80,time[6]);//写秒 write_1302(0x8e,0x80);//加上写保护 write_com(0x0c); //关光标
void choose2()//指定定时位置 { }
28
sn2++; switch(sn2) { }
case 1:write_com(0x83+0x40);break; case 2:write_com(0x85+0x40);break; case 3:write_com(0x86+0x40);break; case 4:write_com(0x88+0x40);break; case 5:write_com(0x89+0x40);break; case 6:write_com(0x82+0x40);sn2=0;break;
void change_num2()//改变数字 { }
void show_clock()//展示定时时间 { }
void mat()//减1s {
delay(900); if(m2>0) m2--;
if(m2==0&&(m1!=0||f2!=0||f1!=0||s2!=0||s1!=0)) m2=9; if(m2==9&&m1>0)
m1--;
29
switch(sn2) { }
case 0:s1=key;write_data(0x30+s1);write_com(0x82+0x40);break; case 1:s2=key;write_data(0x30+s2);write_com(0x83+0x40);break;
case 2:if(key
case 4:if(key
write_com(0x82+0x40);write_data(0x30+s1);write_com(0x82+0x40); write_com(0x83+0x40);write_data(0x30+s2);write_com(0x83+0x40); write_com(0x85+0x40);write_data(0x30+f1);write_com(0x85+0x40); write_com(0x86+0x40);write_data(0x30+f2);write_com(0x86+0x40); write_com(0x88+0x40);write_data(0x30+m1);write_com(0x88+0x40); write_com(0x89+0x40);write_data(0x30+m2);write_com(0x89+0x40);
}
if(m2==9&&m1==0&&(f2!=0||f1!=0||s2!=0||s1!=0)) m1=5; if(m2==9&&m1==5&&f2>0) f2--;
if(m2==9&&m1==5&&f2==0&&(f1!=0||s2!=0||s1!=0)) f2=9; if(m2==9&&m1==5&&f2==9&&f1>0) f1--;
if(m2==9&&m1==5&&f2==9&&f1==0&&(s2!=0||s1!=0)) f1=5; if(m2==9&&m1==5&&f2==9&&f1==5&&s2>0) s2--;
if(m2==9&&m1==5&&f2==9&&f1==5&&s2==0&&s1!=0) s2=9; if(m2==9&&m1==5&&f2==9&&f1==5&&s2==9&&s1>0) s1--;
void mat1()//加1s { }
void clock()//开始倒计时 {
uchar sk3=2;
30
delay(900); if(m2
if(m2==9) {show_clock();delay(1000);m2=0;} if(m2==0&&m1
m1++;
if(m2==0&&m1==5) m1=0; if(m2==0&&m1==0&&f2
write_com(0x0c); //关光标 show_clock(); //展示定时时间 while(sk3==2) {
uchar i; mat();//减1s show_clock(); keyscan(); if(key==11) { }
while(sk3==1) //按住11键(即B 键)超过1s 即可暂停计时 {
keyscan(); if(key==11) { }
if(key==10)//重置时间 {
s1=0; s2=0; f1=0; f2=0; m1=0; m2=0;
sk3=1; key=20;
sk3=2; key=20;
//继续计时
}
}
show_clock(); key=20;
i=(m1==0&&m2==0&f1==0&&f2==0&&s1==0&&s2==0); if(i) { sk3=0; bee=0; delay(2000); bee=1;
}
}
s1=0;s2=0;f1=0;f2=0;m1=0;m2=0; sn2=5; choose2(); show_clock(); write_com(0x0f);
}
void clock1()//开始计时 { uchar sk4=0;
write_com(0x0c);//关光标 while(sk4==0) { mat1();//加1s
show_clock();
}
}
if(key==12)//按住12键(即C 键)超过1s 暂停计时 { }
key=20; sk4=1; while(sk4==1) { }
keyscan(); if(key==12)//继续 { }
if(key==10)//重置 { }
key=20;
s1=0;s2=0;f1=0;f2=0;m1=0;m2=0; show_clock(); sk4=2; key=20; sk4=0;
write_com(0x0f);//光标关 sn2=5; choose2();
void read_1302()//读1302数据
uchar i,*p; p=read_add; for(i=0;i
}
time_pors();
}
void show_1602()//在1602显示时间{ show_date();//显示日期 show_xq(); //显示星期 show_time(); //显示时间
}
void key1()//调时间函数 { uchar sk1=1; key=20; write_com(0x8d); write_data(0x30+xq); write_com(0x8e); write_data(table[0]); write_com(0x8f); write_data(table[0]);
write_com(0x83);//指定年
}
while(sk1) { }
keyscan();//键盘扫描
if(key
if(key==13){key=20;change_1302();sk1=0;}//改1302时间
void key2()//定时 {
uchar sk2=1; key=20;
write_com(0x81);write_data(table[0]); write_com(0x82);write_data(table[0]); write_com(0x83);write_data(table[0]); write_com(0x84);write_data(table[0]); write_com(0x85);write_data(table[0]); write_com(0x86);write_data(table[0]); write_com(0x87);write_data(table[0]); write_com(0x88);write_data(table[0]); write_com(0x89);write_data(table[0]); write_com(0x8a);write_data(table[0]); write_com(0x8d);write_data(table[0]); write_com(0x8e);write_data(table[0]); write_com(0x8f);write_data(table[0]); s1=0;s2=0;f1=0;f2=0;m1=0;m2=0; show_clock();
}
write_com(0x0f); //光标开 while(sk2) { }
uchar i;
i=(m1==0&&m2==0&f1==0&&f2==0&&s1==0&&s2==0); keyscan();
if(key
if(key==11&&!i) {key=20;clock();}//开始倒计时 if(key==12&&i) {key=30;clock1();} //开始计时 if(key==14) { }
key=20; sk2=!sk2; write_com(0x0c);
write_com(0x81);write_data(table[1]); write_com(0x82);write_data(table[2]); write_com(0x85);write_data(table[5]); write_com(0x88);write_data(table[8]); show_xq();
void main() {
sn1=0;sn2=0;sp=0;key=20;bee=1; start();//初始化1602
show_init();//显示时间格式 while(1) {
read_1302();//读1302 show_1602();//显示1602 keyscan() ;
//键盘扫描
if(key==13) key1();//调时 if(key==14) key2();//定时
}
}