?? qdq_8.sdi
字號:
,,,;============================================================
,,,;================ 八路搶答器程序 =======================
,,,;================ 李方方 =======================
,,,;================ 2008 年 6 月 =======================
,,,;============================================================
,,, OK EQU 20H;搶答開始標志位
,,,
,,, RING EQU 22H;響鈴標志位
,,,
,,, ORG 0000H
,,,
0000,01 40,, AJMP MAIN
,,,
,,, ORG 0003H
,,,
0003,01 BB,, AJMP INT0SUB
,,,
,,, ORG 000BH
,,,
000B,41 93,, AJMP T0INT
,,,
,,, ORG 0013H
,,,
0013,01 F0,, AJMP INT1SUB
,,,
,,, ORG 001BH
,,,
001B,41 9F,, AJMP T1INT
,,,
,,, ORG 0040H
,,,
0040,79 1E,MAIN,MAIN: MOV R1,#30;初設搶答時間為30s
,,,
0042,7A 3C,, MOV R2,#60;初設答題時間為60s
,,,
0044,75 89 11,, MOV TMOD,#11H;設置未定時器/模式1
,,,
0047,75 8C F0,, MOV TH0,#0F0H
,,,
004A,75 8A FF,, MOV TL0,#0FFH;越高發聲頻率越高,越尖
,,,
004D,75 8D 3C,, MOV TH1,#3CH
,,,
0050,75 8B B0,, MOV TL1,#0B0H;50ms為一次溢出中斷
,,,
0053,D2 AF,, SETB EA
,,,
0055,D2 A9,, SETB ET0
,,,
0057,D2 AB,, SETB ET1
,,,
0059,D2 A8,, SETB EX0
,,,
005B,D2 AA,, SETB EX1;允許四個中斷,T0/T1/INT0/INT1
,,,
005D,C2 20,, CLR OK
,,,
005F,C2 22,, CLR RING
,,,
0061,D2 8E,, SETB TR1
,,,
0063,D2 8C,, SETB TR0;一開始就運行定時器,以開始顯示FFF.如果想重新計數,重置TH1/TL1就可以了
,,,
,,,;=====查詢程序=====
,,,
0065,7D 0B,START,START: MOV R5,#0BH
,,,
0067,7C 0B,, MOV R4,#0BH
,,,
0069,7B 0B,, MOV R3,#0BH
,,,
006B,51 1E,, ACALL DISPLAY;未開始搶答時候顯示FFF
,,,
006D,20 B0 11,, JB P3.0,NEXT;ddddddd
,,,
0070,51 61,, ACALL DELAY
,,,
0072,20 B0 0C,, JB P3.0,NEXT;去抖動,如果"開始鍵"按下就向下執行,否者跳到非法搶答查詢
,,,
0075,51 8A,, ACALL BARK;按鍵發聲
,,,
0077,E9,, MOV A,R1
,,,
0078,FE,, MOV R6,A;送R1->R6,因為R1中保存了搶答時間
,,,
0079,D2 20,, SETB OK;搶答標志位,用于COUNT只程序中判斷是否查詢搶答
,,,
007B,7F 01,, MOV R7,#01H ;讀搶答鍵數據信號標志,這里表示只讀一次有用信號
,,,
007D,7B 0A,, MOV R3,#0AH;搶答只顯示計時,滅號數
,,,
007F,21 29,, AJMP COUNT;進入倒計時程序,"查詢有效搶答的程序"在COUNT里面
,,,
0081,30 90 17,NEXT,NEXT: JNB P1.0,FALSE1
,,,
0084,30 91 18,, JNB P1.1,FALSE2
,,,
0087,30 92 19,, JNB P1.2,FALSE3
,,,
008A,30 93 1A,, JNB P1.3,FALSE4
,,,
008D,30 94 1B,, JNB P1.4,FALSE5
,,,
0090,30 95 1C,, JNB P1.5,FALSE6
,,,
0093,30 96 1D,, JNB P1.6,FALSE7
,,,
0096,30 97 1E,, JNB P1.7,FALSE8
,,,
0099,01 65,, AJMP START
,,,
,,,;=====非法搶答處理程序=====
,,,
009B,7B 01,FALSE1,FALSE1: MOV R3,#01H
,,,
009D,21 EA,, AJMP ERROR
,,,
009F,7B 02,FALSE2,FALSE2: MOV R3,#02H
,,,
00A1,21 EA,, AJMP ERROR
,,,
00A3,7B 03,FALSE3,FALSE3: MOV R3,#03H
,,,
00A5,21 EA,, AJMP ERROR
,,,
00A7,7B 04,FALSE4,FALSE4: MOV R3,#04H
,,,
00A9,21 EA,, AJMP ERROR
,,,
00AB,7B 05,FALSE5,FALSE5: MOV R3,#05H
,,,
00AD,21 EA,, AJMP ERROR
,,,
00AF,7B 06,FALSE6,FALSE6: MOV R3,#06H
,,,
00B1,21 EA,, AJMP ERROR
,,,
00B3,7B 07,FALSE7,FALSE7: MOV R3,#07H
,,,
00B5,21 EA,, AJMP ERROR
,,,
00B7,7B 08,FALSE8,FALSE8: MOV R3,#08H
,,,
00B9,21 EA,, AJMP ERROR
,,,
,,,
,,,;=====INT0(搶答時間R1調整程序)=====
,,,
00BB,E9,INT0SUB,INT0SUB:MOV A,R1
,,,
00BC,75 F0 0A,, MOV B,#0AH
,,,
00BF,84,, DIV AB
,,,
00C0,FD,, MOV R5,A
,,,
00C1,AC F0,, MOV R4,B
,,,
00C3,7B 0A,, MOV R3,#0AH
,,,
00C5,51 1E,, ACALL DISPLAY;先在兩個時間LED上顯示R1
,,,
00C7,30 B4 08,, JNB P3.4,INC0;P3.4為+1s鍵,如按下跳到INCO
,,,
00CA,30 B5 14,, JNB P3.5,DEC0;P3.5為-1s鍵,如按下跳到DECO
,,,
00CD,30 B1 1F,, JNB P3.1,BACK0;P3.1為確定鍵,如按下跳到BACKO
,,,
00D0,01 BB,, AJMP INT0SUB
,,,
00D2,E9,INC0,INC0: MOV A,R1
,,,
00D3,B4 63 06,,CJNE A,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
,,,
00D6,79 00,, MOV R1,#00H
,,,
00D8,51 58,, ACALL DELAY1
,,,
00DA,01 BB,,AJMP INT0SUB
,,,
00DC,09,ADD0,ADD0: INC R1
,,,
00DD,51 58,, ACALL DELAY1
,,,
00DF,01 BB,, AJMP INT0SUB
,,,
00E1,E9,DEC0,DEC0: MOV A,R1
,,,
00E2,60 05,, JZ SETR1;如果R1為0, R1就置99,
,,,
00E4,19,, DEC R1
,,,
00E5,51 58,, ACALL DELAY1
,,,
00E7,01 BB,, AJMP INT0SUB
,,,
00E9,79 63,SETR1,SETR1: MOV R1,#63H
,,,
00EB,51 58,, ACALL DELAY1
,,,
00ED,01 BB,, AJMP INT0SUB
,,,
00EF,32,BACK0,BACK0: RETI
,,,
,,,;=====INT1(回答時間R2調整程序)=====
,,,
00F0,EA,INT1SUB,INT1SUB:MOV A,R2
,,,
00F1,75 F0 0A,, MOV B,#0AH
,,,
00F4,84,, DIV AB
,,,
00F5,FD,,MOV R5,A
,,,
00F6,AC F0,, MOV R4,B
,,,
00F8,7B 0A,, MOV R3,#0AH
,,,
00FA,51 1E,, ACALL DISPLAY
,,,
00FC,30 B4 08,, JNB P3.4,INC1
,,,
00FF,30 B5 14,, JNB P3.5,DEC1
,,,
0102,30 B1 1F,, JNB P3.1,BACK1
,,,
0105,01 F0,, AJMP INT1SUB
,,,
0107,EA,INC1,INC1: MOV A,R2
,,,
0108,B4 63 06,, CJNE A,#63H,ADD1
,,,
010B,7A 00,, MOV R2,#00H
,,,
010D,51 58,, ACALL DELAY1
,,,
010F,01 F0,,AJMP INT1SUB
,,,
0111,0A,ADD1,ADD1: INC R2
,,,
0112,51 58,, ACALL DELAY1
,,,
0114,01 F0,, AJMP INT1SUB
,,,
0116,EA,DEC1,DEC1: MOV A,R2
,,,
0117,60 05,, JZ SETR2
,,,
0119,1A,, DEC R2
,,,
011A,51 58,, ACALL DELAY1
,,,
011C,01 F0,, AJMP INT1SUB
,,,
011E,7A 63,SETR2,SETR2: MOV R2,#63H
,,,
0120,51 58,, ACALL DELAY1
,,,
0122,01 F0,, AJMP INT1SUB
,,,
0124,32,BACK1,BACK1: RETI
,,,
,,,;=====倒計時程序(搶答倒計時和回答倒計時都跳到改程序)=====
,,,
0125,EA,REPEAT,REPEAT:MOV A,R2 ;使用錦囊時重新計時
,,,
0126,FE,, MOV R6,A
,,,
0127,C2 22,, CLR RING
,,,
0129,78 00,COUNT,COUNT: MOV R0,#00H;重置定時器中斷次數
,,,
012B,75 8D 3C,, MOV TH1,#3CH
,,,
012E,75 8B B0,, MOV TL1,#0B0H;重置定時器
,,,
0131,EE,RECOUNT,RECOUNT:MOV A,R6;R6保存了倒計時的時間,之前先將搶答時間或回答時間給R6
,,,
0132,75 F0 0A,, MOV B,#0AH
,,,
0135,84,, DIV AB;除十分出個位/十位
,,,
0136,F5 30,, MOV 30H,A;十位存于(30H)
,,,
0138,85 F0 31,, MOV 31H,B;個位存于(31H)
,,,
013B,AD 30,, MOV R5,30H;取十位
,,,
013D,AC 31,, MOV R4,31H;取個位
,,,
013F,EE,, MOV A,R6
,,,
0140,94 07,, SUBB A,#07H
,,,
0142,50 15,, JNC LARGER;大于5s跳到LARGER,小于等于5s會提醒
,,,
0144,E8,, MOV A,R0
,,,
0145,B4 0A 04,, CJNE A,#0AH,FULL;1s中0.5s向下運行
,,,
0148,C2 22,, CLR RING
,,,
014A,21 60,, AJMP CHECK
,,,
014C,B4 14 11,FULL,FULL: CJNE A,#14H,CHECK;下面是1s的情況,響并顯示號數并清R0,重新計
,,,
014F,D2 22,, SETB RING
,,,
0151,EE,, MOV A,R6
,,,
0152,60 40,, JZ QUIT;計時完畢
,,,
0154,78 00,, MOV R0,#00H
,,,
0156,1E,, DEC R6;一秒標志減1
,,,
0157,21 60,, AJMP CHECK
,,,
0159,E8,LARGER,LARGER: MOV A,R0
,,,
015A,B4 14 03,, CJNE A,#14H,CHECK;如果1s向下運行,否者跳到查"停/顯示"
,,,
015D,1E,, DEC R6;計時一秒R6自動減1
,,,
015E,78 00,, MOV R0,#00H
,,,
0160,30 B1 31,CHECK,CHECK: JNB P3.1,QUIT;如按下停止鍵退出
,,,
0163,30 20 02,, JNB OK,CHECKK ;只在回答倒計時才有效
,,,
0166,21 6B,, AJMP NEXTT
,,,
0168,30 B0 BA,CHECKK,CHECKK:JNB P3.0,REPEAT ;判斷是否使用錦囊
,,,
016B,51 1E,NEXTT,NEXTT: ACALL DISPLAY
,,,
016D,20 20 02,, JB OK,ACCOUT;如果是搶答倒計時,如是則查詢搶答,否者跳過查詢繼續倒數(這里起到鎖搶答作用)
,,,
0170,21 31,, AJMP RECOUNT
,,,
0172,,ACCOUT,ACCOUT:
0172,E5 36,, MOV A,36H
,,,
0174,30 E0 23,, JNB ACC.0,TRUE1
,,,
0177,30 E1 2A,, JNB ACC.1,TRUE2
,,,
017A,30 E2 31,, JNB ACC.2,TRUE3
,,,
017D,30 E3 38,, JNB ACC.3,TRUE4
,,,
0180,30 E4 3F,, JNB ACC.4,TRUE5
,,,
0183,30 E5 46,, JNB ACC.5,TRUE6
,,,
0186,30 E6 05,, JNB ACC.6,TZ1
,,,
0189,30 E7 05,, JNB ACC.7,TZ2
,,,
018C,21 31,, AJMP RECOUNT
,,,
018E,02 01 D6,TZ1, TZ1:JMP TRUE7
,,,
0191,02 01 E0,TZ2, TZ2:JMP TRUE8
0194,C2 20,QUIT, QUIT: CLR OK;如果按下了"停止鍵"執行的程序
,,,
0196,C2 22,, CLR RING
,,,
0198,01 65,, AJMP START
,,,
,,,;=====正常搶答處理程序=====
,,,
019A,51 8A,TRUE1,TRUE1: ACALL BARK
,,,
019C,EA,, MOV A,R2
,,,
019D,FE,, MOV R6,A;搶答時間R2送R6
,,,
019E,7B 01,, MOV R3,#01H
,,,
01A0,C2 20,, CLR OK;因為答題的計時不再查詢搶答,所以就鎖了搶答
,,,
01A2,21 29,, AJMP COUNT
,,,
01A4,51 8A,TRUE2,TRUE2:ACALL BARK
,,,
01A6,EA,, MOV A,R2
,,,
01A7,FE,, MOV R6,A
,,,
01A8,7B 02,, MOV R3,#02H
,,,
01AA,C2 20,, CLR OK
,,,
01AC,21 29,, AJMP COUNT
,,,
01AE,51 8A,TRUE3,TRUE3:ACALL BARK
,,,
01B0,EA,, MOV A,R2
,,,
01B1,FE,, MOV R6,A
,,,
01B2,7B 03,, MOV R3,#03H
,,,
01B4,C2 20,, CLR OK
,,,
01B6,21 29,, AJMP COUNT
,,,
01B8,51 8A,TRUE4,TRUE4:ACALL BARK
,,,
01BA,EA,, MOV A,R2
,,,
01BB,FE,, MOV R6,A
,,,
01BC,7B 04,, MOV R3,#04H
,,,
01BE,C2 20,, CLR OK
,,,
01C0,21 29,, AJMP COUNT
,,,
01C2,51 8A,TRUE5,TRUE5:ACALL BARK
,,,
01C4,EA,, MOV A,R2
,,,
01C5,FE,, MOV R6,A
,,,
01C6,7B 05,, MOV R3,#05H
,,,
01C8,C2 20,, CLR OK
,,,
01CA,21 29,, AJMP COUNT
,,,
01CC,51 8A,TRUE6,TRUE6: ACALL BARK
,,,
01CE,EA,, MOV A,R2
,,,
01CF,FE,, MOV R6,A
,,,
01D0,7B 06,, MOV R3,#06H
,,,
01D2,C2 20,, CLR OK
,,,
01D4,21 29,, AJMP COUNT
,,,
01D6,51 8A,TRUE7,TRUE7:ACALL BARK
,,,
01D8,EA,, MOV A,R2
,,,
01D9,FE,, MOV R6,A
,,,
01DA,7B 07,, MOV R3,#07H
,,,
01DC,C2 20,, CLR OK
,,,
01DE,21 29,, AJMP COUNT
,,,
01E0,51 8A,TRUE8,TRUE8:ACALL BARK
,,,
01E2,EA,, MOV A,R2
,,,
01E3,FE,, MOV R6,A
,,,
01E4,7B 08,, MOV R3,#08H
,,,
01E6,C2 20,, CLR OK
,,,
01E8,21 29,, AJMP COUNT
,,,;=====犯規搶答程序=====
,,,
01EA,78 00,ERROR,ERROR: MOV R0,#00H
,,,
01EC,75 8D 3C,, MOV TH1,#3CH
,,,
01EF,75 8B B0,, MOV TL1,#0B0H
,,,
01F2,8B 34,, MOV 34H,R3;犯規號數暫存與(34H)
,,,
01F4,E8,HERE,HERE: MOV A,R0
,,,
01F5,B4 06 0A,, CJNE A,#06H,FLASH;0.3s向下運行->滅并停響
,,,
01F8,C2 22,, CLR RING
,,,
01FA,7B 0A,, MOV R3,#0AH
,,,
01FC,7C 0A,, MOV R4,#0AH
,,,
01FE,7D 0A,, MOV R5,#0AH;三燈全滅
,,,
0200,41 11,, AJMP CHECK1
,,,
0202,B4 0C 0C,FLASH,FLASH: CJNE A,#0CH,CHECK1;下面是0.8s的情況,響并顯示號數并清R0,重新計
,,,
0205,D2 22,, SETB RING
,,,
0207,78 00,, MOV R0,#00H
,,,
0209,AB 34,, MOV R3,34H;取回號數
,,,
020B,7D 0B,, MOV R5,#0BH
,,,
020D,7C 0B,, MOV R4,#0BH;顯示FF和號數
,,,
020F,41 11,, AJMP CHECK1
,,,
0211,30 B1 04,CHECK1,CHECK1: JNB P3.1,QUIT1
,,,
0214,51 1E,, ACALL DISPLAY
,,,
0216,21 F4,, AJMP HERE
,,,
0218,C2 22,QUIT1,QUIT1: CLR RING
,,,
021A,C2 20,, CLR OK
,,,
021C,01 65,, AJMP START
,,,
,,,;=====顯示程序=====
,,,
021E,90 02 40,DISPLAY,DISPLAY:MOV DPTR,#DAT1;查表顯示程序,利用P0口做段選碼口輸出/P2低三位做位選碼輸出,
,,,
0221,EB,, MOV A,R3
,,,
0222,93,, MOVC A,@A+DPTR
,,,
0223,75 A0 FE,, MOV P2,#0feH
,,,
0226,F5 80,, MOV P0,A
,,,
0228,51 6E,, ACALL DELAY2
,,,
022A,90 02 4C,, MOV DPTR,#DAT2
,,,
022D,ED,, MOV A,R5
,,,
022E,93,, MOVC A,@A+DPTR
,,,
022F,75 A0 FD,, MOV P2,#0fdH
,,,
0232,F5 80,, MOV P0,A
,,,
0234,51 6E,, ACALL DELAY2
,,,
0236,EC,, MOV A,R4
,,,
0237,93,, MOVC A,@A+DPTR
,,,
0238,75 A0 FB,, MOV P2,#0fbH
,,,
023B,F5 80,, MOV P0,A
,,,
023D,51 6E,, ACALL DELAY2
,,,
023F,22,, RET
,,,
0240,00 06 5B 4F,DAT1,DAT1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
,,,
,,,;"滅","1","2","3","4","5","6","7","8","9","滅","F"
,,,
024C,3F 06 5B 4F,DAT2,DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
,,,
,,,;第一個為零,其他與上相同,因為十位如果為零顯示熄滅
,,,
,,,;====加減時間延時(起到不會按下就加N個數)======
,,,
0258,75 35 08,DELAY1,DELAY1: MOV 35H,#08H
,,,
025B,51 1E,LOOP0,LOOP0: ACALL DISPLAY
,,,
025D,D5 35 FB,, DJNZ 35H,LOOP0
,,,
0260,22,, RET
,,,
,,,;=====延時4236個機器周期(去抖動用到)=====
,,,
0261,75 32 12,DELAY,DELAY: MOV 32H,#12H
,,,
0264,75 33 AF,LOOP,LOOP: MOV 33H,#0AFH
,,,
0267,D5 33 FD,LOOP1,LOOP1: DJNZ 33H,LOOP1
,,,
026A,D5 32 F7,, DJNZ 32H,LOOP
,,,
026D,22,, RET
,,,
,,,;=====延時4236個機器周期(顯示用到)=====
,,,
026E,75 32 43,DELAY2,DELAY2: MOV 32H,#43H
,,,
0271,75 33 1E,LOOP3,LOOP3: MOV 33H,#1EH
,,,
0274,EF,, MOV A,R7 ;每隔60~70個機器周期讀一次P1口,全為1時為無效數據,繼續讀,有一個不為1時,轉
,,,
0275,70 07,, JNZ AAAA1 ;沒讀到有效數據時繼續轉到AAAA1
,,,
0277,D5 33 FD,LOOP2,LOOP2: DJNZ 33H,LOOP2
,,,
027A,D5 32 F4,, DJNZ 32H,LOOP3
,,,
027D,22,, RET
,,,
,,,;=====讀搶答按鍵數據口程序=====
,,,
,,,;由于在讀搶答數據口的時候,單片機首先進入倒計時程序,再調用顯示程序,最后才檢測按鍵口
,,,;然而在檢測按鍵口時動態掃描要調用三次(4ms)延時程序.這樣就會導致讀數據口出現滯后,造成1號優先最高.8號
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -