📄 时分秒设计.c
字号:
#include <reg51.h>
#include <intrins.h>
//#include <at89x51.h>
sbit P1_7=P1^7; //嗡鸣器控制口
sbit P3_5=P3^5; //修改(加一)
sbit P3_6=P3^6; //移动
sbit P3_7=P3^7; //进入(系统时间或报警时间)或退出
sbit RS=P1^0; //定义引脚
sbit RW=P1^1;
sbit E=P1^2;
int true=1;
#define LCD_Data P0
unsigned char seg[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0~f
unsigned char i,j,p=1,shi=0,shi_1=0,shi_0=0,fen=0,fen_10=0,msecond=0,second=0,second_10=0;
void xiangling(void);
void xianshi3(void);
void guangbiao2(void);
void guangbiao1(void);
void delay(int k);
void writedatalcd(unsigned char wdlcd);
void writecommandlcd(unsigned char wclcd);
unsigned char readdatalcd(void);
unsigned char readstatuslcd(void);
void initlcd(void);
void displayonechar(unsigned char X, unsigned char Y, unsigned char DData);
void displaylistchar(unsigned char X, unsigned char Y, unsigned char code *DData);
void xianshi1(void);
unsigned char code maohao[] ={":"};
unsigned char BaoJing[]={0x42,0x61,0x6f,0x4a,0x69,0x6e,0x67,0x20,0x30,0x30,0x3a,0x30,0x30,0x3a,0x31,0x30};
unsigned char shijian[8]={0,0,58,0,0,58,0,0};
void main(void)
{
delay(100);
initlcd();
EA=1;
ET0=1;
TMOD=0x01;
TH0=55536/256; //每一次中断(10ms)的初值
TL0=55536%256;
// while(P3_7!=0);
xianshi1();
delay(10);
xianshi3();
TR0=1;
while(1)
{
while(1) //进入循环判断(有P3.7键按下,则需进行相应的调整处理,否则,只进行报警时间的判断
{ int a=8,b=4;
while(P3_7!=0) //判断系统时间是否与报警时间相等,相等则响铃5秒
{
if(shi_1==BaoJing[8]-0x30)
if(shi_0==BaoJing[9]-0x30)
if(fen_10==BaoJing[11]-0x30)
if(fen==BaoJing[12]-0x30)
if(second_10==BaoJing[14]-0x30)
if(second==BaoJing[15]-0x30)
xiangling();
}
//if(flag==1)xiangling(); //若不需调整,则等待,在这等待期间判断报警时间是否到,若到,则报警
true=0; //注意:若不关掉系统时间的显示,则不能进行光标的定位(因为每次系统时间的显示都会让光标跑到字符串末端)
delay(1000);
if(P3_7==0) //超过一秒,则进入调整报警时间
{
guangbiao1(); //光标定位到要调整的位置
delay(500);
while(1)
{
if(P3_5==0) //每按一次,自加1
{
if(a==8) //判断第一位是否大于2(24小时制)
{ BaoJing[a]++;
if(BaoJing[a]>0x32)BaoJing[a]=0x30;
xianshi1();
writecommandlcd(0x80+a);
delay(500);
}
else
{ if(a==11||a==14) //a指向分或秒的十位
{
BaoJing[a]++;
if(BaoJing[a]>0x35)BaoJing[a]=0x30;
xianshi1();
writecommandlcd(0x80+a);
delay(500);
}
else // a指向分或秒的个位
{ BaoJing[a]++;
if(BaoJing[a]>=0x3a)BaoJing[a]=0x30;
xianshi1();
writecommandlcd(0x80+a);
delay(500);
}
}
}
if(P3_6==0) //每按一次,向右移一位
{
writecommandlcd(0x81+a);
delay(500);
a++;
if(a>=16) //到行末,则返回到开始处
{
a=8;
writecommandlcd(0x80+a); //返回到开始处
}
}
if(P3_7==0)break; //报警时间调整完成,按P3_7键退出
}
}
else //不足一秒,则进入调整系统时间
{ TR0=0; //关系统时间
shijian[0]=shi_1;
shijian[1]=shi_0;
shijian[3]=fen_10;
shijian[4]=fen;
shijian[6]=second_10;
shijian[7]=second;
guangbiao2();
delay(1000);
while(1)
{
if(P3_5==0)
{
if(b==4) //判断第一位是否大于2(24小时制)
{ shijian[b-4]++;
if(shijian[b-4]>2)shijian[b-4]=0;
shi_1=shijian[0];
shi_0=shijian[1];
fen_10=shijian[3];
fen=shijian[4];
second_10=shijian[6];
second=shijian[7];
xianshi3();
writecommandlcd(0xc0+b);
delay(500);
}
else
{
if(b==7||b==10) //b指向分或秒的十位
{ shijian[b-4]++;
if(shijian[b-4]>5)shijian[b-4]=0;
shi_1=shijian[0];
shi_0=shijian[1];
fen_10=shijian[3];
fen=shijian[4];
second_10=shijian[6];
second=shijian[7];
xianshi3();
writecommandlcd(0xc0+b);
delay(500);
}
else //b指向分或秒的个位
{ shijian[b-4]++;
if(shijian[b-4]>=10)shijian[b-4]=0;
shi_1=shijian[0];
shi_0=shijian[1];
fen_10=shijian[3];
fen=shijian[4];
second_10=shijian[6];
second=shijian[7];
xianshi3();
writecommandlcd(0xc0+b);
delay(500);
}
}
}
if (P3_6==0)
{
writecommandlcd(0xc1+b);
delay(500);
b++;
if(b>=12)
{
b=4;
writecommandlcd(0xc0+b);
}
}
if(P3_7==0)break; //系统时间调整完成,按P3_7键退出
}
TR0=1; //调整好系统时间后,开定时器
}
while(P3_7!=0);
true=1;
writecommandlcd(0x0c); //关光标及闪烁
break; // 退出,进入下一次循环判断
}
delay(2000);
}
}
void writedatalcd(unsigned char wdlcd) //写数据
{
readstatuslcd();
LCD_Data=wdlcd;
RS=1;
RW=0;
E=0;
E=0;
E=1;
}
void writecommandlcd(unsigned char wclcd) //写命令
{
readstatuslcd();
LCD_Data=wclcd;
RS=0;
RW=0;
E=0;
E=0;
E=1;
}
unsigned char readdatalcd(void) //读数据
{
RS=1;
RW=1;
E=0;
E=0;
E=1;
return(LCD_Data);
}
unsigned char readstatuslcd(void) //读lcd的状态
{
LCD_Data=0xff;
RS=0;
RW=1;
E=0;
E=0;
E=1;
while(LCD_Data&0x80);
return(LCD_Data);
}
void initlcd(void) //初始化1602
{
LCD_Data = 0;
writecommandlcd(0x38);
delay(5);
writecommandlcd(0x38);
delay(5);
writecommandlcd(0x38);
delay(5);
writecommandlcd(0x38);
writecommandlcd(0x08);
writecommandlcd(0x01);
writecommandlcd(0x06);
writecommandlcd(0x0c);
}
void displayonechar(unsigned char X, unsigned char Y, unsigned char DData) //显示单个字符
{
Y &= 0x1;
X &= 0xF;
if (Y) X |= 0x40;
X |= 0x80;
writecommandlcd(X);
writedatalcd(DData);
}
void displaylistchar(unsigned char X, unsigned char Y, unsigned char code *DData) //显示字符串
{
unsigned char listlength;
listlength = 0;
Y &= 0x1;
X &= 0xF;
while (DData[listlength]>=0x20)
{
if (X <= 0xf)
{
displayonechar(X, Y, DData[listlength]);
listlength++;
X++;
}
}
}
void delay(int n) //1毫秒延时
{ int i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void timer0(void) interrupt 1 //中断子程序实现时间的跳变(秒-分-时)
{
TH0=55536/256;
TL0=55536%256;
msecond++;
if(msecond>=100)
{msecond=0;
second++;
if(second>=10)
{second=0;
second_10++;
if(second_10>=6)
{
second_10=0;
fen++;
if(fen>=10)
{fen=0;
fen_10++;
if(fen_10>=6)
{fen_10=0;
shi++;
if(shi>=24)
{shi=0;
shi_1=shi/10;
shi_0=shi%10;
}
}
}
}
}
}
if(true==1)xianshi3();
}
void xianshi1(void) //显示设置时间
{
for(i=0;i<16;i++)
displayonechar(i,0,BaoJing[i]);
}
void guangbiao1(void) //定位设置时间光标
{
writecommandlcd(0x0f);
writecommandlcd(0x88); //光标移动一位
}
void guangbiao2(void) //定位系统时间光标
{
writecommandlcd(0x0f);
writecommandlcd(0xc4);//光标移动一位
}
void xianshi3(void) //显示系统时间
{
displayonechar(4, 1, seg[shi_1]);
displayonechar(5, 1, seg[shi_0]);
displaylistchar(6, 1, maohao);
displayonechar(7, 1, seg[fen_10]);
displayonechar(8, 1, seg[fen]);
displaylistchar(9, 1, maohao);
displayonechar(10, 1, seg[second_10]);
displayonechar(11, 1, seg[second]);
}
void xiangling(void) //报警5秒
{
P1_7=0;
delay(5000);
P1_7=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -