能把問題描述清楚看來程序實現對你來說不成問題,我用偽代碼給你寫出來你自己補充完整即可。
void main()
{
unsigned char key,cont;
bit flag = 0;
初始化IO口;\\關閉紅燈點亮綠燈,數碼管顯示0
while(1)
{
key = P1&0xF;
if(key!=0xF)
{
/*按下的按鍵相應綠燈關閉*/
LED_G1 = (bit)(key&0x1);
LED_G2 = (bit)(key&0x2);
LED_G3 = (bit)(key&0x4);
LED_G4 = (bit)(key&0x8);
/*按下的按鍵相應紅色LED閃爍*/
for(cont=0;cont<5;cont++)
{
LED_R1 = (~LED_G1)|flag;
LED_R2 = (~LED_G2)|flag;
LED_R3= (~LED_G3)|flag;
LED_R4 = (~LED_G4)|flag;
Delay();//延時
flag = ~flag;
}
關閉所有紅色LED並開啟所有綠色LED;
}
}
}
注意:代碼是允許有同時按下的情況,當然也可以改為不允許同時按下的情況發生,即如果發生同時按下則隨便選擇一個按鍵,這樣覺得有點不公平。
② 怎麼把用c語言編的四路搶答器程序轉變成匯編語言的程序(程序如下)
SW1 BIT P3.0
SW2 BIT P3.1
SW3 BIT P3.2
SW4 BIT P3.3
ORG 0000H
LJMP MAIN
ORG 0030H
DELAY: ;延時毫秒
MOV R3,#2
DELAY1:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
MAIN:
JB SW1,MAIN1
MOV P2,#7FH
MOV P0,#0F9H
SJMP $
MAIN1:
JB SW2,MAIN2
MOV P2,#7FH
MOV P0,#0A4H
SJMP $
MAIN2:
JB SW3,MAIN3
MOV P2,#7FH
MOV P0,#0B0H
SJMP $
MAIN3:
MOV P2,#7FH
MOV P0,#99H
SJMP $
END
③ 急求最簡單的單片機4人搶答器c51程序
;以下是以前做的八路搶答器程序,你參考一下。
ORG 0000H
JMP BEGIN
ORG 0030H
TABLE: ; 共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H ;12345
DB 6DH,7DH,07H,7FH ;6789
DELAY: MOV R5,#20
LOOP4: MOV R6,#50H ;延時20X20ms
LOOP5: MOV R7,#100
DJNZ R7,$
DJNZ R6,LOOP5
DJNZ R5,LOOP4
RET
;---------------------------------------
BEGIN: MOV P2,#0FFH ;P2口置高電平,准備接收信號
MOV R4,#0
MOV A,R4 ;R4位標志值送A寄存器
AGAIN: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
LOOP1: MOV A,P3 ; 接收p3口的搶答信號
CPL A
JZ LOOP1
LOOP2: RRC A ;有人搶答信號則逐次移動判斷哪一位搶答
INC R4
JNC LOOP2
;********************
MOV A,R4
MOVC A,@A+DPTR ;找到相應位顯示代碼
MOV P1,A
LEDDIS:
MOV A,#0FFH
CLR C
LEDDIS1:
RLC A
DJNZ R4,LEDDIS1
MOV P0,A
LOOP3: JNB P2.2,BEGIN ;若主持人按下復位信號鍵,則轉向主程序
CPL P2.0 ;若沒按復位信號鍵,則通過p2.2口給出高低信號驅動蜂鳴器
LCALL DELAY ;調用延時子程序
SJMP LOOP3 ;p2.2口反復間隔0.4s變化,驅動蜂鳴器
END