51单片机问题,按下K1流水灯从上到下,再从下往上流动,然后停止,按下K2计数显示器显示数字从9到0

如图所示向大佬们求助,编程!
2025-05-11 12:58:22
推荐回答(2个)
回答(1):

#include
#include
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳级数码管码表0-9
sbit k1=P3^2;
sbit k2=P3^3;
uchar key;
uchar led=0xfe,num;
uchar flag;
void delay(uchar ms)
{
uchar i;
while(ms--)for(i=0;i<120;i++);
}
main()
{
    if(k1==0)
    {
    key=1;
    flag=0;
    while(k1==0);
    }
    if(k2==0)
    {
    key=2;
    dat=9;
    while(k2==0);
    }
    if(key==1)
    {
    if(flag==0)
        {
        P1=_crol_(led,1);
        num++;
        delay(250);
        if(num>=8){flag=~flag;led=0x7f;}
        }
    else
        {
        P1=_cror_(led,1);
        num++;
        delay(250);
        if(num>=8){flag=~flag;led=0xfe;}
        }
    }
    if(key==2)
    {
    P2=table[dat];
    dat--;
    if(dat>9)dat=9;
    delay(250);
    }
}

回答(2):

K1 EQU P1.0K2 EQU P1.1ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,#0FEH CLR 00H CLR 01HLOOP: JB K1,LOOP1 SETB 00H CLR 01H SJMP LOOPLOOP1: JB K2,LOOP2 SETB 01H CLR 00HLOOP2: JB 01H,LOOP3 JB 00H,LOOP4 SJMP MAINLOOP3: MOV P0,A RR A LCALL DELAY SJMP LOOPLOOP4: MOV P0,A RL A LCALL DELAY SJMP LOOPDELAY: MOV R2,#200DLY: MOV R3,#250 DJNZ R3,$ DJNZ R2,DLY RET END