?? key_led11
字號(hào):
;********************** 程序說明 **************************
;按鍵K1,K2為獨(dú)立式鍵盤,K1對(duì)應(yīng)P3.2,K2對(duì)應(yīng)P3.3
;K1模式選擇鍵,其對(duì)應(yīng)的模式有:
;LED_DISPLAY1: LED逐個(gè)左移點(diǎn)亮
;LED_DISPLAY2: LED逐個(gè)右移點(diǎn)亮
;LED_DISPLAY3: LED流水燈左移
;LED_DISPLAY4: LED流水燈右移
;K2顯示時(shí)間選擇鍵,其對(duì)應(yīng)的時(shí)間間隔有:
;0.5S
;1.0S
;1.5S
;2.0S
;***********************************************************
ORG 8000H
LJMP START
ORG 800BH
LJMP TIMER0
ORG 8100H
TIME_05 EQU 30H ;0.5S的定時(shí)記數(shù)器
TIME_10 EQU 31H ;1S 的定時(shí)記數(shù)器
TIME_15 EQU 32H ;1.5S的定時(shí)記數(shù)器
TIME_20 EQU 33H ;2.0S的定時(shí)記數(shù)器
LED_STATE EQU 34H ;LED顯示狀態(tài)變量
LED_TIME_SEL EQU 35H ;LED顯示狀態(tài)變化時(shí)間選擇變量
;LED_TIME_SEL=1 LED的刷新時(shí)間為0.5S
;LED_TIME_SEL=2 LED的刷新時(shí)間為1S
;LED_TIME_SEL=3 LED的刷新時(shí)間為1.5S
LED_MODE_SEL EQU 36H ;LED顯示模式選擇變量
;LED_MODE_SEL=1 LED的顯示方式為拉屏顯示,即LED_DISPLAY1
;LED_MODE_SEL=2 LED的顯示方式為正向流水燈,即LED_DISPLAY2,且FOLLOW_BACK=0
;LED_MODE_SEL=3 LED的顯示方式為反向流水燈,即LED_DISPLAY2,且FOLLOW_BACK=1
KEY_VALUE EQU 37H ;鍵盤鍵值寄存器
KEY_PUSH_TIME EQU 38H ;鍵盤被按下的次數(shù),即按鍵碼時(shí)間=10ms*次數(shù)
KEY_STATE EQU 39H ;鍵盤狀態(tài)寄存器
KEY_NAME EQU 40H ;鍵盤鍵名寄存器
KEY_NAME_OUT EQU 41H ;鍵盤鍵名輸出寄存器
DISP_REG EQU 42H ;LED顯示寄存器
FOLLOW_KEY EQU 43H ;上一次按鍵寄存器
KEY_GET_REG EQU 44H ;取鍵值狀態(tài)寄存器
OLD_KEY EQU 45H ;舊鍵寄存器
T05flag BIT 00H ;0.5S的定時(shí)時(shí)標(biāo)位
T10flag BIT 01H ;1S 的定時(shí)時(shí)標(biāo)位
T15flag BIT 02H ;1.5S的定時(shí)時(shí)標(biāo)位
T20flag BIT 03H ;2.0S的定時(shí)時(shí)標(biāo)位
T10MSflag BIT 04H ;10mS的定時(shí)時(shí)標(biāo)位
MODEflag BIT 05H ;MODE選擇標(biāo)志位
TIMEflag BIT 06H ;TIME選擇標(biāo)志位
KEY_LED_flag bit 07h ;按鍵與顯示狀態(tài)標(biāo)志位 KEY為0,LED為1
KEYSUCCflag BIT 08H ;按鍵成功標(biāo)志位
K1_flag BIT 09H ;K1一次按鍵有效標(biāo)志位
K2_flag BIT 0AH ;K2一次按鍵有效標(biāo)志位
START:
MOV SP,#60H
MOV TIME_05,#10 ;初始化 50mS*10=0.5S
MOV TIME_10,#20 ;初始化 50mS*20=1.0S
MOV TIME_15,#30 ;初始化 50mS*30=1.5S
MOV TIME_20,#40 ;初始化 50mS*40=2.0S
MOV LED_STATE,#02 ;初始化 LED顯示狀態(tài)變量
MOV LED_TIME_SEL,#1 ;初始化 LED顯示時(shí)間選擇變量
MOV LED_MODE_SEL,#1 ;初始化 LED顯示模式選擇變量
MOV KEY_VALUE,#44H ;初始化 鍵盤鍵值寄存器
MOV KEY_PUSH_TIME,#00H ;初始化 按鍵次數(shù)寄存器
MOV KEY_STATE,#00H ;初始化 按鍵狀態(tài)寄存器
MOV KEY_NAME,#00H ;初始化 鍵盤鍵名寄存器
MOV KEY_NAME_OUT,#00H ;初始化 鍵盤鍵名輸出寄存器
MOV DISP_REG,#0FEH ;初始化 LED顯示寄存器
MOV FOLLOW_KEY,#00H ;初始化 前一次按鍵寄存器
MOV KEY_GET_REG,#00H ;初始化 取鍵值狀態(tài)寄存器
MOV OLD_KEY,#00H ;初始化 舊鍵寄存器
CLR T05flag
CLR T10flag
CLR T15flag
CLR T20flag
CLR T10MSflag
CLR MODEflag
CLR TIMEflag
CLR KEYSUCCflag
SETB KEY_LED_flag ;初始化,設(shè)為LED顯示狀態(tài)
CLR K1_flag
CLR K2_flag
MOV TH0,#0D8H ;設(shè)計(jì)數(shù)初值,定時(shí)時(shí)間為10mS
MOV TL0,#0F0H
MOV TMOD,#01H ;定時(shí)器0工作于方式2,為16位的定時(shí)器
SETB ET0
SETB TR0
SETB EA
MAIN_LOOP: ;主程序入口
TEST_POINT1:
MAIN_NEXT1:
JNB T10MSflag,MAIN_NEXT2 ;10MS調(diào)一下鍵盤掃描
CLR T10MSflag ;清10MS時(shí)標(biāo)標(biāo)志位
LCALL KEY
MAIN_NEXT2:
JNB KEY_LED_flag,MAIN_NEXT3
ANL KEY_VALUE,#77H ;將D7,D3屏蔽
LCALL TIME_MODE_SEL
LJMP MAIN_LOOP
MAIN_NEXT3:
MOV A,KEY_VALUE
CPL A
MOV P1,A
LJMP MAIN_LOOP ;主程式序循環(huán)掃描
;***************************************************************
;獨(dú)立鍵盤處理程序
;K1從P3.2輸入 K2從P3.3輸入
;K1為模式選擇鍵,K2為方式選擇鍵
;***************************************************************
KEY:
PUSH ACC
PUSH PSW
MOV A,P3
ORL A,#0CH
MOV A,P3
ANL A,#0CH
CJNE A,#0CH,KEY_00; ;沒有鍵按下直接退出
LJMP KEY_FF;
KEY_00:
CJNE A,OLD_KEY,KEY_AA ;本次按鍵與上次按鍵相比較
LJMP KEY_BB
KEY_AA:
MOV OLD_KEY,A ;將新鍵存入寄存器
MOV KEY_STATE,#00H ;按鍵狀態(tài)寄存器清零
KEY_BB:
LCALL KEY_WENDING ;調(diào)按鍵去抖動(dòng),延時(shí)程序
JNB KEYSUCCflag,KEY_EE;
CLR KEYSUCCflag
CLR KEY_LED_flag ;設(shè)KEY顯示標(biāo)志
CJNE A,#08H,KEY_DD ;判斷P3。3是否按下
SETB K1_flag
LJMP KEY_EE
KEY_DD: CJNE A,#04H,KEY_EE ;判斷P3。2是否按下
SETB K2_flag
KEY_EE:
LCALL KEY_VALUE_GET
KEY_FF:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;按鍵穩(wěn)定程序:去抖動(dòng),并且確認(rèn)有鍵按下
;***************************************************************
KEY_WENDING:
PUSH ACC
PUSH PSW
MOV A,KEY_STATE
KSR0:
CJNE A,#00H,KSR1
MOV KEY_STATE,#01H ;將按鍵狀態(tài)寄存器轉(zhuǎn)為1
POP PSW
POP ACC
RET
KSR1:
CJNE A,#01H,KSR2
MOV KEY_STATE,#02H ;將按鍵狀態(tài)寄存器轉(zhuǎn)為2
CLR KEY_LED_flag ;當(dāng)有確認(rèn)有鍵盤按下,顯示指示為KEY按鍵狀態(tài)指示
POP PSW
POP ACC
RET
KSR2:
CJNE A,#02H,KSR3
INC KEY_PUSH_TIME
MOV A,KEY_PUSH_TIME
CJNE A,#35,KSR_OUT ;鍵按下未到350MS,則跳出
SETB KEYSUCCflag ;按鍵有效標(biāo)志位
MOV KEY_PUSH_TIME,#00H ;將按鍵次數(shù)記數(shù)器清
MOV KEY_STATE,#00H ;將按鍵狀態(tài)寄存器設(shè)為0
KSR3:
KSR_OUT:
POP PSW
POP ACC
RET
;***************************************************************
;***************************************************************
;取鍵盤按鍵狀態(tài)標(biāo)志程序
;***************************************************************
KEY_VALUE_GET:
PUSH ACC
PUSH PSW
K1G_NEXT0:
JNB K1_flag,K2G_NEXT0
CLR K1_flag ;清K1按鍵盤有效標(biāo)志位
MOV A,KEY_GET_REG
K1_STA0: ;KEY進(jìn)入狀態(tài)
CJNE A,#00H,K1_STA1 ;判按鍵狀態(tài)是否為00
CLR KEY_LED_flag ;清KEY/LED顯示標(biāo)志位,設(shè)為KEY顯示狀態(tài)
MOV KEY_GET_REG,#01H;將按鍵狀態(tài)寄存器設(shè)為01,即模式選擇狀態(tài)
ORL KEY_VALUE,#80H ;指示模式選擇
ANL KEY_VALUE,#0F7H
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
K1_STA1: ;KEY模式選擇狀態(tài)
CJNE A,#01H,K1_STA2 ;判按鍵狀態(tài)是否為01
MOV KEY_GET_REG,#02H;將按鍵狀態(tài)寄存器設(shè)為02,即時(shí)間選擇狀態(tài)
ORL KEY_VALUE,#08H;指示時(shí)間選擇
ANL KEY_VALUE,#7FH
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
K1_STA2: ;KEY時(shí)間選擇狀態(tài)
CJNE A,#02H,K1_STA3
MOV KEY_GET_REG,#03H
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
K1_STA3:
CJNE A,#03H,K1_STA3 ;判按鍵狀態(tài)是否為02
SETB KEY_LED_flag ;置KEY/LED顯示標(biāo)志位,設(shè)為LED顯示狀態(tài)
MOV DISP_REG,#0FEH ;重新初始化顯示寄存器
MOV KEY_GET_REG,#00H;將按鍵狀態(tài)寄存器設(shè)為00,即初始進(jìn)入狀態(tài)
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
K2G_NEXT0:
JNB K2_flag,KEY_VALUE_OUT
CLR K2_flag ;清K2按鍵盤有效標(biāo)志位
MOV A,KEY_GET_REG ;讀按鍵狀態(tài)寄存器
KEY_MODE: ;模式選擇
CJNE A,#01H,KEY_TIME ;判狀態(tài)是否為模式選擇方式
MOV A,KEY_VALUE ;將原鍵盤值取出
SWAP A
INC A ;將模式選擇加1,即選擇下一個(gè)LED顯示模式
ANL A,#07H ;將高四位屏蔽
CJNE A,#05H,KEY_MODE1 ;模式選擇只有1-4 四種方式
ANL A,#01H ;將低四位置為1
KEY_MODE1:
SWAP A
ANL KEY_VALUE,#0FH ;將高四位屏蔽
ORL KEY_VALUE,A
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
KEY_TIME: ;時(shí)間選擇
CJNE A,#02H,KEY_VALUE_OUT ;判狀態(tài)是否為時(shí)間選擇方式
MOV A,KEY_VALUE ;將原鍵盤值取出
INC A ;將模式選擇加1,即選擇下一個(gè)LED顯示模式
ANL A,#07H ;將高四位屏蔽
CJNE A,#05H,KEY_TIME1 ;時(shí)間選擇只有1-4 四種方式
ANL A,#0F1H ;將低四位置為1
KEY_TIME1:
ANL KEY_VALUE,#0F0H ;將低四位屏蔽
ORL KEY_VALUE,A ;將KEY_VALUE返回
LJMP KEY_VALUE_OUT ;跳轉(zhuǎn)返回
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -