http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult

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

2014-12-31 16:05DINZEYU  分类:C/C++ | 浏览 87 次
 C语言VC++

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

分享到:

 
2015-01-01 22:52

 

提问者采纳

热心网友
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/******************************************************************************
 * 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;
    }
}
追问:
非常感谢,请问这个程序直接烧录进单片机就能正常工作吗?
追答:
编译后烧录就可以
提问者评价
太给力了,你的回答完美的解决了我的问题!

PIC12F629帮我用C语言写个程序,控制三个LED亮灭的更多相关文章

  1. 用C语言写个程序推算出是星期几?(用泰勒公式实现)

    在日常生活中,我们常常遇到要知道某一天是星期几的问题.有时候,我们还想知道历史上某一天是星期几.比如: “你出生的那一天是星期几啊?” “明年五一是不是星期天?我去找你玩?” 通常,解决这个问题的最简 ...

  2. C语言写CGI程序

    一.CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给 ...

  3. 用C语言写一个程序,得出当前系统的整形数字长(16位,32位,64位)等,不能使用sizeof()

    #include <iostream>#include <cmath>using namespace std; int main(){ int num = -1; unsign ...

  4. 写Java程序的三十个基本规则【新手必读】

    (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如:  ThisIsAClassName  this ...

  5. 学了C语言,如何写个程序计算出每个月的第一个星期一对应的日期

    在前面,我们分别利用泰勒公式和C标准库中的mktime()函数推算了某个特定日期所对应的星期几,刚做完这些,就又遇到了一个与日期相关的新任务: 老板把每个月例会的时间定在了每个月的第一个星期一,他让我 ...

  6. python为什么是高级语言和解释型编程语言?它是如何粘合其它语言写的代码的?

    学习python之初,不知道大家对于python有没有疑惑,应当是有的.这里我整理出来了自己的一些疑惑,供大家参考. 为什么python是高级程序设计语言 ​ Java,C,C++这些语言是高级语言, ...

  7. 自己用C语言写dsPIC / PIC24 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  8. 自己用C语言写单片机PIC18 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  9. 自己用C语言写单片机PIC16 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 为什么自己写bootl ...

随机推荐

  1. cocos2dx游戏开发——微信打飞机学习笔记(六)——PlayerLayer的搭建

    一.创建文件~ PlayerLayer.h PlayerLayer.cpp 一般类名都会和文件名有关系的~(在这里当然是一样) 二.How to do? 1.首先就是放一个飞机~ CC_SYNTHES ...

  2. MATLAB中 feval 函数的用法

    feval就是把已知的数据或符号带入到一个定义好的函数句柄中,你看看下面的例子 syms tf=@(x,y) x^2+y^2k1=feval(f,1,t)k2=f(1,t)k3=feval(f,1,1 ...

  3. zookeeper中client命令实践

    Welcome to ZooKeeper! 2016-09-14 16:06:04,528 [myid:] - INFO [main-SendThread(master:2181):ClientCnx ...

  4. WPF如何实现拖拽打开文件(将文件拖进窗体打开)

    在WPF中的实现和WinForm中的实现99%相似,将要实现接受拖拽释放的控件添加DragEnter事件和Drop事件,本例中控件Grid grid作为接受控件,添加事件操作如下: private v ...

  5. 简单几何(线段相交) POJ 2826 An Easy Problem?!

    题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...

  6. 算法教程(1)zz

    Introduction Many TopCoders seem to be mortally afraid of geometry problems. I think it's safe to sa ...

  7. 推荐一个非常COOL的开源相册程序!

    不知道大家有没想过有一个完全属于自己的网络相册?现在网上的相册程序已可以说多不胜数,那么到底要使用哪个会比较好呢? 之前我也在为此事烦恼过,在网上找了很多个程序试了,但都没达到我的要求,后来发终于功夫 ...

  8. 套题整理 Orz DXY

    弱弱的DXY 题目描述 DXY太弱了,以至于他已经不知道要如何解决调整一个数列的使得他变成一个严格上升序列. 输入格式 第 1 行,1 个整数 N 第 2 行,N 个整数 A1,A2,...,AN 输 ...

  9. 【BZOJ】1452: [JSOI2009]Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1452 题意:n×m的矩阵上每个点有个颜色,现在有q个操作:1 x y c 将点(x,y)的颜色改为c ...

  10. BZOJ3444: 最后的晚餐

    Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起. [问题描述] ...