欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC-B學習板按鍵消抖計數 keil單片機ASM版
[打印本頁]
作者:
lzr666
時間:
2019-8-26 16:51
標題:
STC-B學習板按鍵消抖計數 keil單片機ASM版
這是我自己做的程序。
不喜勿噴。。
希望能對大家有所幫助
$include(STC15F2K60S2.H)
FOSC EQU 11059
TCLICK EQU 50 ;基礎定時器 uS
NMAX_KEY EQU 20 ;次
DATA_TH0 EQU 256-(FOSC/120*TCLICK+50)/100 ;定時器0 工作方式2:8bit重裝、用作256uS以內定時 定時初值=(256-Fosc×定時時間/12)
CLICK_50uS BIT 00H ;=100uS滴答信號
CLICK_1mS BIT 01H ;=1mS 滴答信號
CLICK_50mS BIT 02H ;=20mS 滴答信號
CLICK_200mS BIT 03H
CLICK_1S BIT 04H ;=1S 滴答信號
CLICK_1Min BIT 05H ;=1Min 滴答信號
CLICK_1HOUR BIT 06H
KEY1 BIT P3.2 ;按鍵及時值
KEY2 BIT P3.3
KEY3 BIT 0AH
KEYR BIT 0BH
KEYD BIT 0CH
KEYC BIT 0DH
KEYL BIT 0EH
KEYU BIT 0FH
KEY1_C BIT 10H ;按鍵當前狀態
KEY2_C BIT 11H
KEY3_C BIT 12H
KEYR_C BIT 13H
KEYD_C BIT 14H
KEYC_C BIT 15H
KEYL_C BIT 16H
KEYU_C BIT 17H
KEY1_P BIT 18H ;按鍵上一個狀態
KEY2_P BIT 19H
KEY3_P BIT 1AH
KEYR_P BIT 1BH
KEYD_P BIT 1CH
KEYC_P BIT 1DH
KEYL_P BIT 1EH
KEYU_P BIT 1FH
VKEY1 BIT 20H ;按鍵事件值
VKEY2 BIT 21H
VKEY3 BIT 22H
VKEYR BIT 23H
VKEYD BIT 24H
VKEYC BIT 25H
VKEYL BIT 26H
VKEYU BIT 27H
TIME_50uS EQU 30H ;100uS計數
TIME_1mS EQU 31H ;1mS 計數
TIME_50mS EQU 32H ;20mS 計數
TIME_1S EQU 34H ;1S 計數
TIME_1MIN EQU 35H ;1MIN 計數
TIME_1HOUR EQU 36H ;1HOUR 計數
SEC_1 EQU 40H
SEC_10 EQU 41H
MIN_1 EQU 42H
MIN_10 EQU 43H
HOUR_1 EQU 44H
HOUR_10 EQU 45H
MID_LINE EQU 46H
NO_DIS EQU 5AH
KEY_COUNTER EQU 47H ;按鍵消抖計數
KEY1_COUNTER EQU 48H ;按鍵值統計
KEY2_COUNTER EQU 49H
KEY3_COUNTER EQU 4AH
KEYR_COUNTER EQU 4BH
KEYD_COUNTER EQU 4CH
KEYC_COUNTER EQU 4DH
KEYL_COUNTER EQU 4EH
KEYU_COUNTER EQU 4FH
GROUP_Dis EQU 57H ;當前顯示數據組 : 0~N
N_MaxDis EQU 58H ;定義最大顯示位數,可小于8、可大于8可控制顯示亮度
CurDis EQU 59H ;變量:記錄顯示位:1~8 有效 大于8無顯示
COUNT1 EQU 5BH
COUNT2 EQU 5CH
COUNT3 EQU 5DH
COUNT4 EQU 5EH
;顯示內容定義
;GROUP_Dis=0
G0_A1 EQU HOUR_10 ; 請具體定義它們
G0_A2 EQU HOUR_1
G0_A3 EQU MID_LINE
G0_A4 EQU MIN_10
G0_A5 EQU MIN_1
G0_A6 EQU MID_LINE
G0_A7 EQU SEC_10
G0_A8 EQU SEC_1
;GROUP_Dis=1
G1_A1 EQU NO_DIS ; 請具體定義它們
G1_A2 EQU NO_DIS
G1_A3 EQU NO_DIS
G1_A4 EQU NO_DIS
G1_A5 EQU COUNT4
G1_A6 EQU COUNT3
G1_A7 EQU COUNT2
G1_A8 EQU COUNT1
;GROUP_Dis=2
G2_A1 EQU MID_LINE
G2_A2 EQU MID_LINE
G2_A3 EQU MID_LINE
G2_A4 EQU GROUP_Dis
G2_A5 EQU MID_LINE
G2_A6 EQU MID_LINE
G2_A7 EQU MID_LINE
G2_A8 EQU SEC_1
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 0013H
RETI
;-----------------------------------------TIMER0中斷----------------------
ORG 000BH
JMP INT_T0
;---------------------------------------主程序----------------------------
ORG 0100H
START:
;-----------------------系統初始化-----------------
MOV P0M1, #00000000B ;00——準雙向口 01——推挽 10——高阻輸入 11——OC
MOV P0M0, #11111111B
MOV P2M1, #00000000B
MOV P2M0, #00001001B
;----------------------變量初始化--------------------
MOV TIME_50uS, #20
MOV TIME_1mS, #50
MOV TIME_50mS, #20
MOV TIME_1S, #60
MOV TIME_1MIN, #60
MOV TIME_1HOUR, #24
CLR CLICK_50uS
CLR CLICK_1mS
CLR CLICK_50mS
CLR CLICK_1S
CLR CLICK_1Min
CLR CLICK_1HOUR
CLR VKEY1
CLR VKEY2
CLR VKEY3
CLR VKEYR
CLR VKEYD
CLR VKEYC
CLR VKEYL
CLR VKEYU
SETB KEY1_P
SETB KEY2_P
SETB KEY3_P
SETB KEYR_P
SETB KEYD_P
SETB KEYC_P
SETB KEYL_P
SETB KEYU_P
MOV KEY_COUNTER, #NMAX_KEY
MOV KEY1_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEY2_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEY3_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEYR_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEYD_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEYC_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEYL_COUNTER, #(80H+NMAX_KEY/3*2)
MOV KEYU_COUNTER, #(80H+NMAX_KEY/3*2)
MOV CurDis, #1 ;初始顯示位
MOV N_MaxDis, #8
MOV GROUP_Dis, #1
MOV SEC_1, #0 ;示例:其它顯示內容賦給對應變量
MOV SEC_10, #0
MOV MIN_1, #0
MOV MIN_10, #0
MOV HOUR_1, #0
MOV HOUR_10, #0
MOV MID_LINE, #10
MOV NO_DIS, #11
MOV COUNT4, #5
MOV COUNT3, #0
MOV COUNT2, #0
MOV COUNT1, #0
;------------------系統設備初始化----------------------------------
MOV TMOD, #22H ; C/T0 mode is 2 and C/T1 'S MOD is 2
MOV PCON, #80H ;
MOV TH0, #DATA_TH0
SETB IT0 ;設置 INT0 為下降沿觸發
SETB IT1
SETB TR0 ;啟動時鐘
MOV IE, #10000010B ;開中斷:
;-----------------------------------主循環------------------------------------------
MAINLOOP:JBC CLICK_50uS, C_50uS
JBC CLICK_1mS, C_1mS
JBC CLICK_50mS, C_50mS
JBC CLICK_1S, C_1S
JBC CLICK_1Min, C_1Min
JBC CLICK_1HOUR, C_1HOUR
JBC VKEY1, C_KEY1
JBC VKEY2, C_KEY2
JBC VKEY3, C_KEY3
JBC VKEYR, C_KEYR
JBC VKEYD, C_KEYD
JBC VKEYC, C_KEYC
JBC VKEYL, C_KEYL
JBC VKEYU, C_KEYU
JMP MAINLOOP
;-----------------------------------------------------
C_50uS: JMP TASK_50uS
C_1mS: JMP TASK_1mS
C_50mS: JMP TASK_50mS
C_1S: JMP TASK_1S
C_1Min: JMP TASK_1Min
C_1HOUR: JMP TASK_1HOUR
C_KEY1: JMP TASK_KEY1
C_KEY2: JMP TASK_KEY2
C_KEY3: JMP TASK_KEY3
C_KEYR: JMP TASK_KEYR
C_KEYD: JMP TASK_KEYD
C_KEYC: JMP TASK_KEYC
C_KEYL: JMP TASK_KEYL
C_KEYU: JMP TASK_KEYU
;-----------------------------------收到指令-------------------------
NEW_COMMAND:
;請在這里計算要顯示的全部變量
JMP MAINLOOP
;------------------------------------按鍵------------------------------
TASK_KEY1:
INC COUNT1
MOV A, COUNT1
CJNE A, #10, T_KEY1_5
MOV COUNT1, #0
INC COUNT2
MOV A, COUNT2
CJNE A, #10, T_KEY1_5
MOV COUNT2, #0
T_KEY1_1:INC COUNT3
MOV A, COUNT3
CJNE A, #10, T_KEY1_5
MOV COUNT3, #0
T_KEY1_2:INC COUNT4
MOV A, COUNT4
CJNE A, #10, T_KEY1_5
MOV COUNT4, #0
T_KEY1_5:JMP MAINLOOP
TASK_KEY2:
DEC COUNT1
MOV A, COUNT1
CJNE A, #0FFH, T_KEY2_5
MOV COUNT1, #9
DEC COUNT2
MOV A, COUNT2
CJNE A, #0FFH, T_KEY2_5
MOV COUNT2, #9
T_KEY2_1:DEC COUNT3
MOV A, COUNT3
CJNE A, #0FFH, T_KEY2_5
MOV COUNT3, #9
T_KEY2_2:DEC COUNT4
MOV A, COUNT4
CJNE A, #0FFH, T_KEY2_5
MOV COUNT4, #9
T_KEY2_5:JMP MAINLOOP
TASK_KEY3:
JMP MAINLOOP
TASK_KEYR:
JMP MAINLOOP
TASK_KEYD:
JMP MAINLOOP
TASK_KEYC:
JMP MAINLOOP
TASK_KEYL:
JMP MAINLOOP
TASK_KEYU:
JMP MAINLOOP
;-------------------------------------定時任務-------------------------
TASK_50uS:
T50uS_1: JMP MAINLOOP
;------------------------------
TASK_1mS:MOV P0, #00000000B ;關顯示
CLR P2.3
MOV A, CurDis
CJNE A, #0FFH, T1mS_1
MOV A, #00000001B
MOV R0, GROUP_Dis
INC R0
T1mS_0: RR A
DJNZ R0, T1mS_0
MOV P0, N_MaxDis ;CurDis=0FFH時,顯示LED燈
SETB P2.3
JMP T1mS_2
T1mS_1: ANL A, #11111000B
JNZ T1mS_2 ;不顯示大于8的位數
MOV A, GROUP_Dis ;送段選
RL A ;選顯示組
RL A
RL A
ADD A, CurDis
MOV DPTR, #TAB_GROUP_Dis
MOVC A, @A+DPTR
MOV R0, A
MOV A, @R0
MOV DPTR, #TAB_Decode
MOVC A, @A+DPTR
MOV P0, A ;段選 送P0口
MOV P2, CurDis ;位選送 P2口
T1mS_2: INC CurDis ;確定下一次要顯示的位
MOV A, CurDis
CJNE A, N_MaxDis, T1mS_3
MOV CurDis, #0FFH
T1mS_3: JB KEY1, T1mS_4 ;處理按鍵
DEC KEY1_COUNTER ;按鍵統計
T1mS_4: JB KEY2, T1mS_5
DEC KEY2_COUNTER
T1mS_5: DJNZ KEY_COUNTER, T1mS_END
MOV KEY_COUNTER, #NMAX_KEY ;統計次數到,重置統計次數
MOV A, KEY1_COUNTER ;處理KEY1
MOV KEY1_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEY1_C, C ;得到按鍵 KEY1 當前的統計狀態
JB KEY1_C, T1mS_6 ;處理按鍵 KEY1 對應的操作(見相應流程圖)
JNB KEY1_P, T1mS_7
CLR KEY1_P
SETB VKEY1 ;按鍵KEY1事件發生(下降沿)
JMP T1mS_7
T1mS_END: JMP MAINLOOP
T1mS_6: JB KEY1_P, T1mS_7
SETB KEY1_P
T1mS_7: MOV A, KEY2_COUNTER ;處理KEY2
MOV KEY2_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEY2_C, C ;得到按鍵 KEY2 當前的統計狀態
JB KEY2_C, T1mS_8 ;處理按鍵 KEY2 對應的操作(見相應流程圖)
JNB KEY2_P, T1mS_9
CLR KEY2_P
SETB VKEY2 ;按鍵KEY2事件發生(下降沿)
JMP T1mS_9
T1mS_8: JB KEY2_P, T1mS_9
SETB KEY2_P
T1mS_9: MOV A, KEY3_COUNTER ;處理KEY3
MOV KEY3_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEY3_C, C
JB KEY3_C, T1mS_A
JNB KEY3_P, T1mS_B
CLR KEY3_P
SETB VKEY3
JMP T1mS_B
T1mS_A: JB KEY3_P, T1mS_B
SETB KEY3_P
T1mS_B: MOV A, KEYL_COUNTER ;處理KEYL
MOV KEYL_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEYL_C, C
JB KEYL_C, T1mS_C
JNB KEYL_P, T1mS_D
CLR KEYL_P
SETB VKEYL
JMP T1mS_D
T1mS_C: JB KEYL_P, T1mS_D
SETB KEYL_P
T1mS_D: MOV A, KEYD_COUNTER ;處理KEYD
MOV KEYD_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEYD_C, C
JB KEYD_C, T1mS_E
JNB KEYD_P, T1mS_F
CLR KEYD_P
SETB VKEYD
JMP T1mS_F
T1mS_E: JB KEYD_P, T1mS_F
SETB KEYD_P
T1mS_F: MOV A, KEYC_COUNTER ;處理KEYC
MOV KEYC_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEYC_C, C
JB KEYC_C, T1mS_G
JNB KEYC_P, T1mS_H
CLR KEYC_P
SETB VKEYC
JMP T1mS_H
T1mS_G: JB KEYC_P, T1mS_H
SETB KEYC_P
T1mS_H: MOV A, KEYL_COUNTER ;處理KEYL
MOV KEYL_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEYL_C, C
JB KEYL_C, T1mS_I
JNB KEYL_P, T1mS_J
CLR KEYL_P
SETB VKEYL
JMP T1mS_J
T1mS_I: JB KEYL_P, T1mS_J
SETB KEYL_P
T1mS_J: MOV A, KEYU_COUNTER ;處理KEYU
MOV KEYU_COUNTER, #(80H+NMAX_KEY/3*2) ;重置下一輪統計初值
RLC A
MOV KEYU_C, C
JB KEYU_C, T1mS_K
JNB KEYU_P, T1mS_L
CLR KEYU_P
SETB VKEYU
JMP T1mS_L
T1mS_K: JB KEYU_P, T1mS_L
SETB KEYU_P
T1mS_L: JMP MAINLOOP
TAB_GROUP_Dis: DB G0_A1,G0_A2,G0_A3,G0_A4,G0_A5,G0_A6,G0_A7,G0_A8
DB G1_A1,G1_A2,G1_A3,G1_A4,G1_A5,G1_A6,G1_A7,G1_A8
DB G2_A1,G2_A2,G2_A3,G2_A4,G2_A5,G2_A6,G2_A7,G2_A8
TAB_Decode: DB 03FH ; 0
DB 06H ; 1
DB 5BH ; 2
DB 4FH ; 3
DB 66H ; 4
DB 6DH ; 5
DB 7DH ; 6
DB 07H ; 7
DB 7FH ; 8
DB 6FH ; 9
DB 40H ; -
DB 00H ; 不顯示
;------------------------------
TASK_50mS:
JMP MAINLOOP
;------------------------------
TASK_1S:
INC SEC_1
MOV A, SEC_1
CJNE A, #10, T_1S_1
MOV SEC_1, #0
INC SEC_10
MOV A, SEC_10
CJNE A, #6, T_1S_1
MOV SEC_10, #0
T_1S_1: JMP MAINLOOP
;------------------------------
TASK_1Min:
INC MIN_1
MOV A, MIN_1
CJNE A, #10, T_1M_1
MOV MIN_1, #0
INC MIN_10
MOV A, MIN_10
CJNE A, #6, T_1M_1
MOV MIN_10, #0
T_1M_1:JMP MAINLOOP
;------------------------------
TASK_1HOUR:
INC HOUR_1
MOV A, HOUR_1
CJNE A, #10, T_1H_1
MOV HOUR_1, #0
INC HOUR_10
MOV A, HOUR_10
CJNE A, #2, T_1H_1
MOV HOUR_10, #0
T_1H_1:JMP MAINLOOP
;--------------------------------------INT_T0--------------------------
INT_T0: SETB CLICK_50uS
DJNZ TIME_50uS, EXIT_T0
MOV TIME_50uS, #20
SETB CLICK_1mS
DJNZ TIME_1mS, EXIT_T0
MOV TIME_1mS, #50
SETB CLICK_50mS
DJNZ TIME_50mS, EXIT_T0
MOV TIME_50mS, #20
SETB CLICK_1S
DJNZ TIME_1S, EXIT_T0
MOV TIME_1S, #60
SETB CLICK_1Min
DJNZ TIME_1MIN, EXIT_T0
MOV TIME_1MIN, #60
SETB CLICK_1HOUR
EXIT_T0:RETI
END
復制代碼
按鍵消抖計數工程_ASM版.zip
(79.99 KB, 下載次數: 4)
2019-8-26 16:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1