才開始學匯編語言,不是很懂。大神們幫我分析一下這個程序,能配合流程圖講解最好。謝謝大佬們了。
- COUNT EQU 30H ;T0中斷計數
- SNLEDDATA EQU 31H ;存儲南北數碼管顯示的數據
- SNCOLORFLAG EQU 32H ;=1時南北綠燈亮,=2時南北黃燈亮,=3時南北紅燈亮
- SNLEDDATAINIT EQU 33H ;存儲南北各顏色燈的初始時間
- EWLEDDATA EQU 34H ;存儲東西數碼管顯示的數據
- EWCOLORFLAG EQU 35H ;=1時東西紅燈亮,=2時東西綠燈亮,=3時東西黃燈亮
- EWLEDDATAINIT EQU 36H ;存儲東西各顏色燈的初始時間
- org 0000h
- lJMP MAIN
- org 0003h
- lJMP INT00
- org 000Bh
- lJMP T00
- org 0100h
- ;主函數***************************************
- MAIN: MOV SP,#60H
- MOV TMOD,#01H
- MOV TH0,#0eCH
- MOV TL0,#078H
- MOV COUNT,#00H
- SETB TR0 ;開定時器0
- SETB ET0 ;允許定時器0中斷
- SETB EX0 ;允許外部0中斷
- SETB EA ;開總中斷
- MOV SNLEDDATAINIT,#15
- MOV EWLEDDATAINIT,#18
- MOV SNLEDDATA,SNLEDDATAINIT
- MOV EWLEDDATA,EWLEDDATAINIT
- MOV P2,#0feH
- MOV SNCOLORFLAG,#01
- MOV EWCOLORFLAG,#01
- ;初始化結束***********************************
- START:
- MOV A,COUNT
- CJNE A,#200,NOT1S ;沒到1秒跳轉
- MOV COUNT,#00 ;1秒時間到
- DEC SNLEDDATA
- MOV A,SNLEDDATA
- JNZ checkewleddata
- MOV SNLEDDATA,SNLEDDATAINIT
- INC SNCOLORFLAG
- MOV A,SNCOLORFLAG
- CJNE A,#04,checkewleddata
- MOV SNCOLORFLAG,#01
- checkewleddata:
- DEC EWLEDDATA
- MOV A,EWLEDDATA
- JNZ NOT1S
- MOV EWLEDDATA,EWLEDDATAINIT
- INC EWCOLORFLAG
- MOV A,EWCOLORFLAG
- CJNE A,#04,NOT1S
- MOV EWCOLORFLAG,#01
- NOT1S:
- LCALL snCOLORCHECK
- LCALL ewCOLORCHECK
- LCALL DISPLAY
- SJMP START
- ;****************************************
- ;南北紅綠黃燈控制**************************
- snCOLORCHECK:
- PUSH ACC
- PUSH B
- PUSH PSW
- sngreen:
- MOV A,SNCOLORFLAG
- CJNE A,#01,snYELLOW
- MOV SNLEDDATAINIT,#03 ;設置南北黃燈閃爍時間
- CLR P1.2
- CLR P1.1
- SETB P1.0 ;南北綠燈亮
- SETB P1.7
- CLR P1.6
- JMP snCOLORCHECKOUT
- snYELLOW:
- MOV A,SNCOLORFLAG
- CJNE A,#02,snred
- MOV SNLEDDATAINIT,#18 ;設置南北紅燈亮時間
- MOV A,COUNT
- MOV B,#50
- DIV AB
- MOV A,B
- CJNE A,#00H,snNOTFLASH
- CPL P1.1 ;南北黃燈閃爍
- CLR P1.0
- CLR P1.2
-
- snNOTFLASH:
- JMP snCOLORCHECKOUT
- snred:
- MOV SNLEDDATAINIT,#15 ;設置南北綠燈亮時間
- CLR P1.0
- CLR P1.1
- SETB P1.2 ;南北紅燈亮
- SETB P1.6
- CLR P1.7
- snCOLORCHECKOUT:
- POP PSW
- POP B
- POP ACC
- RET
- ;******************************************************
- ;東西紅綠黃燈控制**************************************
- ewCOLORCHECK:
- PUSH ACC
- PUSH B
- PUSH PSW
- ewred:
- MOV A,ewCOLORFLAG
- CJNE A,#01,ewyellow
- MOV ewLEDDATAINIT,#15 ;設置東西綠燈亮時間
- CLR P1.3
- CLR P1.4
- SETB P1.5 ;東西紅燈亮
- JMP ewCOLORCHECKOUT
- ewyellow:
- MOV A,ewCOLORFLAG
- CJNE A,#03,ewgreen
- MOV ewLEDDATAINIT,#18 ;設置東西紅燈亮時間
- MOV A,COUNT
- MOV B,#50
- DIV AB
- MOV A,B
- CJNE A,#00H,ewNOTFLASH
- CPL P1.4 ;東西黃燈閃爍
- CLR P1.3
- CLR P1.5
- ewNOTFLASH:
- JMP ewCOLORCHECKOUT
- ewgreen:
- MOV ewLEDDATAINIT,#03 ;設置東西黃燈閃爍時間
- CLR P1.4
- CLR P1.5
- SETB P1.3 ;東西綠燈亮
- ewCOLORCHECKOUT:
- POP PSW
- POP B
- POP ACC
- RET
- ;************************************************************
- ;數碼管顯示**************************************************
- DISPLAY:
- PUSH ACC
- PUSH PSW
- PUSH B
- MOV A,SNLEDDATA
- MOV B,#10
- DIV AB
- MOV R0,B
- MOV R1,A
- MOV A,EWLEDDATA
- MOV B,#10
- DIV AB
- MOV R2,B
- MOV R3,A
- MOV DPTR,#TABLE
- MOV A,P2
- DISPSNH:
- CJNE A,#0feH,DISPSNL
- MOV A,R1
- MOVC A,@A+DPTR
- MOV P0,A
- JMP DISPOUT
- DISPSNL:
- CJNE A,#0fdH,DISPEWH
- MOV A,R0
- MOVC A,@A+DPTR
- MOV P0,A
- JMP DISPOUT
- DISPEWH:
- CJNE A,#0fbH,DISPEWL
- MOV A,R3
- MOVC A,@A+DPTR
- MOV P0,A
- JMP DISPOUT
- DISPEWL:
- CJNE A,#0f7H,DISPOUT
- MOV A,R2
- MOVC A,@A+DPTR
- MOV P0,A
- DISPOUT:
- POP B
- POP PSW
- POP ACC
- RET
- ;*****************************************
- TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
- ; 0 1 2 3 4 5 6 7 8 9
- ;T0中斷函數*******************************
- T00: PUSH ACC
- PUSH PSW
- MOV TH0,#0ecH
- MOV TL0,#078H
- MOV A,P2
- RL A
- CJNE A,#11101111B,NOT5
- MOV A,#0feH ;p2.0=0,南北數碼管十位亮,p2.1=0,南北數碼管個位亮
- NOT5: MOV P2,A ;p2.2=0,東西數碼管十位亮,p2.3=0,東西數碼管個位亮
- INC COUNT
- POP PSW
- POP ACC
- RETI
- ;外部中斷0***********************************
- INT00: push acc
- push psw
- mov a,p0
- push acc
- mov a,p1
- push acc
- mov a,p2
- push acc
- INT10: jnb p3.6,INT11
- jnb p3.7,INT12
- SJMP INT13
- INT11: LCALL INT01
- SJMP INT13
- INT12: LCALL INT02
- INT13: mov p1,#0C0h
- mov p2,#0ffh
- jnb p3.2,INT10
- pop acc
- mov p2,a
- pop acc
- mov p1,a
- pop acc
- mov p0,a
- pop psw
- pop acc
- reti
- INT01: mov p2,#0ffh
- mov p1,#01001100B
- jnb p3.6,[ DISCUZ_CODE_1 ]nbsp;
- ret
- INT02: mov p2,#0ffh
- mov p1,#10100001B
- jnb p3.7,[ DISCUZ_CODE_1 ]nbsp;
- ret
-
- ;*****************************************
- END
復制代碼
|