PIC12F629帮我用C语言写个程序,控制三个LED亮灭!

按键按一次LED1低亮,按两次高亮,按三次2HZ闪,按三次关,按键长按3秒松开LED2亮,长按3秒松开LED2灭,按键长按5秒松开LED3亮,长按5秒松开LED3灭,每个功能独立操作,互不影响!

/******************************************************************************
 * IC: PIC12F629        OSC: 片内4MHz
 *****************************************************************************/
#include<pic.h>

#define uchar   unsigned char
#define uint    unsigned int

#define LED1    GPIO0
#define LED2    GPIO1
#define LED3    GPIO2
#define KEY     GPIO4

/******************************************************************************
 *                             芯片配置字
 *****************************************************************************/
__CONFIG( FOSC_INTRCIO & WDTE_ON & PWRTE_ON & MCLRE_OFF & BOREN_ON );

/******************************************************************************
 *                           函数及变量声明
 *****************************************************************************/
void interrupt ISR(void);   //中断处理
void flash();               //LED1 2Hz闪烁函数

uint   time = 0;            //延时用变量
uchar  cnt = 0;             //记录按键被按下几次

/******************************************************************************
 *                          主函数
 *****************************************************************************/
void main()
{
        //选项寄存器
OPTION_REG = 0x0F;  /* GPIO上拉使能
                             * GP2/INT端口电平下降沿触发中断
                             * TIMER0时钟源选择内部时钟
                             * TIMER0在GP2/TOCKI电平上升沿递增
                             * 预分频器分配给WDT
                             * PS2:PS0= 111  WDT分频比1:128
                             */
        //中断控制寄存器
        INTCON = 0xC0;      /* 全局中断 使能
                             * 外设中断 使能
                             * TMR0溢出中断 禁止
                             * GP2/INT外部中断 禁止
                             * 端口电平变化中断 禁止
                             * TMR0中断标志T0IF 清零
                             * INT中断标志INTF 清零
                             * 电平变化中断标志GPIF 清零
                             */
        //中断标志位寄存器
        PIR1 = 0x00;        /* EEPROM写操作完成中断标志位EEIF 清零
                             * bit6-4位未用
                             * 比较器中断标志位CMIF 清零
                             * bit1 未用
                             * TMR1溢出中断标志位TMR1IF 清零
                             */
        //电源控制寄存器
        PCON = 0x00;        /* bit7-2 未用
                             * 上电复位标志位 清零
                             * 欠压复位标志位 清零
                             */
        //IO端口输入输出配置
        CMCON = 0x07;       //关闭模拟比较器,使GP<2:0>为数字IO
TRISIO = 0x38;      //GP<5:3>输入 GP<2:0>输出
        GPIO = 0x3F;        //GP<2:0>输出高电平
        WPU = 0x30;         //GP<5:4>内部弱上拉开启
        IOC = 0x30;         //GP<5:4>端口电平变化中断使能

        //Timer1控制
        TMR1H = 0x3C;       //使TMR1溢出时间为50000个周期 (50ms)
        TMR1L = 0xB0;
        PIE1 = 0x01;        //TMR1IE 计时器1溢出中断使能
        T1CON = 0x01;       //TMR1ON 使能Timer1

//主循环
while(1)
{
            if(KEY == 0)        //如果按键按下
            {
                time = 0;
                while(!KEY);    //等待按键被松开,由中断函数计数

                if(time<60)     //按下时间不足50ms*60=3000毫秒
                {
                    cnt++;      //按键次数加1,改变工作状态
                    if(cnt>3)
                    {
                        cnt = 0;
                    }
                }
                else if(time >= 60 && time < 100)   //按住时间3秒到5秒之间
                {
                    LED2 = !LED2;   //LED2亮灭状态翻转
                }
                else if(time >=100) //按住时间达到5秒
                {
                    LED3 = !LED3;   //LED3亮灭状态翻转
                }
            }

            switch(cnt)             //检测按键按下次数
            {
                case 0: LED1 = 1;       break;  //LED1熄灭
                case 1: LED1 = !LED1;   break;  //LED1低亮
                case 2: LED1 = 0;       break;  //LED1高亮
                case 3: flash();        break;  //LED1闪烁
                default:                break;
            }
        }
}
/******************************************************************************
 *                           中断处理函数
 *****************************************************************************/
void interrupt ISR(void)
{
    if(TMR1IE&&TMR1IF)      //定时器1溢出中断
    {
        asm ("CLRWDT");     //定时喂狗
        ++time;             //延时计数
        TMR1H = 0x3C;       //重设TIMER1初始值使TMR1溢出时间为50000个时钟周期
        TMR1L = 0xB0;
        TMR1IF = 0;         //定时器1溢出中断标志位清零
    }
}

/******************************************************************************
 *                           LED1闪烁函数
 *****************************************************************************/
void flash()
{
    time = 0;
    if(time%4 == 0)
    {
        LED1 = !LED1;
    }
}

追问

非常感谢,请问这个程序直接烧录进单片机就能正常工作吗?

追答

编译后烧录就可以

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-06-22

能修改成 用一只按键控制一个LED弱,强,闪烁,关灯效果的吗        按键按一次:弱(60%亮),按两次(100%亮),按三次闪烁(60%亮,1秒频率闪烁),按四次关灯。 一个按键有4种模式:弱,强,闪烁,关灯。 在任意状态下长按2秒按键关灯。

各位师傅请帮小弟写个c代码程序劳烦大家谢谢

相似回答