本帖最后由 ningling_21 于 2015-7-12 15:18 编辑
显示部分自己改下
#include<reg52.h>
#define uchar unsigned char
unsigned char flag,a=0;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void dynamic_led(unsigned char z); //声明动态扫描子程序
void delay(uchar dly)
{
while(dly--);
}
void main()
{
TMOD=0x20;//设置定时器1为工作方式2(自动回装)
TH1=0xfd; //装自动回装的初值(确定波特率)
TL1=0xfd; //装定时器的第一次初值(以后的就可以通过自动回装完成)
TR1=1; //启动定时器1
REN=1; //让串口允许接收数据
SM0=0; //设置串口的工作方式
SM1=1; //设置串口的工作方式
EA=1; //开启总中断
ES=1; //开启串口中断
a =0;
while(1)
{
if(flag==1) //等待中断里边接收数据,没有数据无法进入
{ //if循环,于是一直在while循环里等待
ES=0; //flag为1,进入循环,关掉中断
flag=0; //flag重新置为0,发送完成后退出if语句
SBUF=a; //将变量a的数值放进发送存储器
while(!TI); //等待发送完毕(发送完后TI自动置1,结束循环)
TI=0; //重新将TI置0
ES=1; //重新开启串行中断
}
dynamic_led(a); //数码管动态显示子程序,显示数据A
}
}
void ser() interrupt 4
{
RI=0; //把中断清零,使其能够继续接收数据
P1=SBUF; //在P1口显示数据
a=SBUF; //把接收等到的数据存入变量a,待会再返发回去
flag=1; //接收到数据后flag置1,主函数才能进入if语句
}
//动态扫描子程序
void dynamic_led(unsigned char z)
{
unsigned char x;
uchar bai,shi ,ge;
unsigned char weila,ledwei;
weila=0x1c;
x=z;
for(ledwei=0;ledwei<=3;ledwei++)
{
ge =x%100%10;
shi =x%100/10;
bai =x/100;
switch( ledwei)
{
case 0:P2=~0x01;
P0=~table[0];
break;
case 1:P2=~0x02;
P0=~table[bai];
break;
case 2:P2=~0x04;
P0=~table[shi];
break;
case 3:P2=~0x08;
P0=~table[ge];
break;
}
// weila=weila-0x04;
delay(200);
}
}
|