找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1589|回复: 1
收起左侧

单片机定时扫描按键状态机程序

[复制链接]
ID:72088 发表于 2019-3-6 17:47 | 显示全部楼层 |阅读模式
以前自己都是按键去抖用延时程序,中断按键,发现很浪费单片机资源,
自己根据网上的状态机按键程序,自己写出简单的定时扫描按键,还不错,
发出来供大家参考学习讨论,不足之处欢迎评论留言

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


评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:72088 发表于 2019-3-8 17:11 | 显示全部楼层
这是增加了长按连续减的功能,短按减1

;===============定时10ms扫描按键程序===================================
T0_0:
        CLR C
        MOV C,K1       
        JC K1_10        ;C为1转移(无按键转移,有按键向下执行)
        CJNE R5,#200,K1_0;超过200算长按,快速加减
        DEC  22h     
        MOV A,22H
        MOV CCAP2H,A
        JMP EXIT0
K1_0:        INC R5

        JMP EXIT0
K1_10:
        CJNE R5,#2,K1_11        ;不等退出()
K1_11:        JC EXIT0        ;短按只加减1
        MOV R5,#0
        DEC  22h     
        MOV A,22H
        MOV CCAP2H,A
EXIT0:
        RETI
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表