sogohz 发表于 2008-11-19 11:22

共享一个PIC12F629调光程序

使用MPLIB自带的Hi-tech lite版c编译器编译。
不知道为何,Timer0定时中断总有问题,无法用作延时,只好采用实时延时方式,反正MCU也没别的事情好干。延时不是太精确,没仔细去调整。

欢迎老手拍砖!!!



/*
* 手电调光程序 for PIC12F629
* 6,7脚各控制一个7135, 4档调光顺序:单7135,双7135,单7135/10,单7135/2
* 在开启60ms到5秒之间关闭可以换档,5秒后锁定档位
*/
#include <htc.h>
#include <pic.h>
#define DEBUG
#define StepAddress 12
#define MaxStep 4
// 加溶丝配置
__CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & UNPROTECT & BOREN);
void dispLED (unsigned char);
void soft1msPWM (unsigned int);
unsigned char Step;
main ()
{
unsigned char newStep;
unsigned int i;
OSCCAL = _READ_OSCCAL_DATA();
CMCON = 7;   // 关闭比较器
TRISIO = 0x3F; // 先设置所有引脚为输入
IOCB = 0;// 禁止引脚电平变化引起中断
WPU = 0;// 禁止弱上拉
Step = EEPROM_READ (StepAddress);
if (Step >= MaxStep)
Step = 0;
dispLED (Step);
soft1msPWM (60);
if ((newStep = Step + 1) >= MaxStep)
newStep = 0;
#ifdef DEBUG
TRIS5 = 0;
GPIO5 = 1;
#endif
EEPROM_WRITE (StepAddress, newStep);

soft1msPWM (3000);
#ifdef DEBUG
GPIO5 = 0;
TRIS5 = 1;
#endif
EEPROM_WRITE (StepAddress, Step);
for (;;)
soft1msPWM (100);
}
void dispLED (unsigned char step)
{
switch (step) {
case 0:
{
   TRISIO = (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1);
   GPIO0 = 1;
   break;
}
case 1:
{
   TRISIO = (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
   GPIO0 = 1;
   GPIO1 = 1;
   break;
}
case 2:
case 3:
{
   TRISIO = (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1);
   GPIO0 = 1;
   break;
}
default:
   break;
}
}
void soft1msPWM (unsigned int loops)
{
unsigned char index;
unsigned char us100;
while (--loops) {
for (index = 0; index < 10; index++) {
   if (Step == 2) {
    if (index == 0)
   GPIO0 = 1;
    else if (index == 2)
   GPIO0 = 0;
   } else if (Step == 3) {
    if (index == 0)
   GPIO0 = 1;
    else if (index == 5)
   GPIO0 = 0;
   } else {
    if (index == 0)
   GPIO0 = 1;
   }
   // 延时100us
   us100 = 100;
   while (--us100)
    ;
}
}
}

828224 发表于 2008-11-19 11:59

新手看不懂的路过

thesnake 发表于 2008-11-19 13:22

ak47fans 发表于 2008-11-19 13:42

看不懂,也頂DIY(:44:)

artie 发表于 2008-11-19 14:44

基板上是C盲,如果是汇编也许还能弄清个大概(:sweat:)

sogohz 发表于 2008-11-19 15:41

其实还是C比较方便,不必去记汇编指令,不同的MCU,稍微修改下就能移植了。
像PIC独有的Bank操作,在C程序里都看不到了,编译器帮你做到了。换平台容易,就是C最大的好处。
我只用过51, AVR, PIC,才写了没几个程序。资料主要是看Datesheet,也买了几本书。

lichy 发表于 2008-11-19 15:52

谢谢,暂且还看不懂,但看看源程序代码也很过瘾。(:lol:)
俺一般是提出调光内容、模式要求,由技男东成出作品。(:titter:)

[ 本帖最后由 lichy 于 2008-11-19 15:53 编辑 ]

mzbbs 发表于 2009-2-1 21:58

我用T13   PIC的飘过!!

liveshuang 发表于 2009-7-23 22:18

想法不错,不知道是否实用。有没有那个品牌的筒子用呢?
页: [1]
查看完整版本: 共享一个PIC12F629调光程序