📄 yj.c
字号:
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
#define uchar unsigned char
uchar code time[]={"Time:"};//第一行显示 “Time“
uchar idata date[] ={" "};// 第二行显示时间
sbit RS=P3^2; // lcd1602
sbit RW=P3^1; // lcd1602读写端口
sbit EN=P3^0; //使能端 下降沿有效
sbit flag=ACC^7;
sbit FZ=P1^0; //分设置键
sbit XZ=P1^1; //时设置键
sbit TC=P3^4; //退出键
sbit SZ=P1^2; //设置指示灯
sbit ZC=P1^3; //正常计时指示灯
sbit ST=P3^3;// 时间设置模式
uchar second; //秒
uchar mint; //分
uchar hour; //时
uchar t; //定时器计数次数
void delay(int y) //延时函数
{
uchar i,j;
for(j=0;j<=y;j++)
for(i=0;i<=100;i++);
}
void wait(void) //判断显示器是否处于忙状态
{
RS=0;
RW=1;
do{ACC=P0;}
while(flag==1); //读显示器忙标志位
}
void writecom(uchar com) //写液晶显示命令
{
RS=0;
RW=0;
EN=0;
P0=com;
delay(1);
EN=1;
delay(1);
EN=0;//使能 数据送到命令寄存器
}
void writedat(uchar dat) //写数据送显示
{
RS=1;
RW=0;
EN=0;
P0=dat;
delay(1);
EN=1;
delay(1);
EN=0;
}
void lcdinit(void) //显示器初始化以及定时器初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
EX1=1;
TR0=1;
SZ=0;
t=0;
second=0;
mint=0;
hour=12;
writecom(0x38);
wait();
writecom(0x08);
wait();
writecom(0x01);
wait();
writecom(0x06);
wait();
writecom(0x0c);
wait();
}
/////////////////////////
/////////////////////// /
////////显示函数////////
void display(uchar x,uchar *p)
{
while(*p!='\0')
{ writecom(x);
wait();
writedat(*p);
wait();
x++;p++;
delay(5);
}
}
void time0(void) interrupt 1
{
t++;
if(t==7) //溢出7次为一秒
{
t=0;
second++;
if(second==60)
{
mint++;
second=0;
if(mint==60)
{ hour++;
mint=0;
if(hour==24)hour=0;
}
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
///////////////////////////////////
//////////////////////////////////
/////////////显示时间/////////////
void display1(void)
{
date[0]=hour/10+0x30; // 第二行第一位显示时的十位
date[1]=hour%10+0x30; // 第二位显示时的个位
date[2]=0x3a; // 第三位显示":"
date[3]=mint/10+0x30; // 分的十位
date[4]=mint%10+0x30; // 分的个位
date[5]=0x3a; // ":"
date[6]=second/10+0x30; // 秒的十位
date[7]=second%10+0x30; // 秒的个位
display(0xc0,date); //
}
//////////////////////////////////////
//时间设置函数 ///////////////////////
/////////////////////////////////////
void key(void) interrupt 2
{
EA=0; //关中断 定时器停止计数
SZ=1; //设置等点亮
ZC=0; //计时等熄灭
second=0;
while(1)
{
if(FZ==0)
{
delay(5) ;
if(FZ==0) //每按下一次分加1
{
delay(5); //延时
mint++;
if(mint==60){mint=0;}
}
}
if(XZ==0)
{
delay(5) ;
if(XZ==0) //每按下一次时加1
{
delay(50);
hour++;
if(hour==24){hour=0;}
}
}
display1(); //及时显示变化
if(TC==0) break; // 退出键按下 退出时间设置
}
SZ=0; // 设置灯灭
ZC=1; // 计时灯亮
EA=1; // 开中断 定时器计数
}
/***************************************************/
/******************主函数****************************/
/****************************************************/
void main(void)
{
lcdinit();
display(0x80,time); //显示"Time"
while(1)
{
display1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -