- 打卡等级:以坛为家I
- 打卡总天数:358
- 最近打卡:2025-05-09 00:47:13
已绑定手机
金牌会员
- 积分
- 2022
|
发表于 2024-7-11 12:30:08
|
显示全部楼层
本帖最后由 vb2002 于 2024-7-11 12:33 编辑
#include <STC8G.H> 头文件
#include "intrins.h" lop不会报错
#define MAIN_Fosc 11059200UL 定义系统时钟
unsigned int pwm_levels[] = {5,15,95,255 }; 设置 pwm_levels[]={数组,方便接下来的按键换挡}
unsigned char PWM_SAVE; 设置变量,保存当前pwm的亮度
sbit KEY1 = P3^2; KEY1设置成 P32 io口
bit key_flag; 设置标志位,,标志位具体什么用处,现在我还不清楚
unsigned char PWM_MODE; 定义PWM模式的变量
unsigned char time_out; 定义一个定时器时钟,方便设置多少秒内按键是一个状态,多少秒后另一个状态
void PWM_init(void) 学C语言的时候, 说void是古老的写法,新的写法可以是 int代替void.
{
CCON = 0x00;
CMOD = 0x08;
CL = 0x00;
CH = 0x00;
CCAPM2 = 0x42;
PCA_PWM2 = 0x00;
CCAP2L = 0x00;
CCAP2H = 0x00;
CR=1;
}
void PWM_updata(unsigned int duty) // 更新PCA捕获/比较1寄存器,以改变PWM输出
{
if(duty > 0) // 如果占空比大于0
{
CCAP1L = duty; // 更新PCA捕获/比较1低字节寄存器
CCAP1H = duty >> 8; // 更新PCA捕获/比较1高字节寄存器
CCAP1H右移8位,同步ccap1l
CCAPM1 = 0x42; // 使能PCA捕获/比较1模块的PWM输出
}
else
{ CCAP1L = 0x00; // 清除PCA捕获/比较1低字节寄存器
CCAP1H = 0x00; // 清除PCA捕获/比较1高字节寄存器
CCAPM1 = 0x00; // 禁用PCA捕获/比较1模块的PWM输出
}
}
void Timer0_Isr(void) interrupt 1 // 定时器0的中断服务程序
{
static unsigned char key_sta; // 按键状态机变量
switch(key_sta) // 实现去抖动和按键检测的状态机
{ case 0: // 等待按键
if (KEY1 == 0) key_sta++; // 如果按键按下,进入状态1
break; case 1: // 确认按键
if (KEY1 == 0) key_sta++; // 如果按键持续按下,进入状态2
else key_sta = 0; // 否则返回状态0
break; case 2: // 等待按键释放
if (KEY1 == 1) key_sta++; // 如果按键释放,进入状态3
break; case 3: // 按键完成
key_flag = 1; // 设置按键标志位
key_sta = 0; // 重置状态机
break;
default: // 默认状态,重置状态机
key_sta = 0;
break;
}
if (time_out < 20) time_out++; // 如果未超时,增加超时计数器}
|
|