📄 caijiduan.c
字号:
#include <reg51.h>
#define uchar unsigned char
uchar code dis_7[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};
short dis[8][4];
short TAB[4][4]={
{0x00,0x01,0x02,0x03},
{0x04,0x05,0x06,0x07},
{0x08,0x08,0x08,0x08},
{0x08,0x08,0x08,0x08}
};
short n;
sbit dot=P0^7;
sbit P3_3=P3^3;
sbit alarm=P3^4;
/*初始化*/
void init()
{
TMOD=0x21; //T1自动重装,T0工作在16位计数
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
TCON=0x51; //启动T0,T1
SCON=0X50;
EA=1;
ES=1;
ET0=1;
EX0=1;
P3_3=0;
alarm=0;
n=8;
}
/*延时1ms子程序*/
void delay(short t)
{
short i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
/*发送子程序*/
void send(short h,short l)
{
do {
P3_3=1;
SBUF=TAB[h][l];while(!TI);TI=0;
P3_3=0;
while(!RI);RI=0;
}
while(SBUF!=TAB[h][l]);
P3_3=1;
SBUF=0xaa;while(!TI);TI=0;
P3_3=0;
}
/*T0中断*/
void t0() interrupt 1
{
alarm=1;
}
/*键盘扫描中断*/
void keyscan()interrupt 0
{
short H,L;
EA=0;
P2=0xf0;
if((P2&0xf0)!=0xf0)
{
delay(5);
switch(P2)
{
case 0x70: H=0;break;
case 0xb0: H=1;break;
case 0xd0: H=2;break;
case 0xe0: H=3;break;
default: break;
}
P2=0x0f;
if((P2&0x0f)!=0x0f)
{
switch(P2)
{
case 0x07: L=0;break;
case 0x0b: L=1;break;
case 0x0d: L=2;break;
case 0x0e: L=3;break;
default: break;
}
do delay(5);
while((P2&0x0f)!=0x0f);
n=TAB[H][L];
send(H,L);
}
}
EA=1;
}
/*接收中断子程序*/
void receive() interrupt 4
{
unsigned short temp;
if(RI==1)
{
EA=0;
RI=0;
temp=SBUF;
P3_3=1;
SBUF=temp;while(!TI);TI=0;
P3_3=0;
while(!RI);RI=0;
if(SBUF==0xaa)
{
n=temp;
do{
while(!RI);RI=0;
temp=SBUF;
P3_3=1;
SBUF=temp;while(!TI);TI=0;
P3_3=0;
while(!RI);RI=0;
}
while(SBUF!=0xaa);
dis[n][0]=n+1;
dis[n][1]=temp/51;
dis[n][3]=temp%51*10;
dis[n][2]=dis[n][3]/51;
dis[n][3]=dis[n][3]%51*10/51;
}
else EA=1;
}
TR0=0; //计数器T0置0
TL0=0x00;
TH0=0x00;
TR0=1;
}
/*显示子程序*/
void display()
{
short i,k;
int h;
if(n!=8) /*单路显示*/
{
for(h=0;h<500;h++) /*显示时间1秒*/
{
for(k=0;k<4;k++)
{
P0=dis_7[dis[n][k]];
if(k==2) {dot=0;}
P1=scan_con[k];
delay(1);
P1=0xff;
}
}
}
else { /*循环显示*/
for(i=0;i<8;i++)
{
for(h=0;h<500;h++)
{
for(k=0;k<4;k++)
{
P0=dis_7[dis[i][k]];
if(k==2) {dot=0;}
P1=scan_con[k];
delay(1);
P1=0xff;
}
}
}
}
}
/*主程序*/
void main()
{
init();
while(1)
{
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -