资源描述
CHANGSHA UNIVERSITY OF SCIENCE & TECHNOLOGY
现代电子系统设计综合实习
题目: 电子时钟
学生姓名: 张家庆
学 号: 201257050113
班 级: 电子1201
专 业: 电子信息工程
指导教师: 贺科学 范必双 袁志辉
目录
1 电子时钟简介 1
1.1 电子时钟概念 1
1.2 电子时钟设计要求 1
2 控制系统的硬件设计 2
2.1 硬件电路的总体框图 3
2.2 AT89C52单片机模块 3
2.3 液晶屏显示模块 5
2.4 储存芯片模块 6
2.5 蜂鸣器模块 7
2.6 键盘电路模块 7
2.7 晶振模块 8
3 控制系统的软件设计 8
3.1 软件的总体流程图 8
3.2 液晶屏 9
3.3 键盘扫描 11
3.4 蜂鸣器 12
3.5 存储芯片 13
3.6 软件仿真结果 15
4 实习总结 16
5 参考文献 17
附录A 硬件电路原理图 18
附录B 源程序代码 19
1 电子时钟简介
1.1 电子时钟概念
电子钟是一种利用数字电路来显示的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
1.3电子时钟的设计要求
本课题的主要内容是采用单片机实现一个简单的带闹钟定时功能的电子时钟,通过这个实习进一步加深《C语言程序设计》、《单片机原理及应用》等相关课程中的理论知识,熟练掌握单片机的编程、调试和应用系统的开发。
具体任务要求:
1、显示“时.分”进行显示,例如“12.18”,其中小数点每秒闪烁一次。
2、能够校正时间的时和分,按键分为5个功能键
(1)设定键:在计时模式时,按下此键时停止计时,进入设置状态,并切换到分钟的设置状态,再按一次切换到小时的设置状态,每按下一次完成时.分设置的切换,用点亮时.分个位的数码管小数点表示分或秒处于设置状态。在闹钟时间设定状态时,按下此键同样进入设置状态,完成分、秒设置的切换。
(2)递增键:在设置状态时,按一次递增键,被设置的分钟数字或时钟数字增1,持续按下数字自动增1。
(3)递减键:在设置状态时,按一次递减键,被设置的分钟数字或时钟数字减1,持续按下数字自动增1。
(4)计时键:在设置状态或闹钟时间设定状态时,按下此键则单片机切换到计时的显示模式,按照新的时.分设置值进行计时。如果已经在计时状态则此键无效。
(5)闹钟键:在计时模式时,按下此键则单片机切换到闹钟时间设定状态的显示模式。等待“设定键”、“递增键”、“递减键”来设定分钟和秒钟。
3、当计时到闹钟设定时间,用发光二极管闪烁,十秒钟后结束闪烁,正常计时。
发挥部分:用掉电不丢失的24C01存储闹钟时刻,用音乐作为闹铃
2 控制系统的硬件设计
2.1硬件电路的总体框图
总体电路是以单片机为主要控制器,控制LCD液晶屏来显示数字时间,并且LED灯的闪烁和蜂鸣器的蜂鸣也受其控制,更据具有检测扫描按键电路,并向24C02存储芯片读取和写入数据的作用。
LCD液晶显示电路
LED灯
AT89C52
晶振
·
蜂鸣器
按键
24C02存储芯片
图2.1 总体框图
2.2 AT89C52单片机模块
AT89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
图2.2 AT89C52单片
各引脚说明:
Vcc:电源电压
GND:接地
P0:P0 口是一组8 位漏极开路型双向I/O 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个TTL逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:P1 是一个带内部上拉电阻的8 位双向I/O 口, P1 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
P2口:P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对端口P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16 位地数据存储器(例如执行MOVX @DPTR 指令)时,P2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX@RI 指令)时,P2 口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。 P3口除了作为一般的I/0口线外,更重要的用途是它的第二功能,RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。
PSEN:外部程序存储器的选通信号。在由外部程序存储器取址期间,在每个机器周期会动作两次。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。
EA/VPP:当EA接高电平时,单片机读取内部程序存储器。当扩展有外部ROM时,当读取完内部ROM后自动读取外部ROM。EA接低电平时,单片机直接读取外部(ROM)。因为现在我们使用的单片机都有内部ROM,所以在设计电路时此引脚始终接高电平。
2.3 液晶屏显示模块
本设计使用的是1602液晶屏。其屏由5V电压驱动,带背光,可显示两行,每行16个字符,不显示汉字内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。
图2.3 1602液晶屏
1602字符型液晶屏各接口信号如表2-1所示:
表2-1
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据口
2
VDD
电源正极
10
D3
数据口
3
VO
液晶显示对比度调节端
11
D4
数据口
4
RS
数据/命令选择端(H/L)
12
D5
数据口
5
R/W
读写选择端(H/L)
13
D6
数据口
6
E
使能信号
14
D7
数据口
7
D0
数据口
15
BLA
背光电源正极
8
D1
数据口
16
BLK
背光电源复极
在与单片机相连时,8个数据口直接与P0口相连,并且必须接上上拉电阻。RS端与单片机的P3.5口相连,E端与单片机的P3.4口相连,因为电子时钟不向液晶读取任何数据,只向其写入命令和显示数据,因此R/W端始终为写状态,直接接地。当在1602液晶屏第一行的00H-0FH、第二行的40H-4FH地址中任一处写入显示数据时,液晶都立即能显示出来。
2.4存储芯片模块
串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。
图2.4 24C02与单片机的接线
其各接口功能:A0,A1,A2为器件地址线,WP为写保护引脚,SCL,SDA为二线串行接口,与单片机直接相连,符合I2C总线协议。在进行操作时,需要进行总线初始化、启动信号、应答信号、停止信号、写字节、读字节等操作。
2.5蜂鸣器模块
在电路中,蜂鸣器的一端接电源,一段与单片机FM端相连,当FM端为低电平时P1.7口也同时为低电平。 此时,由于二极管的一段为高电平而另一端为低电平,便致使LED灯亮,同时蜂鸣器的FM端为低电平而蜂鸣器发出响声。
图2.5蜂鸣器
2.6键盘电路设计
此电子时钟共有五个按键,设定键(S1)、增大键(S2)、减小键(S3)、闹钟键(S5)和计时键(S4)。
图2.6 矩阵键盘和独立按键
2.7晶振电路模块
晶振电路是驱动单片机和控制中断的重要部分,它是由一个11M的晶振和两个30pF的电容组成。
图2.6 晶振电路
3控制系统的软件设计
3.1软件的总体流程图
程序采用定时器0进行50ms的定时,经过20次的溢出为一秒,进行时间的刷新显示。
程序初始化
开定时器0中断
50ms定时到?
Y
计数器加1
计数器=20?
N
Y
秒加1
液晶屏显示
按键扫描
图3.1 总体流程图
3.2 液晶屏
RS控制写数据还是写命令。RS=1;写数据。RS=0,写命令。
R/W 是读/写选择。R/W=1,读。R/W=0,写。
RS=1,R/W=0,写数据。RS=0,R/W=0,写命令。
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
液晶屏初始化
RS=0,E=0
写命令
E=1
延时
E=0
RE=1,E=0
写数据
E=1
延时
E=0
图3.2 1602液晶屏流程图
液晶屏操作程序:
void write_com(uchar com)
{
lcden=0;
rs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcden=0;
rs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
3.3 键盘扫描
本设计的电子时钟共有五个键,设定键(S1)、增大键(S2)、减小键(S3)、闹钟键(S5)和计时键(S4),由4*4矩阵键盘的最后一列(四个)、独立按键其中的一个提供。
按键扫描
S5=0?
Y
N
显示闹钟时间
N
S1=0?
Y
设置时间
N
S4=0?
显示时间
图3.3 键盘扫描流程图
3.4蜂鸣器
有键按下时蜂鸣器蜂鸣,到达整点时蜂鸣器蜂鸣十秒,闹钟时间到达时,蜂鸣器蜂鸣十秒,同时二极管闪烁十秒。
void di()
{
beep=0;
delay(100);
beep=1;
}
if((shi==nshi)&&(fen==nfen)&&(miao==0))
{
for(i=1;i<=200;i++)
{
d8=~d8;
beep=~beep;
delay(50);
};
d8=1;
beep=1;
}
if((fen==0)&&(miao==0))
{
for(i=1;i<=200;i++)
{
beep=~beep;
delay(50);
};
beep=1;
}
3.5 存储芯片
在进行操作时,需要进行总线初始化、启动信号、应答信号、停止信号、写字节、读字节等操作。
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
char read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
3.6 软件仿真结果
在Proteus中把原理图画好,在单片机中添加程序的hex文件,点击开始仿真,仿真结果如下:
图3.4 Proteus仿真图
图3.5 开发板时间
4 实习总结
在写报告的时候,已经是实习设计的最后2天了,14天的从零到有做了许许多多的事情。在实习的前几天进行资料的查询和收集,再将其整合在一起,形成完善的设计方案,然后在已有的知识储备的基础上进行加深和巩固,做到能够较为具体地掌握整个设计模块的各部分功能,并能进行基础的软件编写。前一周的时间是最为重要的时间,因为软件的编写是这次实习的难点,攻克这道难关是需要韧性和智慧的。将各个部分的软件分别编写出来便是一个不小的挑战了,而后又要将各个模块的软件设计按照一定的逻辑顺序串连起来,便要求对整个设计目的和框架有充分的认识。无论是用C语言还是C++语言,对于我来说真心死了很多的脑细胞啊。接下来的一周便是较为轻松的一周了,在上次课程设计中便使用了proteus软件了,因此这是第2次使用这软件了,如果还不轻松的话,那真的就是前一个课程设计没有认真了。一日将晶振模块和蜂鸣器模块的仿真图画好,再花了一日的时间将单片机、扫描键盘、和显示器模块的仿真图画好。紧接着自然而然便是将各模块来连接起来。在讲仿真图画好后,便是导入程序到芯片当中,便开始仿真了。第一次仿真并非完全成功的,在闹钟模块出了些许的问题,这便需要改程序了,真是件麻烦的事情,改了程序后再进行仿真,这样的流程循坏了多次,终于成功了,在成功的那一刻,心里面真的很激动。
总的来说,此次实习真的充满了艰辛和汗水,但在自己成功地完成自己的作品时,就感觉一切都是值得的了,在此十分感谢老师的指导和同学们的热情帮助。
参考文献
[1]李鸿等.单片机原理及应用[M].湖南大学出版社,2005.
[2]何立民.单片机高级教程---应用与设计[M].北京航空航天大学出版社,2000,8.
[3]戴佳.51单片机C语言应用程序设计实例精讲[M].北京:电子工业出版社,2006.
[4]于京. 51系列单片机C程序设计与应用案例[M].北京:中国电力出版社,2006.
[5]孙育才. ATMEL新型AT89S52系列单片机及其应用[M].北京:清华大学出版社, 2005.
[6]李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,2000.
附录A 硬件电路原理图
附录B 源程序代码
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6; //定义锁存器锁存端
sbit wela=P2^7;
sbit rs=P3^5; //定义1602液晶Rs端
sbit lcden=P3^4; //定义1602液晶LCDEN端
sbit s1=P3^0; //功能键
sbit s2=P3^1;//增大键
sbit s3=P3^2; //减小键
sbit s4=P3^6; //计时键
sbit s5=P3^3; //闹钟键
sbit rd=P3^7;//矩阵列
sbit d8=P1^7;//LED灯
sbit beep=P2^3;//蜂鸣器
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
uchar count,s1num,i, sta=0;
char miao,shi,fen,nmiao,nfen,nshi;
uchar code table[]=" CSUST CLOCK ";//液晶屏第一行显示的内容
void delay0() //超短延时程序
{;;}
void start() //24C02启动信号
{
sda=1;
delay0();
scl=1;
delay0();
sda=0;
delay0();
}
void stop() //24C02停止信号
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
delay0();
}
void respons() //24C02应答信号
{
uchar i;
scl=1;
delay0();
while((sda==1)&&(i<250)) i++;
scl=0;
delay0();
}
void init_24c02() //初始化24C02
{
sda=1;
delay0();
scl=1;
delay0();
}
void write_byte(uchar date) //写字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay0();
sda=CY;
delay0();
scl=1;
delay0();
}
scl=0;
delay0();
sda=1;
delay0();
}
uchar read_byte() //读字节
{
uchar i,k;
scl=0;
delay0();
sda=1;
delay0();
for(i=0;i<8;i++)
{
scl=1;
delay0();
k=(k<<1)|sda;
scl=0;
delay0();
}
return k;
}
void write_add(uchar address,uchar date) //向24C02写入数据
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
char read_add(uchar address) //读取24C02的数据
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void delay(uint z)//延时毫秒的程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
void di() //蜂鸣器蜂鸣
{
beep=0;
delay(100);
beep=1;
}
void write_com(uchar com) //液晶屏写命令
{
lcden=0;
rs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //液晶屏写数据
{
lcden=0;
rs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_sfm(uchar add,char date)//写时间,2位一起写
{
uchar shi,ge;
shi=date/10; //分解一个2位数的十位
ge=date%10; //分解一个2位数的个位
write_com(0x80+0x40+add); //设置显示位置
write_date(0x30+shi); //送去液晶显示十位
write_date(0x30+ge); //送去液晶显示个位
}
void init() //初始化函数
{
uchar num;
rd=0; //将矩阵键第四列一端置低以分解出独立按键
dula=0;//关闭两锁存器锁存端,防止操作液晶时数码管乱码
wela=0;
lcden=0;
fen=0;//初始化分钟秒钟时钟变量
miao=0;
shi=12;
nmiao=0;//初始化闹钟的时分秒
nfen=0;
nshi=7;
count=0;//计数器清0
s1num=0;//按键次数清0
init_24c02();
write_com(0x38);//初始化1602液晶屏
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//在第一行显示(USCST CLOCK)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+6);//在第二行显示时钟与分钟间的冒号
write_date(':');
delay(5);
write_com(0x80+0x40+9);// 分钟与秒钟间的冒号
write_date(':');
delay(5);
nmiao=read_add(1);//上电时读取24C02中闹钟的时间
nfen=read_add(2);
nshi=read_add(3);
write_sfm(10,miao);//把初始时间显示在液晶屏上
write_sfm(7,fen);
write_sfm(4,shi);
TMOD=0x01;//设置定时器0工作模式1
TH0=(65536-45872)/256; //定时器装初值
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器
}
void keyscan()
{
uchar miaoshi,miaoge,fenshi,fenge,shishi,shige;
uchar nmiaoshi,nmiaoge,nfenshi,nfenge,nshishi,nshige;
if(s4==0)
{
delay(5);
if(s4==0) //确认计时键按下
{
while(!s4); //释放确认
di(); //每当有按键释放时蜂鸣器蜂鸣
sta=0; //计时键按下后为状态0
write_com(0x80+0x40);
write_date(' ');
delay(5);
write_sfm(10,miao); //计时键按下时,液晶屏显示正常时间
write_sfm(7,fen);
write_sfm(4,shi);
s1num=0; //计时键按下后记录按键数清0
write_com(0x0c); //取消光标闪烁
TR0=1; //启动定时器使时钟开始走
}
}
if(s5==0)
{
delay(5);
if(s5==0) //确认闹钟键按下
{
while(!s5); //确认释放
di();
sta=1;
write_com(0x80+0x40); //在第二行第一个位置显示闹钟的标志〈
write_date('<');
delay(5);
write_sfm(10,nmiao);//显示闹钟的时分秒
write_sfm(7,nfen);
write_sfm(4,nshi);
}
}
if(sta==0) //在状态0的情况下,即计时状态
{
if(s1==0) //如果功能按键1按下
{
delay(5); //去抖动
if(s1==0)
{
s1num++;//记下次数
while(!s1); //等待松手
di(); //蜂鸣器响
if(s1num==1)
{
TR0=0; //关闭定时器
write_com(0x80+0x40+11); //光标定到秒的个位
write_com(0x0f); //光标闪烁
}
if(s1num==2) //第二次按下光标闪烁定位到秒钟的十位
{
write_com(0x80+0x40+10);
}
if(s1num==3) //第三次按下光标闪烁定位到分钟的个位
{
write_com(0x80+0x40+8);
}
if(s1num==4) //第四次按下光标闪烁定位到分钟的十位
{
write_com(0x80+0x40+7);
}
if(s1num==5) //第五次按下光标闪烁定位到时钟的个位
{
write_com(0x80+0x40+5);
}
if(s1num==6) //第六次按下光标闪烁定位到时钟的十位
{
write_com(0x80+0x40+4);
}
if(s1num==7) //第七次按下
{
s1num=0; //记录按键数清0
write_com(0x0c); //取消光标闪烁
TR0=1; //启动定时器使时钟开始走
}
}
}
if(s1num!=0)//S1有按下过,检测S2,S3
{
if(s2==0)//如果按键2按下执行加
{
delay(5);
if(s2==0) //确认增加键按下
{
while(!s2);
di(); //释放后蜂鸣器蜂鸣
if(s1num==1) //设定键第一次按下
{
miao++; //秒加1
if(miao==60) miao=0;
write_sfm(10,miao); //送液晶屏显示
write_com(0x80+0x40+11); //显示位置重新回到调节处
}
if(s1num==2) //设定键第二次按下
{
miaoshi=miao/10;
miaoge=miao%10;
miaoshi++; //秒钟的十位加1
if(miaoshi==6) miaoshi=0;
miao=miaoshi*10+miaoge;
write_sfm(10,miao); //送液晶屏显示
write_com(0x80+0x40+10); //显示位置重新回到调节处
}
if(s1num==3) //设定键第三次按下
{
fen++; //分钟加1
if(fen==60) fen=0;
write_sfm(7,fen); //送液晶屏显示
write_com(0x80+0x40+8); //显示位置重新回到调节处
}
if(s1num==4) //设定键第四次按下
{
fenshi=fen/10;
fenge=fen%10;
fenshi++; //分钟的十位加1
if(fenshi==6) fenshi=0;
fen=fenshi*10+fenge;
write_sfm(7,fen); //送液晶屏显示
write_com(0x80+0x40+7); //显示位置重新回到调节处
}
if(s1num==5) //设定键第五次按下
{
shi++; //时钟加1
if(shi==24) shi=0;
write_sfm(4,shi); //送液晶显示
write_com(0x80+0x40+5); //显示位置重新回到调节处
}
if(s1num==6) //设定键第六次按下
{
shishi=shi/10;
shige=shi%10;
shishi++; //时钟的十位加1
if(shishi==3) shishi=0;
shi=shishi*10+shige;
write_sfm(4,shi); //送液晶屏显示
write_com(0x80+0x40+4); //显示位置重新回到调节处
}
}
}
}
if(s3==0)
{
delay(5);
if(s3==0) //确认减小键按下
{
while(!s3);
di();
if(s1num==1) //设定键第一次按下
{
miao--; //秒钟减1
if(miao==-1) miao=59;
write_sfm(10,miao); //送液晶屏显示
write_com(0x80+0x40+11); //显示位置重新回到调节处
}
if(s1num==2) //设定键第二次按下
{
miaoshi=miao/10;
miaoge=miao%10;
miaoshi--; //秒钟的十位减1
if(miaoshi==-1) miaoshi=5;
miao=miaoshi*10+miaoge;
write_sfm(10,miao); //送液晶屏显示
write_com(0x80+0x40+10); //显示位置重新回到调节处
}
if(s1num==3) //设定键第三次按下
{
fen--; //分钟减1
if(fen==-1) fen=59;
write_sfm(7,fen); //送液晶屏显示
write_com(0x80+0x40+8); //显示位置重新回到调节处
}
if(s1num==4) //设定键第四次按下
{
fenshi=f
展开阅读全文