RETI
L: SETB P2.3 CLR P2.4 LCALL DELAY1 SETB P2.4 RET
/***************延时程序**********************/ DELAY :MOV R5,30H DEL0:MOV R6,#200 DEL1:MOV R7,#250 DEL2: DJNZ R7,DEL2 DJNZ R6,DEL1 LCALL NET
DJNZ R5,DEL0
RET
DELAY1 :MOV R2,#30 DEL11:MOV R3,#200 DEL12:MOV R4,#250 DEL13: DJNZ R4,DEL13 DJNZ R3,DEL12 LCALL NET
DJNZ R2,DEL11
RET
/*********数码管程序***************************/ NET:
MOV DPTR,#TAB MOV A,R5 MOV B,#100 DIV AB
MOVC A,@A+DPTR
11
MOV P0,A;P0为你的数码管接口 ,第二个数码管为个位数字 SETB P1.0
MOV DPTR,#TAB MOV A,R5
CLR P1.0 MOV B,#10 DIV AB
MOVC A,@A+DPTR
MOV P0,A;P1为你的数码管接口 ,第二个数码管为个位数字 SETB P1.1 RET END
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 附:我们在用汇编写程序的同时用C也编了程序,如下
(其电路图和接口跟汇编的有所不同,但大同小异,在此不再赘述) #include
typedef unsigned char uchar; typedef unsigned int uint;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0}; sbit key1=P3^2; sbit key2=P3^3;
sbit led_y=P2^2; sbit led_r=P2^4; sbit led_g=P2^3;
uint MS,state=0,flag=0,INT_MS; void seg_display(); void delay(uint ms); void init(); void delay_led(); void led_display();
void main()
12
{
led_y=0; //黄灯亮 if(key2==0) //按键 { }
void delay_led()//这样分开赋值,防止全局变量MS在进入中断后值发生改变 { uint j;
if(flag==0) //中断标志位为0情况,即未进入中断
for(MS;MS>0;MS--)
seg_display(); for(j=10;j>0;j--);
{
{
if(key2==0) //按键确实按下 {
init(); //中断初始化 //label:;
led_y=1; //黄灯灭 while(1)led_display(); }
}
} }
else if(flag) {
for(INT_MS;INT_MS>0;INT_MS--)
seg_display(); for(j=10;j>0;j--); } {
//中断标志位为1情况,进入中断
13
} flag=0;
}
void led_display() { led_y=0; //黄灯亮
state=1;
//按键标志位设为1
MS=300; // 延时3s delay_led(); //数码管显示 led_y=1; //黄灯亮 state=0;
// 标志位清0
led_r=0; state=2; MS=500; delay_led(); led_r=1; state=0;
led_g=0; state=3; MS=1000; delay_led(); led_g=1; state=0; }
void seg_display() { if(flag==0) //中断标志位为0情况,即未进入中断 { P1=0x01;
//数码管1显示
P0=tab[MS/900];
//数码管1显示内容
14
delay(5); //数码管1显示延时 P0=0xff;
//数码管1显示消影
P1=0x02;
P0=tab[MS/100+1]; delay(5); P0=0xff;
}
else if(flag)
//中断标志位为1情况,进入中断 { P1=0x01;
P0=tab[INT_MS/900]; delay(5); P0=0xff; P1=0x02;
P0=tab[INT_MS/100+1]; delay(5); P0=0xff;
}
}
void delay(uint ms) { uint j; while(ms--)
for(j=100;j>0;j--) ;
}
void led_int()interrupt 0 {
//进入中断标志位flag为1
flag=1; 15