📄 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 + -