|
以前自己都是按鍵去抖用延時程序,中斷按鍵,發(fā)現(xiàn)很浪費單片機(jī)資源,
自己根據(jù)網(wǎng)上的狀態(tài)機(jī)按鍵程序,自己寫出簡單的定時掃描按鍵,還不錯,
發(fā)出來供大家參考學(xué)習(xí)討論,不足之處歡迎評論留言
STC15W408AS單片機(jī)P3.7輸出可調(diào)PWM,按鍵采用定時10ms掃描,按鍵無延時程序,
程序夠簡練,易懂
K1 BIT P3.2
ORG 00H
LJMP MAIN
ORG 0BH
LJMP T0_0 ;定時器0中斷入口
ORG 60H
;=======================主程序===============================
MAIN:
MOV A,#00010000B ;P3.5/CCP0_2 P3.6/CCP1_2 P3.7/CCP2_2
MOV AUXR1,A ;輸出PWM腳切換
MOV IE,#10000010B ;允許定時器0中斷
TIMER0INIT: ;10毫秒@11.0592MHz
ANL AUXR,#7FH ;定時器時鐘12T模式
ANL TMOD,#0F0H ;設(shè)置定時器模式
MOV TL0,#000H ;設(shè)置定時初值
MOV TH0,#0DCH ;設(shè)置定時初值
CLR TF0 ;清除TF0標(biāo)志
SETB TR0 ;定時器0開始計時
MOV CCON,#0 ;PCA計數(shù)器停止,清除標(biāo)志
CLR A
MOV 22H,A
MOV CL,A ;PCA初始值
MOV CH,A ;
MOV CMOD,#00001100B ;設(shè)置時鐘源。禁PCA計數(shù)溢出中斷
LCALL PWM_8
START:
JMP START
;===============定時10ms掃描按鍵程序==============================
T0_0:
MOV C,K1
JC K1_10 ;C為1轉(zhuǎn)移(無按鍵轉(zhuǎn)移,有按鍵向下執(zhí)行)
INC R5
JMP EXIT0
K1_10:
CJNE R5,#2,K1_11 ;不等退出()
K1_11: JC EXIT0;按鍵釋放
MOV R5,#0
DEC 22h
MOV A,22H
MOV CCAP2H,A
EXIT0:
RETI
;======================設(shè)置PWM寄存器===============
PWM_8:
;模塊2工作于8位PWM
MOV PCA_PWM2,#00H
MOV A,22H
MOV CCAP2L,A
MOV CCAP2H,A ;占空比為50%(40h-20h)/40h
MOV CCAPM2,#01000010B ;8位PWM
SETB CR ;啟動PCA定時器
RET
;=========================================================
END
|
評分
-
查看全部評分
|