本帖最后由 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);
- }
- }
|