基于16F887单片机数字钟课设设计报告word格式 本文关键词:单片机,格式,报告,设计,数字钟
基于16F887单片机数字钟课设设计报告word格式 本文简介:第44页共44页xxxxxx《基于PIC16F887单片机的数字钟》课程设计报告学生姓名:_学号:_____专业班级:____________指导教师:___________*年*月*日目录1.功能介绍31.1PIC16F887介绍31.2DS1307介绍31.3TC74介绍31.4LM1602L介
基于16F887单片机数字钟课设设计报告word格式 本文内容:
第
44
页
共
44
页
xxxxxx
《基于PIC16F887单片机的数字钟》
课程设计报告
学生姓名:
_
学
号:
_____
专业班级:
__________
__
指导教师:
___
________*年*月*日
目
录
1.功能介绍3
1.1
PIC16F887介绍3
1.2
DS1307介绍3
1.3
TC74介绍3
1.4
LM1602L介绍3
1.5蜂鸣器介绍3
2.硬件原理框图4
3.模块介绍4
3.1
单片机最小系统模块4
3.2时间和温度通讯模块5
3.3
按键模块5
3.4
蜂鸣器和液晶显示器模块5
4.软件框图7
5.软件功能介绍7
5.1
端口﹑LCD和IIC初始化及端口若上拉7
5.2
显示预显示的数字和字母8
5.3
根据闹钟按键判断9
5.4
写入初值到时钟芯片9
5.5
时间加减设置10
5.6
显示时间﹑读和显示温度﹑显示字母星期11
6.个人心得体会12
6.1
关于PIC课设12
6.2
课设过程遇到的问题及解决措施12
6.3
我的建议14
附录1:数字钟的全部C程序15
附录2:Proteus完整仿真图44
1.功能介绍
1.1
PIC16F887介绍
PIC16F887单片机共有40个引脚,其中有33个端口引脚,7个电源﹑地和复位引脚。外部晶振设为4MHz,引脚1接复位按键。此数字钟用到单片机的B端口中断功能,端口若上拉,电平变化下降沿中断。
1.2
DS1307介绍
DS1307时钟芯片是实时时钟芯片,它提供秒﹑分﹑时﹑日﹑月﹑年和星期等数据,有备用电源,主电源掉电备用,时钟晶振是32.768kHz。其控制寄存器的地址为07,其值0b11010000,代表允许其7脚输出每秒1Hz的方波。其秒﹑分﹑时﹑日﹑月﹑年和星期分别存在地址为00﹑01﹑02﹑04﹑05﹑06﹑03中。其与单片机的通讯为IIC通讯。
1.3
TC74介绍
温度传感器TC74是感测周围温度值。TC74芯片的默认值为0b1001101(实验板上芯片调试时的地址为0b1001000,此为仿真时用的地址)。单片机首先向TC74改善地址,地址在字节的高7位,最低位为0表示为写。接着单片机向TC74发送第二个数据,即读温度命令字RTR,即8位0;然后重新开始,单片机再向TC74发送地址,但此时的最低位为1,表示接下来是要读TC74的温度值。最后单片机接收TC74发出的温度值。TC74与单片机的通讯也为IIC通讯。
1.4
LM1602L介绍
字符型LM016L液晶显示器。要求用4位数据线通讯,传送命令也传送地址。其初始化的格式是固定的,不能更改的,初始化见后面所示。输入到液晶显示器的是所示字符的ASCII码,液晶才能正确显示。
1.5蜂鸣器介绍
蜂鸣器是用来设置闹钟用的。当设定闹钟的时间到时,蜂鸣器响,按键按下,停止响。按键模块是用来进行年月日﹑秒分时和星期加减及设定闹钟用的。采用的是电平变化的中断模式。
2.硬件原理框图
220V
变压器变压
CUP模块
液晶显示
按键输入
DS1307和TC74
市电220V电压经变压器变压供CPU使用的低压。DS1307和TC74经CPU显示在液晶上。按键控制DS1307的时间加减和闹钟设置,实现闹钟功能。先在液晶上定位要显示数据的位置,然后将要显示的字符的ASCII码输入到液晶,即可正确数据。
3.模块介绍
3.1
单片机最小系统模块
此单片机的外部晶振为4MHz,引脚1接有高电平和复位按钮。端口B口用来进行电平变化中断,端口RC3和RC4用来进行IIC通讯,RC1用来输出高电平给蜂鸣器。端口D端口用来输出命令和数据给液晶显示器。
3.2时间和温度通讯模块
DS1307时间芯片可根据输入的数据自动走时。单片机不断地访问DS1307芯片,将访问得到的数据显示在液晶显示器上。其中芯片上读出来的星期是数字星期(01即代表星期一),软件部分将数字星期转换成字母星期(如Wed为星期三)。单片机也访问TC74温度传感器,要得到的数据显示在液晶上。温度传感器小数后面有一位,但是设计时只显示到个位,不显示小数点后面的数字。
3.3
按键模块
按键S1是用来定位时间加减用的,来回按7下,分别对秒分时,星期和日月年。S2可以对时间进行加运算即每按一下,相应的时间加1;S3可以时间进行减运算即每按一下,相应的时间减1;S4是闹钟按键,按第一下,进入闹钟设置模式,此时再按S2或S3可以对时间进行设定。按第二下时,CPU进入比较模式,即把DS1307的时间和设定保存好的时间进行比较,等待设定的时间到时,蜂鸣器开始响。当按第三下时,蜂鸣器停止响,相应的变量清零,从重新开始。
3.4
蜂鸣器和液晶显示器模块
当定时时间到,RC1输出高电平,二极管导通,蜂鸣器开始响。当RC1输出低电平时,二极管截止,蜂鸣器停止响。液晶显示器用来显示时间,星期和温度,首先要进行显示时间定位,即写入命令。然后进行显示数据输入,即定稿数据。VEE和VSS都拉低,VDD拉高电平。RS为0时,写命令,为1时写数据;R/为1时表示读,0时表示写;E数据使能端,下降沿送入有效。RD0~RD3,数据输入端,使用液晶显示器端口的高4位。
4.软件框图
端口﹑LCD和IIC初始化及端口若上拉
显示预显示的数字和字母
延迟2秒
写入初值到时钟芯片
显示时间﹑读和显示温度﹑显示字母星期
时间加减设置
闹钟设置和进行比较
蜂鸣器响
C=0或2
C=1
C=2
S4第三次按下
蜂鸣器不响
C=3
根据闹钟按键判断
该功能在中断程序段中
5.软件功能介绍
5.1
端口﹑LCD和IIC初始化及端口若上拉
//初始化端口
void
CSH(void)
{TRISB=0b11111111;
//端口B全为输入
TRISC=0b00011000;
//端口C中RC3和RC4为输入,其余为输出
ANSELH=0b00000000;
//选择I/O口
ANSEL=0;
//选择I/O口
OPTION=0b00000000;
//允许若上拉,下降沿中断
WPUB=0b11111111;
//B口若上拉
TRISA4=1;
//A口第5引脚为输入
TRISD=0b00000000;//控制LCD1604,全为输出
IOCB=0b00001111;
//允许电平变化中断
INTCON=0b11001000;
//允许全局中断,B口电平变化中断
FMQ=0;
//蜂鸣器不响
LCD_CSH();
//LCD初始化
IIC_CSH();
//IIC初始化
}
此为对端口﹑LCD和IIC的初始化,上面均有详细的说明,在此不做过多的重复。
LCD的初始化,上电时需要延时15ms及以上,此为延时20ms,其C程序见附录。
IIC的初始化,初始化过程实际上是对几个相关的寄存器设置的过程,其C程序见附录。
5.2
显示预显示的数字和字母
const
char
MENU0[2][17]={
{“010900628
“},{“linyixing
“}};
//完全按照数组中的字符显示整屏
void
DISP_MENU(const
charA)
{
char
i,j;
for
(i=0;i>4;//取高4位
LCD_WRITE_4(R2,FLAG);//先写高4位
R2=R1
//高4位清0,取低4位
LCD_WRITE_4(R2,FLAG);//再送低4位
DELAY_US(10);//延时100us
}
//写R1的低4位,FLAG为寄存器选择,1为命令,0为数据
void
LCD_WRITE_4(char
R1,char
FLAG)
{LCD_RW=0;NOP();//写模式
LCD_RS=FLAG;NOP();
//寄存器选择
PORTD
NOP();//RD高4位先清0
LCD_E=1;NOP();//使能
PORTD
|=R1;NOP();//送4位
LCD_E=0;NOP();//数据送入有效
LCD_RS=0;NOP();
PORTD
//RD高4位清0
}
此程序的功能的把给定的字符显示到LCD液晶显示器上,字符串有两行,分行显示。先是对要显示的位置进行定位,如第一行第0位。然后将一个字符的高低4位分别送入显示,显示时送入的是ASCII码。
5.3
根据闹钟按键判断
此为根据c=0,1,2来判断的。为0或2时,显示的是时钟芯片的时间,其中为2时,时钟有在比较时间;为1时显示的时闹钟设定的时间。c为3
时蜂鸣器不响。其C程序详见附录。
5.4
写入初值到时钟芯片
LCD_WRITE(0b00000001,COM);
//清屏
WRITE_DS1307(0x07,0x10);//写控制字到LCD
WRITE_DS1307(0x00,0x00);//0秒
WRITE_DS1307(0x01,0x00);//00分
WRITE_DS1307(0x02,0x11);
//11h
WRITE_DS1307(0x03,0x03);//星期3
WRITE_DS1307(0x04,0x08);//8日
WRITE_DS1307(0x05,0x05);//5月
WRITE_DS1307(0x06,0x12);//12年
//写ds1307,地址为address,数为data
void
WRITE_DS1307(char
ADDRESS,char
da)
{
START_BIT;
IIC_SEND(ADDR);
IIC_SEND(ADDRESS);
IIC_SEND(da);
STOP_BIT;
}
//发送数R并等待发送完成,收到从机的应答信号,中断用
void
IIC_SEND_interrupt(char
R)
{SSPBUF=R;//发送
SSPIF=0;
while
(RW==1);//在主动模式下,判断发送是否完成
while
(SSPIF==0);//等待发送完成
while
(ACKSTAT==1);//等待从机发送应答信号
NOP();
NOP();
}
写入初值到时钟芯片时,要用到IIC通讯,即IIC发送。先送时钟地址,再送要写入数据的地址,再送入数据。此可对时钟芯片的年月日,秒分时和星期进行设定初值。
5.5
时间加减设置
//校正时候实现“加”功能子程序
void
INC(void)
{
if(a==7)
//年部分校正
{
AAAA[6]+=1;
//如果a==7,则数组[6]自动加1
if((AAAA[6]
AAAA[6]=AAAA[6]+0x10;
//数组[6]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[6]>0x99)
AAAA[6]=AAAA[6]//如果数组[6]元素值大于0x99,则整个数都清零
if(c==0)
WRITE_DS1307_interrupt(0x06,AAAA[6]);//将经过修改的数组元素写入
if(c==1)
{
LCD_WRITE_interrupt(LINE1+4,COM);
DISP_HEX_interrupt(AAAA[6]);
}
}
}
此功能从DS1307中读出时间数据,然后对数据进行加减运算,再把修改后的时间写入到时钟芯片中,即可实现对时间的加减运算。由于程序篇幅较长,在此只列出部分加的C程序,其余加C程序及减C程序详见附录。
5.6
显示时间﹑读和显示温度﹑显示字母星期
READ_DS1307(0x00,0x07);
//读时钟芯片
(设置闹钟时间是没有这一行指令)
DISP_TIME(*AAAA);
//实时显示时间
(具体C程序见附录)
R1=READ_T();
//读温度传感器的值
DISP_T(R1);
//显示温度值
DISP_XINGQI(AAAA[3]);
//显示字母星期
//显示字母星期
void
DISP_XINGQI(char
b)
{
if(b==1)
//如果b=1,则显示Mon
{
LCD_WRITE(LINE1+13,COM);//第二行第13位
LCD_WRITE(
M,DAT);
LCD_WRITE(
o,DAT);
LCD_WRITE(
n,DAT);//13、14、15分别显示M、o、n
}
else
if(b==2)
//如果b=2,则显示Tue
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
T,DAT);
LCD_WRITE(
u,DAT);
LCD_WRITE(
e,DAT);//同上
}
}
其完整程序详见附录,在此只给出其中的一部分。
//读TC74的温度值
signed
char
READ_T(void)
{
signed
char
R2;
SEN=1;//开始条件
while
(SEN==1);//检测开始条件是否完成?
IIC_SEND(TC74_ADD
__CONFIG(0x20F1);//调试用
__CONFIG(0x3FFF);
#defineLCD_ERD6//LCD
E
读写使能控制
#defineLCD_RWRD5//LCD
读(1)/写(0)控制线
#define
LINE10b10000000
#define
LINE20b11000000
#defineLCD_RSRD4//LCD
寄存器选择
数据(1)指令(0)
//RD4-RD7分别接DB4-DB7,RD7为忙标志
#define
COM0//在LCD_WRITE()中的第2参数为0表示写命令
#define
DAT1//在LCD_WRITE()中的第2参数为1表示写数据
#define
TC74_ADD
0b1001101
//TC74的7位地址
#define
RTR0b00000000
//TC74的读温度命令
#define
ADDR
0b11010000
//时钟芯片的地址
#define
YEAR_P
LINE1+2
//年的显示位置
#define
HOUR_P
LINE2+2
//时的显示位置
#define
KEY_DEC
RB2
#define
KEY_INC
RB1
#define
FMQ
RC1
//产生起始位,检测完成起始位?
#define
START_BIT
/
SEN=1;/
while(SEN==1)
//停止位,检查至停止位结束
#define
STOP_BIT
/
PEN=1;
/
while(PEN==1)
//发送重复开始,确定重复开始已完成?
#define
RE_START_BIT
/
RSEN=1;/
while(RSEN==1)
//接收使能模式,确定接收使能?
#define
RECEIVE_ENABLE_BIT/
RCEN=1;/
while(RCEN==1)
//自动应答,检查是否完成应答?
#define
ACK_BIT/
ACKDT=0;/
ACKEN=1;/
while(ACKEN==1)
//不应答,检查是否完成无应答?
#define
NOT_ACK_BIT/
ACKDT=1;/
ACKEN=1;/
while(ACKEN==1)
bank1
char
DD[16];//一行LCD显示数据暂存
bank1
char
AAAA[7];
//存放时钟芯片读出来的数据
bank1
char
CCCC[7];
//存放闹钟设定的时间
void
CSH(void);//初始化
void
LCD_CSH(void);//LCD初始化
void
LCD_BUSY(void);//检测LCD是否忙
char
LCD_READ(void);//读LCD,忙检测用
void
LCD_WRITE(char,char);//LCD写1字节,命令或数据
void
LCD_WRITE_4(char,char);//LCD写半字节
void
DISP_C(char);//在指定行中显示字符,字符在数组DD中
void
DISP_MENU(const
char);//由常数数组显示整屏字符
signed
char
READ_T(void);
//读温度传感器的温度值
void
IIC_CSH(void);
//IIC的初始化
void
IIC_SEND(char);
//IIC的发送与接收
void
DISP_T(char);
//显示温度值
void
BCD(char);
//BCD码转换
void
DELAY_US(char);
//延迟程序,10uS级
void
DELAY(unsigned
int);
//延迟程序,mS级
void
DELAY_I(unsigned
int);
//中断用的延迟程序,mS级
void
DISP_TIME(char);
//显示时钟的时间
void
DISP_HEX(char);
//将一个字节分两个字节显示
void
READ_DS1307(char,char);
//读时钟芯片
void
WRITE_DS1307(char,char);
//向时钟芯片写入值
void
interrupt
ISR(void);
//按键中断程序
void
DISP_XINGQI(char);
//星期转换,显示字母星期
void
INC(void);
//按键加1
void
DEC(void);
//按键减1
void
IIC_SEND_interrupt(char);
//中断用IIC发送和接收
void
WRITE_DS1307_interrupt(char,char);
//中断用写时钟芯片
//void
READ_DS1307_interrupt(char,char);
void
LCD_WRITE_interrupt(char,char);
//中断用写LCD
void
DISP_HEX_interrupt(char);
//中断用将一个字节显示成两个字节
//整屏界面,每行16个字符,最后加一个结束符
const
char
MENU0[2][17]={
{“010900628
“},{“linyixing
“}};
//定义常数
const
char
LINE[2]={LINE1,LINE2};
//定义数组和变量
char
SW,GW,a=0,c=0,d,i;
//主程序
main(void)
{
signed
char
R1;
//DELAY(100);
CSH();
//端口,LCD和IIC初始化
DISP_MENU(*MENU0);//显示整屏
DELAY(2000);
//延迟2秒,看清显示是什么
LCD_WRITE(0b00000001,COM);
//清屏
WRITE_DS1307(0x07,0x10);//写控制字到LCD
WRITE_DS1307(0x00,0x00);//0秒
WRITE_DS1307(0x01,0x00);//00分
WRITE_DS1307(0x02,0x11);
//11h
WRITE_DS1307(0x03,0x03);//星期3
WRITE_DS1307(0x04,0x08);//8日
WRITE_DS1307(0x05,0x05);//5月
WRITE_DS1307(0x06,0x12);//12年
while(1)
{
if((c==0)||(c==2))
//当C=0或C=2时执行
{
READ_DS1307(0x00,0x07);
//读时钟芯片
DISP_TIME(*AAAA);
//实时显示时间
R1=READ_T();
//读温度传感器的的值
DISP_T(R1);
//显示温度值
DISP_XINGQI(AAAA[3]);
//显示字母星期
}
if(c==1)
//C=1时执行
{
DISP_TIME(*AAAA);
//显示闹钟修改的时间
R1=READ_T();
//同上
DISP_T(R1);
//同上
DISP_XINGQI(AAAA[3]);
//同上
}
if((CCCC[2]==AAAA[2])
//当设定的时间到时,蜂鸣器响
};
}
//显示字母星期
void
DISP_XINGQI(char
b)
{
if(b==1)
//如果b=1,则显示Mon
{
LCD_WRITE(LINE1+13,COM);//第二行第13位
LCD_WRITE(
M,DAT);
LCD_WRITE(
o,DAT);
LCD_WRITE(
n,DAT);//13、14、15分别显示M、o、n
}
else
if(b==2)
//如果b=2,则显示Tue
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
T,DAT);
LCD_WRITE(
u,DAT);
LCD_WRITE(
e,DAT);//同上
}
else
if(b==3)
//如果b=3,则显示Wed
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
W,DAT);
LCD_WRITE(
e,DAT);
LCD_WRITE(
d,DAT);//同上
}
else
if(b==4)
//如果b=4,则显示Thu
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
T,DAT);
LCD_WRITE(
h,DAT);
LCD_WRITE(
u,DAT);//同上
}
else
if(b==5)
//如果b=5,则显示Fri
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
F,DAT);
LCD_WRITE(
r,DAT);
LCD_WRITE(
i,DAT);//同上
}
else
if(b==6)
//如果b=6,则显示Sat
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
S,DAT);
LCD_WRITE(
a,DAT);
LCD_WRITE(
t,DAT);//同上
}
else
if(b==7)
//如果b=7,则显示Sun
{
LCD_WRITE(LINE1+13,COM);//同上
LCD_WRITE(
S,DAT);
LCD_WRITE(
u,DAT);
LCD_WRITE(
n,DAT);//同上
}
}
//中断子程序
void
interrupt
ISR(void)
{
DELAY_I(30);
//按键去抖
RBIF=0;
//标志位清零
if(RB3==0)
//闹钟键按下
{
a=0;c+=1;d+=1;
}
if(RB0==0
if(a==8)
a=1;
}
if(RB1==0}
if(RB2==0}
if(c==1)
//闹钟键按下
{
if(RB0==0)
//闹钟键按下的定位
{
a++;
if(a==8)
a=1;
}
if(RB1==0)
//同上
{INC();}
if(RB2==0)//同上
{DEC();}
for(i=0;i9)
{AAAA[6]=AAAA[6]
AAAA[6]=AAAA[6]+0x10;
//数组[6]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[6]>0x99)
AAAA[6]=AAAA[6]//如果数组[6]元素值大于0x99,则整个数都清零
if(c==0)
WRITE_DS1307_interrupt(0x06,AAAA[6]);//将经过修改的数组元素写入
if(c==1)
{
LCD_WRITE_interrupt(LINE1+4,COM);
DISP_HEX_interrupt(AAAA[6]);
}
}
//月部分校正
if(a==6)
{
AAAA[5]+=1;
if((AAAA[5]
AAAA[5]=AAAA[5]+0x10;
//数组[5]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[5]>0x12)
{
AAAA[5]=AAAA[5]
AAAA[5]=AAAA[5]+0x01;//如果数组[5]元素值大于0x12,则整个数都清零再加1
}
if(c==0)
WRITE_DS1307_interrupt(0x05,AAAA[5]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+7,COM);
DISP_HEX_interrupt(AAAA[5]);
}
}
//日部分校正
if(a==5)
{
AAAA[4]+=1;
if((AAAA[4]
AAAA[4]=AAAA[4]+0x10;//数组[4]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[4]>0x31)
{
AAAA[4]=AAAA[4]
AAAA[4]=AAAA[4]+0x01;//如果数组[4]元素值大于0x31,则整个数都清零再加1
}
if(c==0)
WRITE_DS1307_interrupt(0x04,AAAA[4]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+10,COM);
DISP_HEX_interrupt(AAAA[4]);
}
}
//星期部分校正
if(a==4)
{
AAAA[3]+=1;
if(AAAA[3]>7)
AAAA[3]=1;
//如果数组[3]的元素大于7时,则复位到1
if(c==0)
WRITE_DS1307_interrupt(0x03,AAAA[3]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+13,COM);
DISP_HEX_interrupt(AAAA[3]);
}
}
//时部分校正
if(a==3)
{
AAAA[2]+=1;
if((AAAA[2]
AAAA[2]=AAAA[2]+0x10;//数组[2]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[2]>0x23)
{
AAAA[2]=AAAA[2]//如果数组[2]元素值大于0x24,则整个数都清零
}
if(c==0)
WRITE_DS1307_interrupt(0x02,AAAA[2]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE2+2,COM);
DISP_HEX_interrupt(AAAA[2]);
}
}
//分部分校正
if(a==2)
{
AAAA[1]+=1;
if((AAAA[1]
AAAA[1]=AAAA[1]+0x10;//数组[1]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[1]>0x59)
AAAA[1]=AAAA[1]
//如果数组[1]元素值大于0x59,则整个数都清零
if(c==0)
WRITE_DS1307_interrupt(0x01,AAAA[1]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE2+5,COM);
DISP_HEX_interrupt(AAAA[1]);
}
}
//秒部分校正
if(a==1)
{
AAAA[0]+=1;
if((AAAA[0]
AAAA[0]=AAAA[0]+0x10;//数组[0]元素的低四位大于9时,则低四位清零而高四位进1位
}
if(AAAA[0]>0x59)
AAAA[0]=AAAA[0]
//如果数组[0]元素值大于0x59,则整个数都清零
if(c==0)
WRITE_DS1307_interrupt(0x00,AAAA[0]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE2+8,COM);
DISP_HEX_interrupt(AAAA[0]);
}
}
}
//校正时候实现“减”功能子程序
void
DEC(void)
{
if(a==7)
//年部分校正
{
AAAA[6]-=1;
//如果a==0,则数组[6]自动减1
if((AAAA[6]
AAAA[6]=AAAA[6]+0x09;//数组[6]元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1
}
if(((AAAA[6]
AAAA[6]=AAAA[6]+0x99;//如果数组[6]元素高四位大于9时,则整个数值清零再改为0x99
}
if(c==0)
WRITE_DS1307_interrupt(0x06,AAAA[6]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+4,COM);
DISP_HEX_interrupt(AAAA[6]);
}
}
//月部分校正
if(a==6)
{
AAAA[5]-=1;
if((AAAA[5]
AAAA[5]=AAAA[5]+0x09;
//数组[5]元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1
}
if(AAAA[5]==0x00)
AAAA[5]=AAAA[5]+0x12;//如果数组[5]元素等于0时,则整个数值改为0x12
if(c==0)
WRITE_DS1307_interrupt(0x05,AAAA[5]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+7,COM);
DISP_HEX_interrupt(AAAA[5]);
}
}
//日部分校正
if(a==5)
{
AAAA[4]-=1;
if((AAAA[4]
AAAA[4]=AAAA[4]+0x09;
//数组[4]元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1
}
if(AAAA[4]==0x00)
AAAA[4]=AAAA[4]+0x31;//如果数组[4]元素等于0时,则整个数值改为0x31
if(c==0)
WRITE_DS1307_interrupt(0x04,AAAA[4]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+10,COM);
DISP_HEX_interrupt(AAAA[4]);
}
}
//星期部分校正
if(a==4)
{
AAAA[3]-=1;
if(AAAA[3]<1)
AAAA[3]=7;//如果数组[3]的元素小于1时,则复位到7
if(c==0)
WRITE_DS1307_interrupt(0x03,AAAA[3]);//将经过修改的数组元素写入
else
if(c==1)
{
LCD_WRITE_interrupt(LINE1+13,COM);
DISP_HEX_interrupt(AAAA[3]);
}
}
//时部分校正
if(a==3)
{
AAAA[2]-=