📄 timer.c
字号:
#include<reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit S1=P1^4;
sbit S2=P1^5;
sbit S3=P1^6;
sbit S4=P1^7;
sbit DO=P1^0;
sbit DI=P1^1;
sbit SK=P1^2;
sbit CS=P1^3;
sbit out=P3^5;
sbit buzzer=P3^4;
uchar bdata w;
sbit w7=w^7;
sbit w0=w^0;
uchar bdata ad;
sbit ad7=ad^7;
bit EXIT,dp;
uchar data disp,hd,h,x,sd,udd,vdd,cdd,mdd,fd,tim,tim_k;
uchar data ary1[4];//匝数00
uchar data ary2[4];//启动速度02
uchar data ary3[4];//减速速度04
uchar data *d;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xc7,0xaf,0xce,0x9f,0xb6,0xa3,0xbf,0xad,0x92,0xff,0xd5,0x8d,0xc1};
void msde(uchar s);/*0, 1, 2, 3, 4, 5, ,6, 7, 8, 9, a, b, c, d, e, f, 10(P),11(L),12R,13T, 14I,15X, 16O, 17-, 18N, 19S, 1a, 1bV, 1cK,1du*/
void msude(uchar ms);
void key();
void at93c46(bit com,uchar byte,uchar address,uchar data *p);
void sdt46(uchar k);
uchar rdt46();
void main( )using 0{
TMOD=0x11;P2=P1=P3=0xff;
P0=0xff;_nop_();
IE=0;cdd=0;
TH0=0x3c;TL0=0xaf;
mdd=0;TH1=0xea;TL1=0x55;
CS=SK=DI=0;DO=1;
at93c46(0,2,0x00,&ary1);
while(1){
IE=0x8a;d=ary1;
TR1=S1=S3=1;TR0=dp=0;
disp=0;buzzer=out=1;
if(S1==0){
msde(10);S1=1;//有键按下延时计数
if((S1==0)&&(++cdd>=10)){//超过规定时间进入键处理
cdd=0;ary1[0]=0x0e;
do{S1=1;}while(S1==0);
EXIT=0;
while(EXIT==0){
d=ary1;
at93c46(0,2,0x00,&ary1);//读长度
ary1[0]=0x0a;key();
d=ary2;at93c46(0,2,0x04,&ary2);//读长度
ary2[0]=0xb;key();
EXIT=0;ary3[1]=0x16;ary3[2]=0x0f;ary3[3]=0x0f;ary3[0]=0x1a;
do{S1=S4=S3=1;d=ary3;
if(S3==0){EXIT=1;ary3[0]=0x1a;ary3[1]=0x1a;ary3[2]=0x16;ary3[3]=0x18;}//on
else if(S4==0){EXIT=0;ary3[1]=0x16;ary3[2]=0x0f;ary3[3]=0x0f;}//off
}while(S1==1);
do{S1=1;}while(S1==0);}
at93c46(1,2,0x00,&ary1);
at93c46(1,2,0x04,&ary2);
}
}
else {if(S3==0){
msude(0x32);
S1=1;if(S3==0){
do{S3=1;}while(S3==0);
at93c46(0,2,0x00,&ary1);
ary3[0]=0x0c;ary3[1]=ary3[2]=ary3[3]=tim=tim_k=0;
do{
out=0;buzzer=TR0=S4=1;d=ary3;
if(tim>=20){dp=!dp;
tim=0;if(++tim_k>=60){
tim_k=0;
if(++(ary3[3])>=10){
ary3[3]=0;
if(++(ary3[2])>=6){
ary3[2]=0;
if(++(ary3[1])>=10){
ary3[1]=9;}
}
}
}
}
}while(((ary1[1]>ary3[1])||(ary1[2]>ary3[2])||(ary1[3]>ary3[3]))&&(S4==1));
TR0=0;
at93c46(0,2,0x04,&ary2);
ary3[0]=0x0c;ary3[1]=ary3[2]=ary3[3]=tim=tim_k=0;
do{
out=TR0=S4=1;;buzzer=0;d=ary3;
if(tim>=20){dp=!dp;
tim=0;if(++tim_k>=60){
tim_k=0;
if(++(ary3[3])>=10){
ary3[3]=0;
if(++(ary3[2])>=6){
ary3[2]=0;
if(++(ary3[1])>=10){
ary3[1]=9;}
}
}
}
}
}while(((ary2[1]>ary3[1])||(ary2[2]>ary3[2])||(ary2[3]>ary3[3]))&&(S4==1));
out=buzzer=1;TR1=dp=0; }
}
}
}
}//结束
void at93c46(bit com,uchar byte,uchar address,uchar data *p){
if(com==0){//读命令
for(;byte>0;byte--){
SK=DI=CS=1;
msude(2);
SK=0;msude(2);
sdt46(0x80+address);
*p++=rdt46();
*p++=rdt46();
address++;
CS=0;_nop_();
}
}
else {//写命令
for(;byte>0;byte--){
SK=DI=CS=1;
msude(2);
SK=0;msude(2);
sdt46(0x30);
CS=0;
SK=DI=CS=1;
msude(2);
SK=0;msude(2);
sdt46(0x40+address);
sdt46(*p++);
sdt46(*p++);
CS=0;
_nop_();
SK=DI=CS=1;
msude(2);
SK=0;msude(2);
sdt46(0x00);
CS=0;_nop_();
address++;
_nop_();}
}
}
void sdt46(uchar k){//写操作
uchar i;
w=k;
for(i=0;i<8;i++){
DI=w7;w<<=1;
SK=1;msude(2);
SK=0;msude(2); }
}
uchar rdt46(){ //读操作
uchar i;
for(i=0;i<7;i++){
SK=1;msude(2);
SK=0;msude(2);
w0=DO;w<<=1;
}
SK=1;msude(2);
SK=0;msude(2);
w0=DO;
return(w);
}
void key(){
uchar v=0;disp=0x10;
do{
S1=S2=S3=S4=1;
msde(30);
if(S2==0){
if(++v>=3)v=0;
else v=v;
do{S2=1;}while(S2==0);}
switch(v){
case 0:{
disp=0x10;
if(S3==0){
if(++(*(d+3))>=10){
*(d+3)=0;
if(++(*(d+2))>=6){
*(d+2)=0;
if(++(*(d+1))>=10){
*(d+1)=9;*(d+2)=5;*(d+3)=9;
}
}
}
}
else if(S4==0){
if(*(d+3)==0){
if(*(d+2)==0){
if(*(d+1)==0)*(d+2)=*(d+1)=*(d+3)=0;
else {(*(d+1))--;*(d+3)=9;*(d+2)=5;}
}
else {(*(d+2))--;*(d+3)=9;}
}
else (*(d+3))--;}
}break;
case 1:{
disp=0x20;
if(S3==0){
if(++(*(d+2))>=6){
*(d+2)=0;
if(++(*(d+1))>=10){
*(d+2)=5;*(d+1)=9;
}
}
}
else if(S4==0){
if(*(d+2)==0){
if(*(d+1)==0)*(d+2)=*(d+1)=0;
else {(*(d+1))--;*(d+2)=5;}
}
else {(*(d+2))--;}
}
}break;
case 2:{
disp=0x40;
if(S3==0){
if(++(*(d+1))>=10)
*(d+1)=9;
}
else if(S4==0){
if(*(d+1)==0);
else (*(d+1))--;}
}break;
default:
break;
}
}while(S1==1);
do{S1=1;}while(S1==0);
disp=0;
}
void timer1()interrupt 3 using 1 {
P0=P2=0xff;
if(vdd>=4){
sd=0xfe;vdd=0;
ad=disp;}
fd=*(d+vdd++);P2=sd;
if((vdd==2)&&(dp==1))P0=tab[fd]&0x7f;
else P0=tab[fd];sd=_crol_(sd,1);
if(ad7==1){TH1=0xea;TL1=0x55;}
else {TH1=0xf9;TL1=0x55;}
ad<<=1;TR1=1;
}
void timer0()interrupt 1 {
tim++;
TH0=0x3c;TL0=0xb6;}
void msde(uchar s)
{
while(s--)msude(0xfa);
}
void msude(uchar ms){
uchar i;
while(ms--)
{
for(i=0;i<=0x05;i++)
i=i ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -