?? tr_led.s43
字號:
; 交通燈程序清單
;用164驅動所有燈以及數碼管的顯示
;1121為中央控制器
;RAM使用情況:
;顯示緩存為200H開始以后的12字節,
;200H~202H為第一塊顯示模塊的顯示數據
;203H~205H為第二塊顯示模塊的顯示數據
;206H~208H為第三塊顯示模塊的顯示數據
;209H~20BH為第四塊顯示模塊的顯示數據
;220H為秒計時單元,221H為0.1秒計時單元
;222H為第一塊燈模塊的時間顯示數據,
;223H為第二,224H為第三,225H為第四
;226H為交通燈運行狀態標志(一共有9個模塊的燈與數碼管顯示運行狀態)
;紅綠紅 34H 紅綠綠 24H+1 綠紅綠 48H+1 紅紅紅 70H
;紅紅綠 60H+1 紅黃綠 21H+1 黃紅黃 C2H 紅紅黃 E0H
;紅黃紅 31H ;燈的顯示碼
;4個顯示模塊,每一個的9盞燈中都有一盞接在第二片164的Q0上
;所以在燈的顯示上可能有 “+1 ”,則這個 1 加在第二片164的Q0上
;4個單元來保存是否 +1 :20CH,20DH,20EH,20FH分別對應4個顯示模塊
;每當綠燈方向計數值減到3時,綠燈閃爍
;用以提醒司機朋友注意
;227H為0.75秒計數器,228H為0.3秒計數器,用于綠燈閃爍
;
;使用紅外線檢測是否有無違章車輛,使用端口1(P1.2)下降沿中斷
;如果有,則輸出超高亮度的發光管點亮,示意打開閃光燈拍攝違章車牌號
#include "msp430x13x.h"
ORG 0F000h ;msp430f1121 FLASH START
RESET mov.w #300h,SP ; Initialize stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupTA mov.w #TASSEL1+TACLR,&TACTL ; SMCLK, clear TAR
SetupC0 mov.w #CCIE,&CCTL0 ; CCR0 interrupt enabled
mov.w #35000,&CCR0 ;
SetupP1 bis.b #001h,&P1DIR ; P1.0 output
bis.w #MC1,&TACTL ; Start Timer_a in continous mode
MOV.B #0FFH,&P2DIR ;P2.0為數據輸出端,P2.1為時鐘輸出端
CALL #INIT_RAM
CALL #INIT_P1
eint
M JMP M
;定時器中斷服務程序
TA0_ISR CALL #DIS_12
INC.B &221H
CMP.B #12,&221H ;0.075秒 INC 12
JNZ TA0END
MOV.B #0,&221H ;1秒
CALL #TR_CONT
CALL #TR_RUN
CALL #DATA_TO_DIS
INC.B &220H ;加1,220H的內容作為交通燈運行的時間參考
CMP.B #106,&220H ;整個過程為106秒
JNZ TA0END
MOV.B #0,&220H
TA0END CALL #FLASH_TO
add.w #60000,&CCR0 ; Add Offset to CCR0
reti
;P1口中斷服務程序,在非綠燈時間段內,如果有車通過,則開閃光燈
P1_INT BIC.B #04H,&P1IFG
PUSH.B &226H
DINT
PUSH R15
MOV #500,R15
P1_INTLOOP1 DEC R15 ;延時消除抖動
JNZ P1_INTLOOP1
POP R15
BIT.B #04H,&P1IN
JZ P1_INTEND
CLRC ;判斷是否為禁止通行時段
SUB.B #2,&226H ;運行狀態標志小于 5 時允許通行,其他時間不能通行
JNC P1_INTEND
BIC.B #01H,&P1OUT
BIC.B #02H,&P1OUT
PUSH R15
MOV #25000,R15
P1_INTLOOP2 DEC R15
JNZ P1_INTLOOP2
POP R15
NOP
BIS.B #02H,&P1OUT
BIS.B #1,&P1OUT
P1_INTEND ADD.B #2,&226H
POP.B &226H
EINT
RETI
FLASH_TO NOP
PUSH.B &220H
CLRC
SUB.B #44,&220H ;45~47秒為前后直行綠燈閃爍時間
JNC FLASH_TO1
POP.B &220H
PUSH.B &220H
CLRC
SUB.B #46,&220H
JNC FLASH_TO1 ;是否小于47
CMP.B #1,&226H ;是否為運行狀態1
JNZ FLASH_TO1
BIT.B #2,&221H ;是否為0.4秒
JNZ FLASH_END1 ;如果都不是 則跳轉
MOV.B #29H,&206H ;如果條件滿足,則閃爍
MOV.B #29H,&200H ;先寫入綠燈不亮的顯示碼
JMP FLASH_TO1
FLASH_END1 MOV.B #21H,&200H
MOV.B #21H,&206H ;再寫入綠燈亮的顯示碼
JMP FLASH_TO1
FLASH_TO1 POP.B &220H
PUSH.B &220H
CLRC
SUB.B #61,&220H ;61~64秒為前后路左右轉彎綠燈閃爍時間
JNC FLASH_TO2 ;同時也是左右路右轉彎綠燈閃爍時間
POP.B &220H
PUSH.B &220H
CLRC
SUB.B #64,&220H
JNC FLASH_TO2 ;是否小于64
CMP.B #4,&226H ;是否為運行狀態4
JNZ FLASH_TO2
BIT.B #2,&221H ;是否為0.4秒
JNZ FLASH_END2 ;如果都不是 則跳轉
; MOV.B #2BH,&203H
; MOV.B #2BH,&209H ;
MOV.B #0,&20DH ;如果條件滿足,則閃爍
MOV.B #0,&20FH ;先寫入綠燈不亮的顯示碼
MOV.B #2AH,&206H
MOV.B #2AH,&200H
MOV.B #0,&20CH
MOV.B #0,&20EH
JMP FLASH_TO2
FLASH_END2 MOV.B #22H,&200H ;再寫入綠燈亮的顯示碼
MOV.B #22H,&206H
MOV.B #1,&20CH
MOV.B #1,&20EH
MOV.B #1,&20DH
MOV.B #1,&20FH
JMP FLASH_TO2
FLASH_TO2 POP.B &220H
PUSH.B &220H
CLRC
SUB.B #78,&220H ;78~81秒為左右路直行綠燈閃爍時間
JNC FLASH_TO3
POP.B &220H
PUSH.B &220H
CLRC
SUB.B #81,&220H
JNC FLASH_TO3 ;是否小于81
CMP.B #6,&226H ;是否為運行狀態6
JNZ FLASH_TO3
BIT.B #2,&221H ;是否為0.4秒
JNZ FLASH_END3 ;如果都不是 則跳轉
MOV.B #2CH,&203H ;先寫入綠燈不亮的顯示碼
MOV.B #2CH,&209H
JMP FLASH_TO3
FLASH_END3 MOV.B #20H,&203H
MOV.B #20H,&209H ;再寫入綠燈亮的顯示碼
JMP FLASH_TO3
FLASH_TO3 POP.B &220H
RET
TR_CONT CLRC ;所有模塊上的計數器減一計數
DADD.B #99H,&222H
CLRC
DADD.B #99H,&223H
CLRC
DADD.B #99H,&224H
CLRC
DADD.B #99H,&225H
RET
;交通燈的運行
TR_RUN CMP.B #0,&220H ;進行了47秒之后
JNZ TR_RUN1
MOV.B #20H,&200H ;第一模塊8燈顯示值:紅綠紅
MOV.B #47H,&222H ; 時間計數值
MOV.B #0,&20CH ; 第9燈顯示值
MOV.B #23H,&203H ;第二模塊:紅紅紅
MOV.B #67H,&223H
MOV.B #0,&20dH
MOV.B #20H,&206H ;紅綠紅
MOV.B #47H,&224H
MOV.B #0,&20eH
MOV.B #23H,&209H ;紅紅紅
MOV.B #67H,&225H
MOV.B #0,&20fH
MOV.B #0,&226H
TR_RUN1 CMP.B #27,&220H ;進行了47秒之后
JNZ TR_RUN2
MOV.B #21H,&200H ;第一模塊8燈顯示值 :紅綠綠
; MOV.B #47H,&222H ;時間計數值不變,延續
MOV.B #1,&20CH ; 第9燈顯示值
MOV.B #24H,&203H ;第二模塊: 紅綠綠
; MOV.B #67H,&223H
MOV.B #1,&20dH
MOV.B #21H,&206H ;第三模塊:紅紅綠
; MOV.B #47H,&224H
MOV.B #1,&20eH
MOV.B #24H,&209H ;第四模塊:紅紅綠
; MOV.B #67H,&225H
MOV.B #01,&20fH
MOV.B #1,&226H
TR_RUN2 CMP.B #47,&220H ;進行了47秒之后
JNZ TR_RUN3
MOV.B #25H,&200H ;第一模塊8燈顯示值 :紅黃綠
MOV.B #2H,&222H ;時間計數值 黃燈顯示時間
MOV.B #1,&20CH ; 第9燈顯示值
MOV.B #24H,&203H ;第二模塊: 紅紅綠
; MOV.B #67H,&223H
MOV.B #1,&20dH
MOV.B #25H,&206H ;第三模塊:紅黃綠
MOV.B #2H,&224H
MOV.B #1,&20eH
MOV.B #24H,&209H ;第四模塊
; MOV.B #67H,&225H
MOV.B #01,&20fH
MOV.B #2,&226H
TR_RUN3
TR_RUN4 CMP.B #49,&220H ;進行了47秒之后
JNZ TR_RUN5
MOV.B #22H,&200H ;第一模塊8燈顯示值:綠紅綠
MOV.B #16H,&222H ;時間計數值 黃燈顯示時間
MOV.B #1,&20CH ; 第9燈顯示值
MOV.B #24H,&203H ;第二模塊: 紅紅綠
; MOV.B #67H,&223H
MOV.B #1,&20dH
MOV.B #22H,&206H ;第三模塊:綠紅綠
MOV.B #16H,&224H
MOV.B #1,&20eH
MOV.B #24H,&209H ;第四模塊
; MOV.B #67H,&225H
MOV.B #01,&20fH
MOV.B #4,&226H
TR_RUN5 CMP.B #65,&220H ;進行了65秒之后
JNZ TR_RUN6
MOV.B #26H,&200H ;第一模塊8燈顯示值:黃紅黃
MOV.B #2H,&222H ;時間計數值 黃燈顯示時間
MOV.B #0,&20CH ; 第9燈顯示值
MOV.B #27H,&203H ;第二模塊: 紅紅黃
; MOV.B #67H,&223H
MOV.B #1,&20dH
MOV.B #26H,&206H ;第三模塊
MOV.B #2H,&224H
MOV.B #0,&20eH
MOV.B #27H,&209H ;第四模塊:紅紅黃
; MOV.B #67H,&225H
MOV.B #01,&20fH
MOV.B #5,&226H
TR_RUN6 CMP.B #67,&220H ;進行了67秒之后
JNZ TR_RUN7
MOV.B #23H,&200H ;第一模塊8燈顯示值:紅紅紅
MOV.B #37H,&222H ;時間計數值 黃燈顯示時間
MOV.B #0,&20CH ; 第9燈顯示值
MOV.B #20H,&203H ;第二模塊: 紅綠紅
MOV.B #15H,&223H
MOV.B #0,&20dH
MOV.B #23H,&206H ;第三模塊
MOV.B #37H,&224H
MOV.B #0,&20eH
MOV.B #20H,&209H ;第四模塊
MOV.B #15H,&225H
MOV.B #0,&20fH
MOV.B #6,&226H
TR_RUN7 CMP.B #82,&220H ;進行了82秒之后
JNZ TR_RUN8
MOV.B #23H,&200H ;第一模塊8燈顯示值:紅紅紅
; MOV.B #37H,&222H ;時間計數值 黃燈顯示時間
MOV.B #0,&20CH ; 第9燈顯示值(亮與熄)
MOV.B #28H,&203H ;第二模塊: 紅黃紅
MOV.B #2H,&223H
MOV.B #0,&20dH
MOV.B #23H,&206H ;第三模塊
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -