?? key_led.asm
字號:
;********************** 程序說明 **************************
;按鍵K1,K2為獨立式鍵盤,K1對應P3.2,K2對應P3.3
;K1模式選擇鍵,其對應的模式有:
;LED_DISPLAY1: LED逐個左移點亮
;LED_DISPLAY2: LED逐個右移點亮
;LED_DISPLAY3: LED流水燈左移
;LED_DISPLAY4: LED流水燈右移
;K2顯示時間選擇鍵,其對應的時間間隔有:
;0.5S
;1.0S
;1.5S
;2.0S
;***********************************************************
S2 EQU 08H
S1 EQU 04H
;===========================================================
KEY_TIM EQU 35 ;按鍵次數
DISP_REG0 EQU 30H ;
DISP_REG1 EQU 31H ;
DISP_REG2 EQU 32H ;
DISP_REG3 EQU 33H ;
LED_STATE EQU 34H ;LED顯示狀態變量
LED_TIME_SEL EQU 35H ;LED顯示狀態變化時間選擇變量
;LED_TIME_SEL=1 LED的刷新時間為0.5S
;LED_TIME_SEL=2 LED的刷新時間為1S
;LED_TIME_SEL=3 LED的刷新時間為1.5S
;LED_TIME_SEL=4 LED的刷新時間為2.0S
LED_MODE_SEL EQU 36H ;LED顯示模式選擇變量
;LED_MODE_SEL=1 LED的顯示方式為拉屏顯示,即LED_DISPLAY1
;LED_MODE_SEL=2 LED的顯示方式為正向流水燈,即LED_DISPLAY2
;LED_MODE_SEL=3 LED的顯示方式為反向流水燈,即LED_DISPLAY3
;LED_MODE_SEL=4 LED的顯示方式為反向流水燈,即LED_DISPLAY4
KEY_VALUE EQU 37H ;鍵盤鍵值寄存器
KEY_PUSH_COU EQU 38H ;鍵盤被按下的次數,即按鍵碼時間=10ms*次數
KEY_STATE EQU 39H ;鍵盤狀態寄存器
DISP_REG EQU 42H ;LED顯示寄存器
KEY_GET_REG EQU 44H ;取鍵值狀態寄存器
TIME_COU EQU 45H ;時間初值寄存器
TIME_CHUZHI EQU 46H
TIME_FLAG BIT 00H ;定時時標位,設定時間到置1
T10MSFLAG BIT 04H ;10mS的定時時標位
KEY_LED_flag BIT 07h ;按鍵與顯示狀態標志位 KEY為0,LED為1
KEYSUCCFLAG BIT 08H ;按鍵成功標志位
P0_0 BIT 80H ;
;***************************************************************
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER0
;
ORG 0100H
START: MOV SP,#60H
MOV TIME_CHUZHI,#50 ;初始化 10mS*50=0.5S ;MOV 30H,#10
MOV LED_STATE,#01 ;初始化 LED顯示狀態變量
MOV LED_TIME_SEL,#1 ;初始化 LED顯示時間選擇變量
MOV LED_MODE_SEL,#1 ;初始化 LED顯示模式選擇變量
MOV KEY_PUSH_COU,#00H ;初始化 按鍵次數寄存器
MOV KEY_STATE,#00H ;初始化 按鍵狀態寄存器
MOV TIME_COU,#00H
MOV DISP_REG,#0FEH ;初始化 LED顯示寄存器
MOV KEY_GET_REG,#00H ;初始化 取鍵值狀態寄存器
CLR T10MSflag
CLR KEYSUCCflag
SETB KEY_LED_flag ;初始化,設為LED顯示狀態
MOV DISP_REG0,#00H ;顯示方式0函數的數據指針
MOV DISP_REG1,#01H ;顯示方式1函數的數據指針
MOV DISP_REG2,#02H ;顯示方式2函數的數據指針
MOV DISP_REG3,#03H ;顯示方式3函數的數據指針
MOV TH0,#0D8H ;設計數初值,定時時間為10mS
MOV TL0,#0F0H
MOV TMOD,#01H ;定時器0工作于方式2,為16位的定時器
SETB ET0
SETB TR0
SETB EA
;
MAIN_LOOP: ;主程序入口
JNB T10MSflag,MAIN_NEXT2 ;10MS調一下鍵盤掃描
CLR T10MSflag ;清10MS時標標志位
LCALL KEYSCAN
;
MAIN_NEXT2:
JNB KEYSUCCFLAG,MAIN_NEXT3
CLR KEYSUCCFLAG
LCALL KEY_CHECK
MAIN_NEXT3:
JNB TIME_FLAG,MAIN_LOOP
CLR TIME_FLAG
LCALL DISLED_MODE_SEL
LJMP MAIN_LOOP
;主程式序循環掃描
DISP_TABLE1: DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H
DISP_TABLE2: DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FFH
;
DISLED_MODE_SEL:
MOV A,LED_MODE_SEL
CJNE A,#00H,DIS_00
MOV A,DISP_REG0
RL A
MOV DISP_REG0,A
MOV P1,A
RET
;
DIS_00:CJNE A,#01H,DIS_01
MOV A,DISP_REG1
RR A
MOV DISP_REG1,A
MOV P1,A
RET
;
DIS_01: CJNE A,#02H,DIS_02
MOV A,DISP_REG2
MOV DPTR,#DISP_TABLE1
MOVC A,@A+DPTR
MOV P1,A
INC DISP_REG2
MOV A,DISP_REG2
CJNE A,#08H,DIS_001
MOV DISP_REG2,#00H
DIS_001:
RET
;
DIS_02: CJNE A,#03H,DIS_RR
MOV A,DISP_REG3
RRC A
MOV P1,A
DIS_RR: RET
;
TIME_TABLE:DB 50,100,150,200
KEY_CHECK:
MOV A,KEY_VALUE
CJNE A,#S2,KEY_C0
INC LED_TIME_SEL
CJNE A,#04H,KEY_C1
MOV LED_TIME_SEL,#00H
;
KEY_C1: MOV A,LED_TIME_SEL
MOV DPTR,#TIME_TABLE
MOVC A,@A+DPTR
MOV TIME_CHUZHI,A
RET
;
KEY_C0: CJNE A,#S1,KEY_C2
INC LED_MODE_SEL
MOV A,LED_MODE_SEL
CJNE A,#04H,KEY_C2
MOV LED_MODE_SEL,#00H
KEY_C2: RET
;***************************************************************
;獨立鍵盤處理程序
;K1從P3.2輸入 K2從P3.3輸入
;K1為模式選擇鍵,K2為方式選擇鍵
;***************************************************************
KEYSCAN:
ORL P3,#0CH
MOV A,P3
ANL A,#0CH
MOV B,A
CJNE A,#0CH,KEY_00; ;沒有鍵按下直接退出
MOV KEY_STATE,#00H
RET
;
KEY_00: MOV A,KEY_STATE
CJNE A,#00H,KEY_01
MOV A,B
MOV KEY_VALUE,A
MOV KEY_STATE,#01H
RET
;
KEY_01: CJNE A,#01H,KEY_03
MOV A,B
CJNE A,KEY_VALUE,KEY_02
MOV KEY_STATE,#02H
RET
;
KEY_02: MOV KEY_STATE,#00H
RET
KEY_03: CJNE A,#02H,KEY_05
MOV A,B
CJNE A,KEY_VALUE,KEY_05
INC KEY_PUSH_COU
MOV A,KEY_PUSH_COU
CJNE A,#KEY_TIM,KEY_04
MOV KEY_PUSH_COU,#00H
SETB KEYSUCCFLAG ;
MOV KEY_STATE,#00H
KEY_04: RET
KEY_05: MOV KEY_STATE,#00H
RET
;***************************************************************
;LED顯示輸出程序
;***************************************************************
;***************************************************************
;流水燈執行子程序1,2---拉屏程序
;P1.0-P1.7以一定的時間間隔TIME_LED來逐個點亮
;***************************************************************
LED_DISPLAY1: ;LED逐個左移點亮
PUSH ACC
PUSH PSW
MOV P1,DISP_REG ;送P1顯示
SETB C
MOV A,DISP_REG
RLC A ;左移
ANL A,DISP_REG
MOV DISP_REG,A
JC LED_DISP1
MOV DISP_REG,#0FEH
LED_DISP1:
POP PSW
POP ACC
RET
;
LED_DISPLAY2: ;LED逐個右移點亮
PUSH ACC
PUSH PSW
MOV P1,DISP_REG ;送P1顯示
SETB C
MOV A,DISP_REG
RRC A ;右移
ANL A,DISP_REG
MOV DISP_REG,A
JC LED_DISP2
MOV DISP_REG,#7FH
LED_DISP2:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;流水燈執行子程序3,4
;P1.0-P1.7以一定的時間間隔TIME_LED來流水點亮
;入口參數
;流水燈正反流動顯示標志位:FOLLOW_BACK
;LED狀態:LED_STATE
;***************************************************************
LED_DISPLAY3: ;LED流水燈左移
PUSH ACC
PUSH PSW
MOV A,DISP_REG ;送上次顯示狀態
MOV P1,A ;流水燈正向顯示輸出
RL A
MOV DISP_REG,A ;將狀態回送
POP PSW
POP ACC
RET
;
LED_DISPLAY4: ;LED流水燈右移
PUSH ACC
PUSH PSW
MOV A,DISP_REG ;送上次顯示狀態
MOV P1,A ;流水燈正向顯示輸出
RR A
MOV DISP_REG,A ;將狀態回送
POP PSW
POP ACC
RET
;***************************************************************
;中斷定時器0的中斷子程序
;***************************************************************
TIMER0:
PUSH ACC
PUSH PSW
MOV TH0,#0D8H ;重裝記數初數,定時時間為10mS
MOV TL0,#0F0H
SETB T10MSflag ;置位10MS的定時時標位
INC TIME_COU
MOV A,TIME_COU
CJNE A,TIME_CHUZHI,TIME01
SETB TIME_FLAG
MOV TIME_COU,#00H
TIME01: POP PSW
POP ACC
RETI
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -