#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1//8个发光二级管
sbit key1=P3^5
sbit key2=P3^6
#define LED_ON() LED=0x00 //所宽庆族有灯亮
#define LED_OFF() LED=0xff //灭
#define LED_PWM_MAX 99
#define LED_PWM_MIN 0
uchar LED_Direction=0 //LED方向控制 0:变亮 1:差源变暗
uchar LED_PWM_Counter=0 //LED占空比
uchar count=0 //中断计数
bit flag=0//按键扫描标志位
void main()
{
P3=0xff //做输入口先写1
TMOD=0x01
TH0=0xff
TL0=0x47
EA=1
ET0=1
TR0=1
while(1)
{
if(flag)
{
if(key1==0)
{
if((LED_PWM_Count<=LED_PWM_MAX)&&(LED_Direction==0))
{
LED_PWM_Count++
if(LED_PWM_Count>LED_PWM_MAX)
{
LED_PWM_Count=LED_PWM_MAX
LED_Direction=1
}
}
}
if(key2==0)
{
if((LED_PWM_Count>=LED_PWM_MIN)&&(LED_Direction==1))
{
LED_PWM_Count--
if(LED_PWM_count<LED_PWM_MIN)
{
LED_PWM_Count=LED_PWM_MIN
LED_Direction=0
}
}
}
if(LED_PWM_Count>0)
{
LED_ON()
LED_PWM_Count--
}
else
{
LED_OFF()
}
}
}
}
void timer0() interrupt 1
{
TH0=0xff
TL0=0x47
if(++count>慎弊=10)//2ms扫描一次按键(不行可以把时间改小)
{
count=0
flag=1
}
}
大概就这个思路,如果不行你自己改改吧!
STC单片机具有PWM输出功能,最近玩12864LCD万年历时,用的是杜洋的FT4时钟电路,用他提供的H文件控制时,具有调光功能,由于只是玩一玩,没有购买源码,而网上流行的程序都没有此功能,无奈,只能自己弄,好在杜老师及人所及早在网站中备下了资料,简单攒一下,居然成功了,并成功的汇入了万年历的程序中,现在将其改成完整的控制程序公开于此供参考。
STC单片机单/双键控制LED亮度PWM调光程序原创WanNengGong 2010/09/20
参考程序: 杜洋工作室PWM功能程序模块
输出口为P1.4(PWM1)经1KΩ电阻接晶体管S8550的b极,e极接Vcc,c极接背光电源端。
#include<STC12C5A60S2.H>//头文件
#define uchar unsigned char
#define uint unsigned int
uchar vx=5
//vx=5在用于12864LCD的LED背光调整时上电为半亮度状态,可根据自己的用途及要求任意设定
sbit KEY_H=P2^4
sbit KEY_L=P2^5
void PWM_init (void){//PWM初始化函数
CMOD=0x02//设置PCA定时器
CL=0x00
CH=0x00
CCAPM1=0x42//PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00//设置PWM1初始值与CCAP0H相同
CCAP1H=0x00// PWM1初始时为0
CR=1//启动PCA定时器
}
void PWM1_set (uchar a){//PWM1占空比设置函数
CCAP1L=a//设置值直接写入CCAP1L
CCAP1H=a//设置值直接写入CCAP1H
}
void DelayM(unsigned int a){//延时函数 1mS/次伍坦吵(用于1T单片机)
unsigned char n,i,j
while(--a!=0){
for(n=1n>0n--)
for(j=222j>0j--)
for(i=12i>0i--)
} }
void main(void)
{
KEY_H = 1KEY_L = 1
PWM_init ()
while(1)
{
PWM1_set(vx*24)
//数字24是配合vx调试取得的,此时vx的赋值范围约为1-10对应最暗-最亮
//--------减调整---------//信核
if (KEY_L == 0 ){
DelayM(20)//延时20毫秒消抖动
if(KEY_L == 0){ //如果20SM后KEY_L还是0状态则确认下调键是按下的
vx--
if(vx<1){vx=5}
//如果设定vx=10,将语句改为if(vx<1){vx=10}则为单按键循环控制,则可去除加调腔侍整控制部分
}
while(KEY_L == 0)//等待键松开
}
//--------加调整---------//
if (KEY_H == 0 ){
DelayM(20)
if(KEY_H == 0){
vx++
if(vx>10){vx=5}
}
while(KEY_H == 0)
}
}
}
不好写,一年多没玩了~
看单片团镇机的寄存器的说明void Timer0Init(void)//100微秒@11.0592MHz
{
AUXR |= 0x80 //宴渗定时器时钟1T模式
TMOD &= 0xF0 //设置定时塌祥粗器模式
TL0 = 0xAE //设置定时初值
TH0 = 0xFB //设置定时初值
TF0 = 0 //清除TF0标志
TR0 = 1 //定时器0开始计时
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)