📄 22.c
字号:
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^0;
sbit rw=P3^1;
sbit e=P3^2;
sbit ds=P1;
sbit key=P2^0;
sbit bf=P1^7;
uint ms=0;
uint second=0;
uint min=0;
uint hr=0;
uint day=0;
uint keytime=0;
uchar code tab[]={"***FM1602A--3***"};
uchar code tab1[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11,
0x1F,0x11,0x11,0x11,0x1F,0x11,0x11,0x1F}; // 月日
uchar code number[]={"0123456789"};
uchar code inti0[]={"11 26 00:00:00"};
void nop(){}
void delaym(uint q) //延时
{uchar n;
while(q--)
{for(n=0;n<24;n++){;;}}
}
void delay(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
} /////// 精确MS,
void check() // 判忙
{rs=0;
rw=1;
e=0;
P1=0xff;
e=1;
nop();
nop();
while(P&0x80){};
delaym(10);
}
void sendc(uchar com) // 发命令字
{check();
rs=0;
rw=0;
e=1;
P1=com;
nop();
e=0;
nop();
}
void sendd(uchar word) // 发显示字
{check();
rs=1;
rw=0;
e=1;
P1=word;
nop();
e=0;
nop();
}
void inti() // 初始化
{uchar d;
sendc(0x01);
sendc(0x38);
sendc(0x0c);
sendc(0x06);
delaym(10);
sendc(0x80);
for(d=0;d<16;d++)
{sendd(*(inti0+d));};
sendc(0x82);
sendd(0x00);
sendc(0x85);
sendd(0x01);
sendc(0xc0);
for(d=0;d<16;d++)
{sendd(*(tab+d));};
}
void cpuinti() //////////CPU开中断
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
EA=1;
ET0=1;
}
void displayday() //////显示天
{uchar do1,dt;
if(day>9)
{
dt=day/10;
do1=day%10;}
else{dt=0;do1=day;};
sendc(0x83);
sendd(*(number+dt));
sendc(0x84);
sendd(*(number+do1));
while(day==31)
{day=1;
};
}
void displayhr() //////显示小时
{uchar ho,ht;
if(hr>9)
{
ht=hr/10;
ho=hr%10;}
else{ht=0;ho=hr;};
sendc(0x88);
sendd(*(number+ht));
sendc(0x89);
sendd(*(number+ho));
while(hr==24)
{hr=0;
day++;
displayday();
};
}
void displaymin() ///////////显示 分
{uchar mo,mt;
if(min>9)
{
mt=min/10;
mo=min%10;}
else{mt=0;mo=min;};
sendc(0x8b);
sendd(*(number+mt));
sendc(0x8c);
sendd(*(number+mo));
while(min==60)
{min=0;
hr++;
displayhr();};
}
void displaysec() /////////////显示 秒
{uchar o,t;
if(second>9)
{
t=second/10;
o=second%10;}
else{t=0;o=second;};
sendc(0x8e);
sendd(*(number+t));
sendc(0x8f);
sendd(*(number+o));
while(second==60)
{second=0;
min++;
displaymin();};
}
void keyt ()
{keytime=0; ///////// 键时
while(key==0){delay(1);keytime++;}; /////////// 按键计时
}
void dayshine() ////////////设置天位
{sendc(0x83);
sendc(0x84);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000)
{TR0=1;sendc(0x0c);sendc(0x06);while(1){};};
day++;if(day==31){day=0;};displayday();
};
}
void hrshine() ////////////设置小时位
{sendc(0x88);
sendc(0x89);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000)
{displayhr();dayshine();};
hr++;if(hr==24){hr=0;};displayhr();
};
}
void minshine() ///////// 设置分位
{sendc(0x8b);
sendc(0x8c);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000){displaymin();hrshine();};
min++;if(min==60){min=0;};displaymin();
};
}
void secshine() ///////// 设置秒位
{sendc(0x8e);sendc(0x0f);
sendc(0x04);
sendc(0x8f);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000){displaysec();minshine();};
second++;if(second==60){second=0;};displaysec();};
}
void longkey()
{for(;;){if(key==0){TR0=0;keyt();if(keytime>1000){ secshine(); }
};};
}
void setcgram() ///////////// 设置CGRAM
{uchar x;
sendc(0x40);
for(x=0;x<16;x++)
{sendd(*(tab1+x));}
}
void timer() interrupt 1 ///////////中断入口
{
ms++;
displaysec();
while(ms==15){;TH0=0x3c;TL0=0xb0;
ms=0;
second++;}
}
void main()
{setcgram();
inti();
cpuinti();
longkey();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -