📄 timerzwh.c
字号:
//采用8位LED软件译码动态显示,P0为字段码,P2为位选码,数码管共阳;
//key0为位选键;key1为加“1键;key2为减“1”键。
#include "reg51.h"
#include "absacc.h"
#define COM8155 XBYTE[0X7FF8]
#define PA8155 XBYTE[0X7FF9]
#define PB8155 XBYTE[0X7FFA]
#define PC8155 XBYTE[0X7FFB]
#define uchar unsigned char
uchar code dis_7[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0X40};
//0, 1, 2, 3,4,5,6,7,8,9,"灭”和“-”
uchar code scan_con[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//位的选择
uchar _data_dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//显示缓冲区,时,分和秒初始为0,0x0b为“-”的编码
uchar data timedata[3]={0x00,0x00,0x00}; //秒,分,时
uchar data ms50=0x00,con=0x03,con1=0x00,con2=0x00,time04s=0x00;
uchar data key1flag=0x00,key2flag=0x00,key3flag=0x00,flag1=0x00;
//1ms延时
delay1ms(int t)
{ int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
//数码管显示
display()
{ char k;
_data_dis[0]=timedata[0]%10; _data_dis[1]=timedata[0]/10;
if ((con==1)&&(flag1%2==1))
{ _data_dis[3]=0x0a; _data_dis[4]=0x0a;}
else
{_data_dis[3]=timedata[1]%10; _data_dis[4]=timedata[1]/10;}
if ((con==2)&&(flag1%2==1))
{ _data_dis[6]=0x0a; _data_dis[7]=0x0a;}
else
{_data_dis[6]=timedata[2]%10; _data_dis[7]=timedata[2]/10;}
for(k=0;k<8;k++)
{ PB8155=dis_7[ _data_dis[k]];PA8155=scan_con[7-k];delay1ms(1);PB8155=0x00;}
}
//按键处理
keyscan()
{
PA8155=0x00;
if((PC8155&0x08)==0)
{
if(key1flag==0)
{ key1flag=1;}
else
{ while((PC8155&0x08)==0){display();}
key1flag=0;
con--;
if(con<=0)
{ con=3;TR0=1;ET0=1;}
}
}
else key1flag=0;
if(con!=3)
{ if((PC8155&0x04)==0)
{
if(key2flag==0)
{ key2flag=1;}
else
{ while((PC8155&0x04)==0){display();}
key2flag=0;
timedata[con]++;
if(con==2) con1=24;else con1=60;
if(timedata[con]>=con1)
{ timedata[con]=0;}
}
}
else key2flag=0;
}
if(con!=3)
{ if((PC8155&0x02)==0)
{
if(key3flag==0)
{ key3flag=1;}
else
{ while((PC8155&0x02)==0){display();}
key3flag=0;
timedata[con]--;
if(con==2) con2=23;else con2=59;
if(timedata[con]==255)
{ timedata[con]=con2;}
}
}
else key3flag=0;
}
}
//主函数
main()
{ TH0=0x3c;TL0=0xb0;
TMOD=0x01;ET0=1;TR0=1;EA=1;
COM8155=0x03;
while(1)
{
display();
}
}
//定时器/记数器T0中断服务
void time_intt0(void)interrupt 1
{
TH0=0x3c;TL0=0xb0;ET0=1;EA=1;
if(con==3)
{ ms50++;
if(ms50==40)
{ ms50=0x00;timedata[0]++;
if(timedata[0]==60)
{ timedata[0]=0;timedata[1]++;
if(timedata[1]==60)
{ timedata[1]=0;timedata[2]++;
if(timedata[2]==24)
{timedata[2]=0;
}
}
}
}
}
else
{ time04s++;
if (time04s==10)
{ time04s=0;flag1++;} }
PA8155=0x00;
if((PB8155&0x0e)!=0x0e)
keyscan();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -