搜索
bottom↓
回复: 30

发个PWM调光灯驱动16路LED+按键长按短按

[复制链接]

出0入0汤圆

发表于 2010-4-13 07:14:56 | 显示全部楼层 |阅读模式
现在白光高亮LED红色光谱缺失,晚上看起来很刺眼,加了红色LED舒服多了。以后搞三基色调光。
ULN2003驱动高电平LED亮,只占用一个定时器
#include < reg52.h >
#include <intrins.h>
#include "i2c.h"
#define OP_WRITE 0xa0          // 器件地址以及写入操作
#define OP_READ  0xa1          // 器件地址以及读取操作
sbit KEY_SAVE=P1^0;
sbit KEY_W=P1^1;
sbit KEY_R=P1^2;
sbit KEY_UP=P1^3;
sbit KEY_DOWN=P1^4;
sbit SDA = P3 ^ 1;
sbit SCL = P3 ^ 0;

//old 为24C04读出的值 W为白色 R为红色 以后加入闪灯功能
volatile unsigned char pwm_w_old,pwm_w_new,pwm_r_old,pwm_r_new,PWM; //pwm_w_old 为白光的PWM值,如此类推
volatile unsigned int keytemp;
bit keystar,light_w,light_r,w_down,r_down,up_down,down_down, //按键按下值,有效值
    save_down,SAVE,long_save_down,long_save;


void keyscan(void)
{
if(KEY_W==0||KEY_R==0||KEY_UP==0||KEY_DOWN==0||KEY_SAVE==0)
{ keystar=1;
   if((KEY_W==0)&&keytemp>=200)    w_down=1;
   if((KEY_R==0)&&keytemp>=200)    r_down=1;
   if((KEY_UP==0)&&keytemp>=200)   up_down=1;
   if((KEY_DOWN==0)&&keytemp>=200) down_down=1;
   if(KEY_SAVE==0&&keytemp>=200) save_down=1;
   if(KEY_SAVE==0&&keytemp>=20000) {save_down=0; long_save_down=1;}
}
else {
   if((KEY_W==1)&&(w_down==1)) {light_w=~light_w; w_down=0;}         //等待按键抬起
   if((KEY_R==1)&&(r_down==1)) {light_r=~light_r; r_down=0;}
   if((KEY_UP==1)&&(up_down==1)&&(light_w==1)){ pwm_w_new++;}
   if((KEY_UP==1)&&(up_down==1)&&(light_r==1)){ pwm_r_new++;}
   if((KEY_UP==1)&&(up_down==1)) up_down=0;
   if((KEY_DOWN==1)&&(down_down==1)&&light_w&&pwm_w_new>0) pwm_w_new--;         
   if((KEY_DOWN==1)&&(down_down==1)&&light_r&&pwm_r_new>0) pwm_r_new--;
   if((KEY_DOWN==1)&&(down_down==1)) down_down=0;
   if((KEY_SAVE==1)&&(save_down==1)) {save_down=0; SAVE=1;}  
   if((KEY_SAVE==1)&&(long_save_down==1)) {long_save_down=0; long_save=1;}
   keystar=0;

}
}

void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0x0FF;
    TL0 = 0x9C;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void main(void)
{
sysinit();
InitTimer0();
pwm_w_old=read_byte(0x00);
if(pwm_w_old>100) pwm_w_old=100;
delayms(20);
pwm_r_old=read_byte(0x01);
if(pwm_r_old>100) pwm_r_old=100;
delayms(20);
pwm_w_new=pwm_w_old;
pwm_r_new=pwm_r_old;
if(pwm_w_old<=100){pwm_w_new=pwm_w_old;} else {pwm_w_new=100;}
if(pwm_r_old<=100){pwm_r_new=pwm_r_old;} else {pwm_r_new=100;}


while(1)
{
keyscan();
if(pwm_r_new>=100) pwm_r_new=100;
if(pwm_w_new>=100) pwm_w_new=100;
if (PWM<=pwm_r_new)         {P2=0xff;} else{P2=0;}
if (PWM<=pwm_w_new)         {P0=0xff;} else{P0=0;}
if (SAVE==1) //短按保存当前PWM值
{
if (pwm_w_new!=pwm_w_old){ write_byte(0x00,pwm_w_new); pwm_w_old=pwm_w_new;delayms(1);}
//不加delay老出错,估计是这个24C04为慢速器件
if (pwm_r_new!=pwm_r_old){ write_byte(0x01,pwm_r_new); pwm_r_old=pwm_r_new;delayms(1);}
SAVE=0;
}
if (long_save==1)
{
//没想好长按后有什么功能,先摆着把。
}

}

}

void Timer0Interrupt(void) interrupt 1
{
//100us 定时
   TH0 = 0x0FF;
    TL0 = 0x9C;
PWM++;
if (keystar)
{
keytemp++;
if (keytemp>=30000) keytemp=30000;
}
else
{
keytemp=0;
}
if (PWM>=100) PWM=0;


        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-4-13 09:26:09 | 显示全部楼层
很好,谢啦

出0入0汤圆

发表于 2010-4-13 09:55:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-13 12:02:11 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-4-13 12:33:23 | 显示全部楼层
学习一下!!!!

出0入0汤圆

发表于 2010-4-18 13:00:38 | 显示全部楼层
直接用STC的单片机里面有EEPROM就不用24C04啦

出0入0汤圆

发表于 2010-8-31 14:36:29 | 显示全部楼层
好!!!!!

出0入0汤圆

发表于 2010-9-5 01:22:54 | 显示全部楼层
pwm  mark

出0入0汤圆

发表于 2010-9-23 15:27:19 | 显示全部楼层
learn

出0入0汤圆

发表于 2010-9-24 23:50:47 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2010-9-25 08:38:59 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-11-25 20:28:37 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-11-25 20:37:39 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2010-11-26 15:27:50 | 显示全部楼层
mark 学习

出0入0汤圆

发表于 2011-2-25 18:13:55 | 显示全部楼层
mark 用时好找

出0入0汤圆

发表于 2011-2-25 21:24:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 17:29:30 | 显示全部楼层
PWM调光灯驱动16路

出0入0汤圆

发表于 2011-3-17 10:19:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-17 12:21:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-17 15:31:28 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-3-17 16:11:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-18 12:38:32 | 显示全部楼层
学习一下!!!!

出0入0汤圆

发表于 2011-3-18 12:59:29 | 显示全部楼层
好!

出0入0汤圆

发表于 2011-3-19 13:27:51 | 显示全部楼层
好贴

出0入0汤圆

发表于 2011-3-20 18:12:43 | 显示全部楼层
看错了,不是独立调节的16路

出0入0汤圆

发表于 2011-3-21 12:46:17 | 显示全部楼层
先存下来.有电路图吗?

出0入0汤圆

发表于 2011-3-24 01:48:54 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2013-7-10 23:19:27 | 显示全部楼层
下载试试.

出0入0汤圆

发表于 2013-7-10 23:29:28 | 显示全部楼层
下载来瞧瞧

出0入0汤圆

发表于 2013-7-11 08:48:57 | 显示全部楼层
参考一下,谢谢

出0入0汤圆

发表于 2013-11-17 14:53:01 | 显示全部楼层
收藏了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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