这是一个C语言的示例,我想把它变成汇编语言,因为老师要求的。可是我编到数码管显示就不知道怎么编了。。数码管该怎么才能同步显示出来啊。。求大神指导。
#include <reg51.h>
void delay(unsigned int i); //函数声名
void display(); //函数声明
unsigned int num,time; //定义变量
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制
/************主函数**********************/
main()
{
TMOD= 0X10;//定时器1的工作方式1
EA= 1;//开启总中断
ET1= 1;//开启定时器1
TH1= 0x3c;//高位赋初值
TL1= 0xb0;//低位赋初值 3cb0是15535,则计时为(65535-15535=50000)us,即50ms
TR1= 1;//启动定时器T1
num= 0;
while(1)
{
if(num<31) //宝田路绿灯,前进路红灯,持续30s
{
P2= 0xcd; //11001101
P3= 0xfe; //11111110
time= (30-num);
display();
}
if(num>30&&num<34)// 宝田路黄灯,人行道禁止通行,前进路红灯,持续三秒
{
P2= 0xd6; //11010110
P3= 0xfe;//11111110
time= (34-num);
display();
}
if(num>33&&num<65)//前进路绿灯,宝田路红灯,持续30s
{
P2= 0x7a;//01111010
P3= 0xfd;//11111101
time= (64-num);
display();
}
if(num>64&&num<68)// 前进路黄灯,人行道禁止通行,宝田路红灯,持续三秒
{
P2= 0xba; //10111010
P3= 0xfe;//11111101
time= (67-num);
display();
}
}
}
/*******************延时函数**********************************************/
void int_1()interrupt 3
{
unsigned char n;
TH1= 0x3c;
TL1= 0xb0; //3cb0是15535,则计时为(65535-15535=50000)us,即50ms
TR1= 1;
n++;
if(n==20) //1s num加1
{
num++ ;
n= 0;
if(num== 68) //跑完整个流程是68s
num= 0;//重置时间
}
}
void display()
{
unsigned int i; //变量定义
unsigned int LedOut[10]; //变量定义
LedOut[0]=Disp_Tab[time%10000/1000];
LedOut[1]=Disp_Tab[time%1000/100];
LedOut[2]=Disp_Tab[time%100/10];
LedOut[3]=Disp_Tab[time%10];
LedOut[4]=Disp_Tab[time%10000/1000]; //千位
LedOut[5]=Disp_Tab[time%1000/100]; //百位带小数点
LedOut[6]=Disp_Tab[time%100/10]; //十位
LedOut[7]=Disp_Tab[time%10]; //个位
for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法进行位选
delay(150); //扫描间隔时间 太长会数码管会有闪烁感
}
}
void delay(unsigned int i) //延时
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
#include <reg51.h>
void delay(unsigned int i); //函数声名
void display(); //函数声明
unsigned int num,time; //定义变量
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制
/************主函数**********************/
main()
{
TMOD= 0X10;//定时器1的工作方式1
EA= 1;//开启总中断
ET1= 1;//开启定时器1
TH1= 0x3c;//高位赋初值
TL1= 0xb0;//低位赋初值 3cb0是15535,则计时为(65535-15535=50000)us,即50ms
TR1= 1;//启动定时器T1
num= 0;
while(1)
{
if(num<31) //宝田路绿灯,前进路红灯,持续30s
{
P2= 0xcd; //11001101
P3= 0xfe; //11111110
time= (30-num);
display();
}
if(num>30&&num<34)// 宝田路黄灯,人行道禁止通行,前进路红灯,持续三秒
{
P2= 0xd6; //11010110
P3= 0xfe;//11111110
time= (34-num);
display();
}
if(num>33&&num<65)//前进路绿灯,宝田路红灯,持续30s
{
P2= 0x7a;//01111010
P3= 0xfd;//11111101
time= (64-num);
display();
}
if(num>64&&num<68)// 前进路黄灯,人行道禁止通行,宝田路红灯,持续三秒
{
P2= 0xba; //10111010
P3= 0xfe;//11111101
time= (67-num);
display();
}
}
}
/*******************延时函数**********************************************/
void int_1()interrupt 3
{
unsigned char n;
TH1= 0x3c;
TL1= 0xb0; //3cb0是15535,则计时为(65535-15535=50000)us,即50ms
TR1= 1;
n++;
if(n==20) //1s num加1
{
num++ ;
n= 0;
if(num== 68) //跑完整个流程是68s
num= 0;//重置时间
}
}
void display()
{
unsigned int i; //变量定义
unsigned int LedOut[10]; //变量定义
LedOut[0]=Disp_Tab[time%10000/1000];
LedOut[1]=Disp_Tab[time%1000/100];
LedOut[2]=Disp_Tab[time%100/10];
LedOut[3]=Disp_Tab[time%10];
LedOut[4]=Disp_Tab[time%10000/1000]; //千位
LedOut[5]=Disp_Tab[time%1000/100]; //百位带小数点
LedOut[6]=Disp_Tab[time%100/10]; //十位
LedOut[7]=Disp_Tab[time%10]; //个位
for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法进行位选
delay(150); //扫描间隔时间 太长会数码管会有闪烁感
}
}
void delay(unsigned int i) //延时
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}