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