基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)应用

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)应用

STC12C5A60S2系列1T 8051单片机管脚图

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的结构

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的特殊功能寄存器列表

在这里插入图片描述

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)模块用到的特殊功能寄存器

STC12C5A60S2系列1T 8051单片机辅助寄存器AUXR

在这里插入图片描述

PCA辅助寄存器AUXR1

在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的单片机引脚

PCA工作模式寄存器CMOD

在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、空闲情况下是否停止CCP/PCA/PWM模块计数
(2)、CCP/PCA/PWM模块计数脉冲时钟源选择 (3)、CCP/PCA/PWM模块计数溢出中断使能

PCA工作模式寄存器CCON

在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、CCP/PCA/PWM模块计数溢出标志位
(2)、CCP/PCA/PWM模块运行
(3)、CCP/PCA/PWM模块0中断标志位
(4)、CCP/PCA/PWM模块1中断标志位

PCA比较/捕获寄存器CCAPM0和CCAPM1

在这里插入图片描述在这里插入图片描述
作用:用来设置STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块以下功能
(1)、CCP/PCA/PWM模块0允许比较器功能控制
(2)、CCP/PCA/PWM模块0上升沿捕获控制
(3)、CCP/PCA/PWM模块0下降沿捕获控制
(4)、CCP/PCA/PWM模块0匹配工作模式寄存器CCON中断标志位控制
(5)、CCP/PCA/PWM模块0匹配CCPn寄存器引脚电平翻转控制
(6)、CCP/PCA/PWM模块0脉冲宽度调制模式
(7)、CCP/PCA/PWM模块0使能工作模式寄存器CCON中断标志位控制
(8)、CCP/PCA/PWM模块1允许比较器功能控制
(9)、CCP/PCA/PWM模块1上升沿捕获控制
(10)、CCP/PCA/PWM模块1下降沿捕获控制
(11)、CCP/PCA/PWM模块1匹配工作模式寄存器CCON中断标志位控制
(12)、CCP/PCA/PWM模块1匹配CCPn寄存器引脚电平翻转控制
(13)、CCP/PCA/PWM模块1脉冲宽度调制模式
(14)、CCP/PCA/PWM模块1使能工作模式寄存器CCON中断标志位控制

PCA的16位定时器/计数器 —— 高八位CH和低八位CL

在这里插入图片描述
作用:作为CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的计数器进行脉冲计数

PCA捕获/比较寄存器高八位CCAPnH和低八位CCAPnL

在这里插入图片描述
作用:作为捕获或比较时 用于CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的计数器进行脉冲计数 作为脉冲宽度调制时 用于CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的高八位CCAPnH脉冲计数重载给低八位CCAPnL进行脉冲计数控制脉冲宽度调制

PCA的PWM寄存器PCA_PWM0和PCA_PWM1

在这里插入图片描述
作用:组成CCP/PCA/PWM模块0或CCP/PCA/PWM模块1的PWM寄存器内部累计计数的9位数据

利用晶振频率为12MHz的STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块0从P1.3引脚输出频率为200Hz且占空比为40%的矩形波 可根据以下CCP/PCA/PWM模块的脉冲宽度调制模式来编写程序

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
main.c

#include "STC12C5A60S2.h"
#include "Timer0.h"
#include "Pca.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
  void PortModeSet()//端口模式设置函数
{
     
   P0M1 = 0x00;
   P0M0 = 0x00;
   P1M1 = 0x00;
   P1M0 = 0x00;
   P2M1 = 0x00;
   P2M0 = 0x00;
   P3M1 = 0x00;
   P3M0 = 0x00;
   P4M1 = 0x00;
   P4M0 = 0x00;
  }
  void main(void)//主函数
{
   
   PortModeSet();//端口模式设置函数
   Timer0Init();//定时器0初始化函数
   DigitronBootDisplay();//数码管开机显示函数
   PcaInit();//CCP/PCA/PWM模块初始化函数
   while(1)//主循环
 {
   
    DigitronDisplayDataSplit();//数码管显示数据分解函数
//    DigitronDisplayData();//数码管显示数据函数
//    KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
//	  KeyScanResult();//按键扫描结果函数
    PwmDutyCycleSet();//脉冲宽度占空比设置函数
   }
  }

Pca.c

#include "Pca.h"  
 void PcaInit()//CCP/PCA/PWM模块初始化函数
{
   
  CMOD = 0x04 ;//CCP/PCA/PWM模块空闲模式下CCP/PCA/PWM模块计数器继续工作 选定时器T0溢出脉冲作为CCP/PCA/PWM模块时钟源 禁止CCP/PCA/PWM模块溢出中断使能
  CCON = 0x00;//CCP/PCA/PWM模块计数溢出标志位清0 运行位清0 中断标志位清0
  CCAPM0 = 0x42;//CCP/PCA/PWM模块0允许比较器功能控制 不允许边沿捕获控制 不匹配工作模式寄存器CCON中断标志位控制 不匹配CCPn寄存器引脚电平翻转控制 输出脉冲宽度调制模式 不使能工作模式寄存器CCON中断标志位控制
  CH = 0x00;//CCP/PCA/PWM模块16位计数器高八位计数寄存器脉冲计数清0
  CL = 0x00;//CCP/PCA/PWM模块16位计数器低八位计数寄存器脉冲计数清0
  CCAP0H = 0x00;//CCP/PCA/PWM模块高八位捕获/比较寄存器清0
  CCAP0L = 0x00;//CCP/PCA/PWM模块低八位捕获/比较寄存器清0
  CR = 1;//启动CCP/PCA/PWM模块16计数器
 }

Pca.h

#ifndef  _PCA_H
#define  _PCA_H
#include "STC12C5A60S2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PcaInit();//CCP/PCA/PWM模块初始化函数
#endif 

Timer0.c

#include "Timer0.h"
#include "Key.h"
//#include "Digitron.h"
/*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
  /****
  时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
  机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
  指令周期:单片机取出一条指令且执行完这条指令所需的时间
  以上三者间的关系:指令周期>机器周期>时钟周期
  一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
   1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
   2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
   3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
  二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   1、综合公式:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
   2、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
  (1)、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
  (2)、TL0 = Value相当于TL0 = (65536-时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
 (一)、以下是8051单片机定时器用12分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
 (二)、以下是8051单片机定时器不用分频计算定时器初值:
     定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
 (三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
     1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
     2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
 (四)、由定时器定时初值(定时计数初值)推导出定时器定时时间步骤如下:
     1、如果定时器定时初值(定时计数初值)是拆开成高八位和低八位赋值形式 如:TH0=0xfc TL0=0x18 先把高八位和低八位赋值组成一个十六位数据0xfc18 转化成十进制数据64536 用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
     2、如果定时器定时初值(定时计数初值)是十进制数据 如:64536 直接用2^n-64536算出每秒产生的脉冲数 其中n为几位定时器 再根据公式计算定时时间 如:由公式:每秒产生的脉冲数=晶振频率/几分频/定时频率  转换成:每秒产生的脉冲数=晶振频率x定时频率/几分频 可求:定时频率=(每秒产生的脉冲数x几分频)/晶振频率 进而求出:定时时间=1/定时频率=1/[(每秒产生的脉冲数x几分频)/晶振频率]  转换成:晶振频率/(每秒产生的脉冲数x几分频)=定时时间
  ****/
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
  void Timer0Init()//定时器0的8位自动重装模式2不用分频初始化函数 晶振为12MHz
{
   
   AUXR |= 0x80;//将定时器/计数器设置为1T模式 不用分频 
   TMOD &= 0xf0;//设定定时器/计数器工作模式清0
   TMOD = 0x02;//选定时器/计数器为定时器0 工作模式为模式2的8位自动重装计数 即溢出时将TH0存放的脉冲计数自动装入TL0
   TH0 = 0x16;//由于选定时器/计数器为1T模式不用分频定时器0 工作模式为模式2的8位自动重装计数 因此先根据PWM频率=CCP/PCA/PWM模块时钟源频率/256求出CCP/PCA/PWM模块时钟源频率 即200Hz=CCP/PCA/PWM模块时钟源频率/256 求CCP/PCA/PWM模块时钟源频率=51200Hz 再根据定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)求出定时器初值(定时计数初值) 即定时器初值(定时计数初值)=2^8-(12MHz/1/51200Hz)=256-(12000000Hz/51200Hz)=256-234=22=0x16
   TL0 = 0x16;//同上
   EA = 1;//打开定时器中断总开关
   TR0 = 1;//启动定时器0
  }
//  void Timer0() interrupt 1//定时器0的16位定时模式1用12分频定时2ms中断函数 晶振为12MHz
//{
   
//   TR0 = 0;//关定时器0开关
//   if(DigitronBootTimerFlag == 1)//数码管开机时间标志位置1
// {
   
//    DigitronBootTimer++;//数码管开机时间自加
//   }
//	 if(DigitronBootTimerFlag == 0)//判断共阳数码管开机时间标志位是否等于0
// { 
    DigitronDisplayDataSplit();//数码管显示数据分解函数
//    DigitronDisplayData();//数码管显示数据函数
//    KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
//   }
//   TH0 = 0xf8;//设定定时器0计数高8位初值
//   TL0 = 0x30;//设定定时器0计数低8位初值
//   TR0 = 1;//开定时器0开关
//  }

Timer0.h

#ifndef  _TIMER0_H
#define  _TIMER0_H
#include "STC12C5A60S2.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void Timer0Init();//声明定时器0初始化函数
#endif 

利用晶振频率为12MHz的STC15W4K系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块0从P1.1引脚输出频率为200Hz且占空比可调的矩形波 可根据以下CCP/PCA/PWM模块的脉冲宽度调制模式来编写程序

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
main.c

#include "STC15.h"
#include "Timer0.h"
#include "Timer1.h"
#include "Key.h"
#include "Digitron.h"
#include "Pca.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
  void PortModeSet()//端口模式设置函数
{
     
   P0M1 = 0x00;
   P0M0 = 0x00;
   P1M1 = 0x00;
   P1M0 = 0x00;
   P2M1 = 0x00;
   P2M0 = 0x00;
   P3M1 = 0x00;
   P3M0 = 0x00;
   P4M1 = 0x00;
   P4M0 = 0x00;
  }
  void main(void)//主函数
{
   
   PortModeSet();//端口模式设置函数
   Timer0Init();//定时器0初始化函数
   Timer1Init();//定时器1初始化函数  
   DigitronBootDisplay();//数码管开机显示函数
   PcaInit();//CCP/PCA/PWM模块初始化函数
   while(1)//主循环
 {
   
    DigitronDisplayDataSplit();//数码管显示数据分解函数
//    DigitronDisplayData();//数码管显示数据函数
//    KeyScan();//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
//	  KeyScanResult();//按键扫描结果函数
    PwmDutyCycleSet();//脉冲宽度占空比设置函数
   }
  }

Pca.c

#include "Pca.h"
  void PcaInit()//CCP/PCA/PWM模块初始化函数
{
   
   CMOD = 0x84 ;//CCP/PCA/PWM模块空闲模式下CCP/PCA/PWM模块计数器停止工作 选定时器T0溢出脉冲作为CCP/PCA/PWM模块时钟源 禁止CCP/PCA/PWM模块溢出中断使能
   CCON = 0x00;//CCP/PCA/PWM模块计数溢出标志位清0 运行位清0 中断标志位清0
   CCAPM0 = 0x42;//CCP/PCA/PWM模块0允许比较器功能控制 不允许边沿捕获控制 不匹配工作模式寄存器CCON中断标志位控制 不匹配CCPn寄存器引脚电平翻转控制 输出脉冲宽度调制模式 不使能工作模式寄存器CCON中断标志位控制
   CH = 0x00;//CCP/PCA/PWM模块16位计数器高八位计数寄存器脉冲计数清0
   CL = 0x00;//CCP/PCA/PWM模块16位计数器低八位计数寄存器脉冲计数清0
   CCAP0H = 0x00;//CCP/PCA/PWM模块高八位捕获/比较寄存器清0
   CCAP0L = 0x00;//CCP/PCA/PWM模块低八位捕获/比较寄存器清0
   CR = 1;//启动CCP/PCA/PWM模块16计数器
  }   

Pca.h

#ifndef  _PCA_H
#define  _PCA_H
#include "STC15.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
void PcaInit();//CCP/PCA/PWM模块初始化函数
#endif 

Key.c

#include "Key.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define KeyPressDeshakeTime 10//自定义按键按下消抖时间为10ms
#define KeyLongPressDelayTime 500//自定义按键长按延时时间为500ms
#define KeyLongPressIntervalChangeTime 25//自定义按键长按间隔变化时间为25ms
uchar AddKeyLockFlag = 0;//定义增加按键锁定标志位变量
uchar DecKeyLockFlag = 0;//定义减少按键锁定标志位变量
uchar KeyType = 0;//定义按键类型为0
uchar AddKeyLongPressAddIntervalTime = 0;//定义增加按键长按连增间隔时间变量
uchar DecKeyLongPressDecIntervalTime = 0;//定义减少按键长按连减间隔时间变量
//uint  KeyPressNumber = 0;//定义按键按下数值变量为0
uint  PwmValue = 0;//定义声明脉宽调制值变量为0
uint  AddKeyPressDelayTime = 0;//定义增加按键按下延时时间变量
uint  DecKeyPressDelayTime = 0;//定义减少按键按下延时时间变量
  void KeyScan(void)//按键扫描函数 该函数放在定时器定时2ms的中断函数中扫描
{
   
   if(AddKey)//如果增加按键没按下或弹起
  {
   
    AddKeyLockFlag = 0;//增加按键锁定标志位清0
    AddKeyPressDelayTime = 0;//增加按键按下延时时间清0
   }   
   else if(!AddKeyLockFlag)//如果增加按键锁定标志位置1 即增加按键按下
  {
   
    AddKeyPressDelayTime++;//增加按键按下延时时间自加
    if(AddKeyPressDelayTime > KeyPressDeshakeTime)//如果增加按键按下延时时间大于按键按下消抖时间
   {
   
     AddKeyPressDelayTime = 0;//增加按键按下延时时间清0
     KeyType = 1;//按键类型置1 此处是单击增加 可赋给swicth()语句中的变量来对数值单击增加
     AddKeyLockFlag = 1;//增加按键锁定标志位置1
    }
   }
   else if(AddKeyPressDelayTime < KeyLongPressDelayTime)//如果增加按键按下延时时间小于按键长按延时时间
  {
   
    AddKeyPressDelayTime++;//增加按键按下延时时间自加
   }
   else//如果增加按键按下延时时间大于按键长按延时时间
  {
   
    AddKeyLongPressAddIntervalTime++;//增加按键长按连增间隔时间自加
    if(AddKeyLongPressAddIntervalTime > KeyLongPressIntervalChangeTime)//如果增加按键长按连增间隔时间大于按键长按间隔变化时间
   {
   
      AddKeyLongPressAddIntervalTime = 0;//增加按键长按连增间隔时间清0
      KeyType = 1;//按键类型置1 此处是连击增加 可赋给swicth()语句中的变量来对数值连击增加
    }
   }
   
   if(DecKey)//如果减少按键没按下或弹起
  {
   
    DecKeyLockFlag = 0;//减少按键锁定标志位清0
    DecKeyPressDelayTime = 0;//减少按键按下延时时间清0
   }   
   else if(!DecKeyLockFlag)//如果减少按键锁定标志位置1 即减少按键按下
  {
   
    DecKeyPressDelayTime++;//减少按键按下延时时间自加
    if(DecKeyPressDelayTime > KeyPressDeshakeTime)//如果减少按键按下延时时间大于按键按下消抖时间
   {
   
     DecKeyPressDelayTime = 0;//减少按键按下延时时间清0
     KeyType = 2;//按键类型置2 此处是单击减少 可赋给swicth()语句中的变量来对数值单击减少
     DecKeyLockFlag = 1;//减少按键锁定标志位置1
    }
   }
   else if(DecKeyPressDelayTime < KeyLongPressDelayTime)//如果减少按键按下延时时间小于按键长按延时时间
  {
   
    DecKeyPressDelayTime++;//减少按键按下延时时间自加
   }
   else//如果减少按键按下延时时间大于按键长按延时时间
  {
   
    DecKeyLongPressDecIntervalTime++;//减少按键长按连减间隔时间自加
    if(DecKeyLongPressDecIntervalTime > KeyLongPressIntervalChangeTime)//如果减少按键长按连减间隔时间大于按键长按间隔变化时间
   {
   
     DecKeyLongPressDecIntervalTime = 0;//减少按键长按连减间隔时间清0
     KeyType = 2;//按键类型置2 此处是连击减少 可赋给swicth()语句中的变量来对数值连击减少
    }
   }
  }
//  void KeyScanResult()//按键扫描结果函数
//{
   
//   switch(KeyType)//按键类型筛选位
// {
   
//	  case 1 ://单击或连击增加触发位
//           KeyPressNumber++;//按键按下数值自加
//           if(KeyPressNumber > 9999)//如果按键按下数值大于9999
//          {
   
//            KeyPressNumber = 0;//按键按下数值清0
//           }
//           KeyType = 0;//按键类型清0
//           break;//跳出
//    case 2 ://单击或连击减少触发位
//           KeyPressNumber--;//按键按下数值自减
//           if(KeyPressNumber == 0 | KeyPressNumber == 65535)//如果按键按下数值等于0或65535
//          {
   
//            KeyPressNumber = 0;//按键按下数值置0
//           }
//           KeyType = 0;//按键类型清0
//           break;//跳出
	  case 3 ://长按触发位
           KeyPressNumber++;//按键按下数值自加
           if(KeyPressNumber > 9999)//如果按键按下数值大于9999
          {
   
            KeyPressNumber = 0;//按键按下数值清0
           }
           KeyType = 0;//按键类型清0
           break;//跳出
//   default:break;//跳出
//  }
// }
  void PwmDutyCycleSet()//脉冲宽度占空比设置函数
{
   
   switch(KeyType)//按键类型筛选位
 {
   
    case 1 ://增加按键单击、长按触发位
            PwmValue++;//脉冲宽度值自加
            if(PwmValue > 255)//如果脉冲宽度值大于255 为啥脉冲宽度值变量PwmValue取255来比较?由于脉冲宽度值变量PwmValue要计入CCP/PCA/PWM模块0高低八位捕获/比较寄存器 而CCP/PCA/PWM模块0高低八位捕获/比较寄存器最大只能计入255 因此脉冲宽度值变量PwmValue取255来比较
          {
   
             PwmValue = 255;//脉冲宽度值等于255
            }
            CCAP0H = CCAP0L = PwmValue;//脉冲宽度值赋给CCP/PCA/PWM模块0高低八位捕获/比较寄存器
            KeyType = 0;//按键键值清0
            break;//跳出
    case 2 ://减少按键单击、长按触发位
            PwmValue--;//脉冲宽度值自减
            if(PwmValue == 0 | PwmValue == 65535)//如果脉冲宽度值等于0或65535
          {
   
             PwmValue = 0;//脉冲宽度值清0
            }
            CCAP0H = CCAP0L = PwmValue;//脉冲宽度值赋给CCP/PCA/PWM模块0高低八位捕获/比较寄存器
            KeyType = 0;//按键键值清0
            break;//跳出
    default:break;//跳出
  }
 }

Key.h

#ifndef  _KEY_H
#define  _KEY_H
#include "STC15.h"
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
sbit LED1 = P1^1;//位定义双击LED灯为单片机P1.1脚
sbit LED2 = P1^2;//位定义长按LED灯为单片机P1.2脚
sbit AddKey = P3^5;//位定义增加按键为单片机P3.5引脚
sbit DecKey = P3^4;//位定义减少按键为单片机P3.4引脚
extern uchar AddKeyLockFlag;//声明增加按键锁定标志位变量 可被其他.c文件通过#include "其他.h"引用该变量
extern uchar DecKeyLockFlag
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值