P1口外接8个LED,通过按键控制,实现左右移动的流水灯

时间:2025-03-15 08:53:29
    temp = 0xfe;
    P1 = temp;
    while(1);
}
//-------------------------------------------
void T0_int(void) interrupt 1       //每隔10ms执行一次
{
    TH0 = (65536 - 10000) / 256;    //定时
    TL0 = (65536 - 10000) % 256;
    i++;
    if(i >= 100) {
      i = 0;
      if(j0 == 0) temp = _crol_(temp, 1);
      if(j0 == 1) temp = _cror_(temp, 1);
      P1 = temp;
}   }
//-------------------------------------------
void X0_int(void) interrupt 0 using 1
{
    unsigned char k;
    j0 = ~j0;                       //改变运动方向
    for(k = 200; k > 0; k--);       //延时一会再退出,以避免抖动
}
//===========================================================
下面是用汇编语言编写的控制程序,效果与C语言相同。
        ORG   0000H
        SJMP START
        ORG   0003H
        SJMP X0_INT
        ORG   000BH
        SJMP T0_INT
;-------------------------------------------
START:      
        MOV TMOD, #01H
        MOV TH0, #(65536 - 50000) / 256;     //定时
        MOV TL0, #(65536 - 50000) MOD 256;   //定时
        SETB TR0
        SETB ET0
        SETB IT0
        SETB EX0
        SETB PT0
        SETB EA
        MOV R3, #20
        MOV R2, #7FH
        MOV P1, R2
        SJMP $
;-------------------------------------------
X0_INT:
        CPL   F0
        JNB   P3.2, $      ;等待按键释放
        RETI
;-------------------------------------------
T0_INT:
        MOV TL0, #(65536 - 50000) MOD 256;   //定时
        MOV TH0, #(65536 - 50000) / 256;     //定时
        DJNZ R3, T0_END
        MOV R3, #20
        MOV A, R2
        JNB F0, DDD
        RL   A
        SJMP EEE
DDD:
        RR    A
EEE:
        MOV   R2, A
        MOV   P1, A
T0_END:
        RETI
;-------------------------------------------
        END
//===========================================================