📄 signal_controller.asm
字号:
;可更新计时时间,数字显示简单,倒计时不再连跳两秒
;各按键均可强制使用,可正确响应软件的各按钮设置
;时钟不太匹配
;---------端口定义----------------------
RG1 BIT P0.0
RG2 BIT P0.1
RG3 BIT P0.2
RG4 BIT P0.3
RG5 BIT P0.4
RG6 BIT P0.5
RG7 BIT P0.6
RG8 BIT P0.7;8个红/绿灯依次灭
;----------------------------------------
RGA BIT P2.0
RGB BIT P2.1
RGC BIT P2.2
RGD BIT P2.3;4个闪提示的红/绿灯
DI_A BIT P2.4
DI_B BIT P2.5
DI_C BIT P2.6
DI_D BIT P2.7;数码管的个位
;-----------------------------------------
LED_RST BIT P1.0;灯复位
LED_EN BIT P1.1;灯使能
R_ON BIT P1.2
G_ON BIT P1.3
RST BIT P1.5;1302的复位信号
S_CLK BIT P1.6;1302的串行时钟信号
S_DAT BIT P1.7;1302的串行数据(I/O)
;-----------------------------------------
R_DAT BIT P3.0;接收数据
T_DAT BIT P3.1;发送数据
DE_A BIT P3.2
DE_B BIT P3.3
DE_C BIT P3.4
DE_D BIT P3.5;数码管的十位
RG_SEL BIT P3.7;红绿选择
;-------------20H-----------
LED_END BIT 00H;行灯全灭标志位
LIT_EXT BIT 01H;闪灯标志位
RESTART BIT 02H;接到新数重新开始标志位
RESET BIT 03H;复位标志位
O_C_END BIT 04H;一个颜色已完
T0_OVER BIT 05H;T0溢出中断标志位
LED_OFF BIT 06H;暂停标志位
KEY_DOWN BIT 07H;按键标志位
;---------------21H----------------------
L_RST BIT 08H
L_EN BIT 09H;开始/暂停位
L_RED BIT 0AH
L_GREEN BIT 0BH
L_PAUSE BIT 0CH;暂停结束位
L_END BIT 0DH;
RS_REVFA BIT 0EH
FST_SEC BIT 0FH;第一秒标志
;---------------22H----------------------
SAVE_P0 DATA 22H
SAVE_P1 DATA 23H
SAVE_P2 DATA 24H
SAVE_P3 DATA 25H
W_DATA DATA 26H;1302命令数据
W_DATB DATA 27H;1302时钟数据
SEC_DAT DATA 28H;秒数据
LED_LIGHT DATA 29H;LED亮灭控制
L_NUM1 DATA 2AH
L_NUM2 DATA 2BH
SEC_CON DATA 2CH
DEL00 DATA 2DH
DEL01 DATA 2EH
DEL02 DATA 3FH
TACOM DATA 30H
RS_DATA EQU 31H
RS_SEND DATA 32H
save_num data 34h
save_num10 data 35h
save_num0 data 36h
;-------------主程序------------
ORG 0000H
LJMP MAIN
ORG 000BH ;定时器0入口地址
LJMP TIME0PR
ORG 0023H ;串行通信入口地址
LJMP RS_RECIEVE
ORG 100H
MAIN: LCALL RAM_INI
LCALL DS1302_INI
MOV SP,#40H
BEGIN00:MOV P0,#0FFH
ORL P2,#0FH
CLR RG_SEL
CLR FST_SEC
CLR RESET
BEGIN01:JNB RS_REVFA,BEGIN01
LCALL RS_JUDGE
JNB LED_OFF,BEGIN02
LCALL LED_OFF00
LJMP BEGIN01
BEGIN02:JB RESET,BEGIN00
START00:MOV LED_LIGHT,#0FFH
MOV P0,#0FFH
ORL P2,#0FH
CLR RGA
CLR RESTART
LCALL RECIEVE00
LCALL JUDGE10
MOV R4,SAVE_NUM
MOV R0,L_NUM1
MOV R6,#08H
START01:LCALL RECIEVE01
JNB RS_REVFA,START02
LCALL RS_JUDGE
CLR RS_REVFA
JNB LED_OFF,START07
LCALL LED_OFF00
LJMP BEGIN01
START07:JB RESET,BEGIN00
JB RESTART,START00
START02:LCALL O_SEC00
JNB KEY_DOWN,START06
LCALL KEY00
START06:CJNE R6,#00H,START03
LCALL FLICKER
LJMP START04
START03:DJNZ R0,START04
MOV R0,L_NUM1
LCALL L_ONE
DEC R6
START04:DEC SAVE_NUM
DJNZ R4, START01
LCALL RECIEVE01
LCALL O_SEC00
START05:CPL RG_SEL
LJMP START00
;-----------RAM、RS232初始化---------
RAM_INI:MOV A,#00H
MOV R0,#20H
RAM_INA:MOV @R0,A
INC R0
CJNE R0,#60H,RAM_INA
MOV TMOD,#21H
MOV TH1,#0F4H
MOV TL1,#0F4H
MOV SCON,#01010000B
MOV PCON,#80H ;4800bps
MOV TH0,#0CH
MOV TL0,#58H
SETB ET0 ;允许"T0"中断
SETB TR0 ;启动定时器"0"
SETB TR1
SETB ES ;开串行口中断
SETB EA ;开中断
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P2,A
MOV P3,A
MOV LED_LIGHT,A
CLR RS_REVFA
CLR FST_SEC
CLR RESET
CLR RESTART
CLR LED_OFF
RET
;------RS232数据接收程序-----------
RS_RECIEVE:
PUSH ACC
PUSH PSW
JNB TI,RS_RECA
POP PSW
POP ACC
RETI
RS_RECA:JNB RI,RS_RET
CLR RI
MOV A,SBUF
RS_RECB:MOV R1,#RS_DATA
MOV @R1,A
SETB RS_REVFA
RS_RET: POP PSW
POP ACC
RETI
;-------RS232数据发送程序-----------
SEND_DATA:
CLR ES
MOV A,RS_SEND
MOV SBUF,A
JNB TI,$
CLR TI
LCALL DTIME
SETB ES
RET
;-------------------------
DTIME: MOV R3,#080H
DJNZ R3,$
RET
;---------------------------------
RECIEVE00:
MOV R1,#RS_DATA
MOV A,@R1
MOV SAVE_NUM,A
RET
;----------处理接收并发送------------
RECIEVE01:
LCALL DIV00
LCALL DISPLAY00
MOV RS_SEND,SAVE_NUM
LCALL SEND_DATA
RET
;--------显示数字-----------
DISPLAY00: ;此程序的端口处理部分普遍适用
MOV A,SAVE_NUM0 ;个位
RL A
RL A
MOV SAVE_P3,P3 ;端口处理(4句)
ANL SAVE_P3,#0C3H
ORL SAVE_P3,A
MOV P3,SAVE_P3
MOV A,SAVE_NUM10 ;十位
SWAP A
MOV SAVE_P2,P2
ANL SAVE_P2,#0FH
ORL SAVE_P2,A
MOV P2,SAVE_P2
RET
;--------16=>10------------ 16进制变10进制
DIV00: MOV A,SAVE_NUM ;两位数除10,三位除100
MOV B,#0AH
DIV AB
MOV SAVE_NUM10,A
MOV SAVE_NUM0,B
RET
;-----------1302初始化--------------
DS1302_INI:
MOV W_DATA,#90H
MOV W_DATB,#0A0H ;禁止向备用电池充电
LCALL SAVE_SDAT
MOV W_DATA,#80H
MOV W_DATB,#00H
LCALL SAVE_SDAT
; MOV W_DATA,#8EH
; MOV W_DATB,#80H
; LCALL SAVE_SDAT ;禁止向DS1302写数据
RET
;--------读DS1302芯片秒数据--------
LOAD_SDAT:
CLR S_CLK ;1302串行时钟信号清位(S_CLK的高低作为时钟控制1302)
NOP
SETB RST ;1302复位信号置位,即启动1302发送数据
MOV R5,#08H
MOV A,W_DATA ;读入1302的命令数据
LOAD_PA:CLR S_CLK
RRC A
MOV S_DAT,C ;发送命令字——送串行数据信号
SETB S_CLK
NOP
DJNZ R5,LOAD_PA ;共8次
MOV R5,#08H
CLR S_CLK
NOP
SETB S_DAT
MOV R5,#08H
LOAD_PB:CLR S_CLK
MOV C,S_DAT ;将读到的数据送“C”标志位
RRC A
; MOV SEC_CON,A
SETB S_CLK
NOP
DJNZ R5,LOAD_PB
CLR RST
RET
;-----向DS1302芯片写时钟数据------
SAVE_SDAT:
CLR S_CLK
NOP
SETB RST
MOV R5,#08H
MOV A,W_DATA
PA_SAVE:CLR S_CLK
RRC A
MOV S_DAT,C ;发送命令字
SETB S_CLK
NOP
DJNZ R5,PA_SAVE
MOV R5,#08H
MOV A,W_DATB
PB_SAVE:CLR S_CLK
RRC A
MOV S_DAT,C ;发送写数据
SETB S_CLK
DJNZ R5,PB_SAVE
CLR RST
RET
;----------计时一秒-----------
O_SEC00:LCALL JUDGE00
O_SEC01:MOV W_DATA,#81H
LCALL LOAD_SDAT ;读秒信号
CJNE A,SEC_DAT,O_SEC02 ;不等既是增一秒转而显示
LJMP O_SEC01
O_SEC02:MOV SEC_DAT,A
RET
;-------判断计时开始-----------
;如是第一次读秒则先回送已存秒数,以消除跳字现象
JUDGE00:JB FST_SEC,JUDGE01
SETB FST_SEC
MOV W_DATA,#83H
MOV W_DATB,SEC_DAT
LCALL SAVE_SDAT
JUDGE01:RET
;--------计算灭灯间隔---------
JUDGE10:MOV A,SAVE_NUM
CLR C
SUBB A,#06H
JNC JUDGE11
MOV R6,#00H
RET
;-----------------------------------
JUDGE11:MOV B,#08H
DIV AB
MOV L_NUM1,A
MOV R2,B
CJNE R2,#00H,JUDGE12
RET
JUDGE12:DJNZ R2,JUDGE13
RET
JUDGE13:DJNZ R2,JUDGE14
RET
JUDGE14:DJNZ R2,JUDGE15
RET
JUDGE15:DJNZ R2,JUDGE16
RET
JUDGE16:INC L_NUM1
RET
;-----------灭一行-------------
L_ONE: CLR C
MOV A,LED_LIGHT ;灭一行
RLC A
MOV P0,A
MOV LED_LIGHT,A
; DJNZ R6,L_RET
; SETB LED_END ;8行都灭之后设全灭标志
L_RET: RET
;-----------闪 灯--------------
FLICKER:JNB LIT_EXT,GO_OUT
LIGHT: MOV A,P2
ORL A,#0EH ;闪灯——亮
MOV P2,A
CLR LIT_EXT ;标志为0
AJMP F_RET
GO_OUT: MOV A,P2
ANL A,#0F1H ;闪灯——灭
MOV P2,A
SETB LIT_EXT ;标志为1
F_RET: RET
;------- 定时器“0”中断 ------
TIME0PR:PUSH ACC
PUSH PSW
MOV TH0,#0CH
MOV TL0,#58H
MOV A,TACOM
INC A
CJNE A,#04H,TIME0PB
TIME0PA:LCALL READ_KEY
LCALL DELAY00
LCALL READ_KEY
MOV TACOM,#00H
SETB T0_OVER
SETB TR0
POP PSW
POP ACC
RETI
TIME0PB:JNC TIME0PA
MOV TACOM,A
SETB TR0
POP PSW
POP ACC
RETI
;-----------延时去抖动-------------
DELAY00:MOV DEL00,#2H
DELAY01:MOV DEL01,#070H
DELAY02:MOV DEL02,#070H
DELAY03:DJNZ DEL02,DELAY03
DJNZ DEL01,DELAY02
DJNZ DEL00,DELAY01
RET
;-----------读按键--------------
READ_KEY:
JB LED_RST,READ_EN
SETB KEY_DOWN
SETB L_RST
CLR L_PAUSE
CLR L_EN
CLR L_RED
CLR L_GREEN
CLR L_END
RET
READ_EN:JB LED_EN,READ_RD
JB L_EN,READ_PS
SETB KEY_DOWN
SETB L_EN
CLR L_PAUSE
CLR L_END
CLR L_RST
CLR L_RED
CLR L_GREEN
RET
READ_PS:JB L_PAUSE,READ_ED
SETB KEY_DOWN
SETB L_PAUSE
CLR L_END
CLR L_RST
CLR L_RED
CLR L_GREEN
RET
READ_ED:JB L_END,READ_PS
SETB KEY_DOWN
SETB L_END
CLR L_PAUSE
CLR L_RST
CLR L_RED
CLR L_GREEN
RET
READ_RD:JB R_ON,READ_GN
SETB KEY_DOWN
SETB L_RED
CLR L_RST
CLR L_GREEN
RET
READ_GN:JB G_ON,READ_RET
SETB KEY_DOWN
SETB L_GREEN
CLR L_RST
CLR L_RED
READ_RET:
RET
;---------判断是哪个键---------
KEY00: JNB L_RST,KEY01
CLR L_RST
LJMP BEGIN00
KEY01: JNB L_EN,KEY02
LCALL LED_PAUSE
RET
KEY02: JNB L_RED,KEY04
LCALL RED00
KEY03: JNB L_RED,KEY03
CLR L_RED
RET
KEY04: JNB L_GREEN,KEY06
LCALL GREEN00
KEY05: JNB L_GREEN,KEY05
CLR L_GREEN
KEY06: RET
;----------暂 停------------
LED_PAUSE:
MOV R4,#14H ;20S后自动恢复
PAUSE00:JB L_RED,PAUSE01
JB L_GREEN,PAUSE02
JB L_END,PAUSE03
LCALL O_SEC00
DJNZ R4,PAUSE00
LJMP PAUSE03
PAUSE01:LCALL UP00
LJMP PAUSE00
PAUSE02:LCALL DOWN00
LJMP PAUSE00
PAUSE03:CLR KEY_DOWN
CLR L_EN
CLR L_END
RET
;----------调高数字------------------
UP00: INC SAVE_NUM
LCALL RECIEVE01
CLR L_RED
RET
;----------调低数字------------------
DOWN00: DEC SAVE_NUM
LCALL RECIEVE01
CLR L_GREEN
RET
;--------红灯亮-----------
RED00: CLR RG_SEL
PUSH A
MOV A,#0FFH
MOV P0,A
MOV A,#0FH
ORL P2,A
CLR L_RED
POP A
RET
;--------绿灯亮------------
GREEN00:SETB RG_SEL
PUSH A
MOV A,#0FFH
MOV P0,A
MOV A,#0FH
ORL P2,A
CLR L_GREEN
POP A
RET
;--------黄灯闪---------
YELLOW00:
PUSH A
MOV A,#0FFH
MOV P0,A
MOV A,#0FH
ORL P2,A
CPL RG_SEL
POP A
RET
;-------判断接收到的命令字-----
RS_JUDGE:
CLR RS_REVFA
MOV R1,#RS_DATA
MOV A,@R1
MOV SAVE_NUM,A
MOV RS_SEND,A
LCALL SEND_DATA
RS00: CJNE A,#00H,RS01
SETB LED_OFF
RET
RS01: CJNE A,#01H,RS02
SETB RESET
RET
RS02: CJNE A,#02H,RS03
LCALL RED00
JNB RS_REVFA,RS02
RET
RS03: CJNE A,#03H,RS04
LCALL GREEN00
JNB RS_REVFA,RS03
RET
RS04: CJNE A,#04H,RS05
LCALL YELLOW00
JNB RS_REVFA,RS04
RET
RS05: SETB RESTART
CLR RG_SEL
RET
;--------灭 灯---------
LED_OFF00:
CLR LED_OFF
MOV P0,#00H
ANL P2,#0F0H
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -