你好!我用12864做了一个电子,可是到了晚上,背光灯实在是太亮了。关了吧!看不清字,不关吧,太亮睡不着觉!有什么好的方法,我想用单片机调节亮度。
如果不带PWM也可以用电位器,直接接在原来接p1.4的那条线,去掉三极管和电阻,直接用电位器提供调节。(其实你完全可以为了PWM而换单片机,换完了是一劳永逸,以后还多了ADC可以自动调节背光,可以唱出美妙的音乐,而不再是用方波输出的难听的音乐了)
如果单片机是带PWM的话就好办了,AT89S51当然不带,但是STC12C5A60S2就完全可以带替他,他是51系列单片机拓展型。(PWM不知道可以问我,完整程序我也有)
这样可以通过PWM来控制背光亮度(相当于能让单片机输出模拟信号,而不再只有高低两种电平)编程如下(在利用光敏电阻判断是否到晚上了,主程序就自己编吧):
sbit LED = P1 ^ 4; //液晶屏背光定义(PWM控制,不能更改)
/*********************************************************************************************
函数名:PWM初始化函数(控制背光亮度)
调 用:PWM_init();
参 数:无
返回值:无
结 果:将PCA初始化为PWM模式,初始占空比为0
备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM1占空比设置函数(控制背光亮度)
调 用:PWM1_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM1_set (unsigned char a){
CCAP1L= a; //设置值直接写入CCAP0L
CCAP1H= a; //设置值直接写入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:8位A/D转换初始化
调 用:Read_init (?);
参 数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结 果:
备 注:适用于STC12C5A60S2单片机
/**********************************************************************************************/
void Read_init (unsigned char CHA){
unsigned char AD_FIN=0; //存储A/D转换标志
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
_nop_();
ADC_CONTR |= CHA; //选择A/D当前通道
_nop_();
ADC_CONTR |= 0x80; //启动A/D电源
DELAY_MS(1); //使输入电压达到稳定(1ms即可)
}
/*********************************************************************************************
函数名:8位A/D转换函数(采集光敏电阻数据)
调 用:? = Read ();
参 数:无
返回值:8位的ADC数据
结 果:读出指定ADC接口的A/D转换值,并返回数值
备 注:适用于STC12C5A60S2单片机
/**********************************************************************************************/
unsigned char Read (void){
unsigned char AD_FIN=0; //存储A/D转换标志
ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0){ //等待A/D转换结束
AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
return (ADC_RES); //返回A/D转换结果(8位)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:自动背光检测程序
调 用:AUTO_B();
参 数:无
返回值:无
结 果:检测环境光并控制背光亮度
备 注:
/**********************************************************************************************/
void AUTO_B (void){ //
unsigned char d;
d = Read();
if(read_clock(0xc1) == 1){//检查自动调光开关
if(d > 0xD0){//
PWM1_set(1);//
}else{
PWM1_set(read_clock(0xc5)*0x1C);//
}
}
}
/*****************************************************************************/
参考资料:杜洋FT4未来时钟源程序
五一单片机控制12864液晶背光的问题。
sbit LED = P1 ^ 4; \/\/液晶屏背光定义(PWM控制,不能更改)\/ 函数名:PWM初始化函数(控制背光亮度)调 用:PWM_init();参 数:无 返回值:无 结 果:将PCA初始化为PWM模式,初始占空比为0 备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可 \/***\/ void PWM_init (void){...