以前自己都是按键去抖用延时程序,中断按键,发现很浪费单片机资源,
自己根据网上的状态机按键程序,自己写出简单的定时扫描按键,还不错,
发出来供大家参考学习讨论,不足之处欢迎评论留言
STC15W408AS单片机P3.7输出可调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 ;设置定时器模式
MOV TL0,#000H ;设置定时初值
MOV TH0,#0DCH ;设置定时初值
CLR TF0 ;清除TF0标志
SETB TR0 ;定时器0开始计时
MOV CCON,#0 ;PCA计数器停止,清除标志
CLR A
MOV 22H,A
MOV CL,A ;PCA初始值
MOV CH,A ;
MOV CMOD,#00001100B ;设置时钟源。禁PCA计数溢出中断
LCALL PWM_8
START:
JMP START
;===============定时10ms扫描按键程序==============================
T0_0:
MOV C,K1
JC K1_10 ;C为1转移(无按键转移,有按键向下执行)
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
;======================设置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
|