查看: 4379|回复: 7

MEGA1284P试用记录及心得 学习笔记(四) 基于定时器1的LED流水灯

[复制链接]
  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-24 23:39:16 | 显示全部楼层 |阅读模式
    分享到:
    今天只向大家分享入门程序,试用定时器控制LED流水灯;创建led_timer工程后,创建main.c主函数文件,并仿造官方例程文件,加载avr_compiler.h头文件;主函数中作IO端口初始化和定时器1初始化程序,并且最重要一步sei(); //中断使能,并添加相应中断处理函数。通过AVR911下载程序后,按RESET键,可看到4个指示灯顺时针、逆时针点亮。

    序代码如下:
    #include "avr_compiler.h"
    //LED顺时针方向ED0-PB0LED2-PB1 LED3-PB2 LED1-PB3
    //LED接上拉电阻,低电平点亮;引脚配置为输出时,向PINX对应引脚写入1,会自动翻转TOGGLING引脚电平
    static volatile bool Time1s_flag=0;
    static volatile bool LedDis_flag=0;
    static volatile unsigned char Time10ms_cnt=0;                  //定时10ms计数变量
    static volatile unsigned char tmp=0;                                  //led显示计数变量
    const unsigned char ledbuf[14]={0,0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x03,0x06,0x0c,0x06,0x03,0x01};
    ISR(TIMER1_COMPA_vect)
    {
           Time10ms_cnt++;
           if(Time10ms_cnt >=100)
           {
                  Time10ms_cnt = 0;
                  Time1s_flag = 1;
           }
           if((Time10ms_cnt %50)==0)
           {
                  LedDis_flag = 1;
           }
    }
    void mega1284p_init(void)
    {
           DDRA = 0x00;                                                 //0为输入,1为输出,默认为上拉输入
           DDRB = (1 << DDB3)| (1 << DDB2) | (1 << DDB1) | (1 << DDB0);              //B口对应位作为输出,关闭输入上拉电阻
           DDRC = 0x00;
           DDRD = 0x00;
           PORTA = (1 <<ORTA5) | (1 << PORTA4) | (1 << PORTA3) | (1 << PORTA2)
                  | (1 <<ORTA1) | (1 << PORTA0);     //A口作为输入,向PORTA对应位写1激活输入上拉电阻,写1关闭输入上拉电阻
           PORTB = 0xFF;                                               //向PINX对应引脚写入1,会自动翻转TOGGLING引脚电平
           PORTC = 0xFF;
           PORTD = 0xFF;
           PRR0 &= ~(1 <<RTIM1);                              //写入0允许定时器模块;低功耗寄存器写1关闭相应模块功能
           // Set timer comparevalue (how often timer ISR will fire)
           OCR1A = 0x3600;                                            //10ms中断一次,100*13824*8=11059200,输出匹配寄存器         
           // Enable timer1 outputcompare match A ISR
           TIMSK1 = (1 <<OCIE1A);                              //比较中断允许,Bit 1 – OCIE1A: Timer/Counter1, Output Compare A MatchInterrupt Enable
           // Timer1 prescaler =system clock / 8
           TCCR1B |= (0 <<CS12) | (1 << CS11) | (0 << CS10);             //CSn2-CSn0:010,8分频
           // Timer1 mode = CTC(count up to compare value, then reset)
           TCCR1B |= (1 <<WGM12);                             //定时器工作在CTC计数模式;计数到匹配后,自动清零
          
           sei();                                                               //中断使能
    }
    int main(void)
    {
           mega1284p_init();
           while(1)
           {
                  if(LedDis_flag)
                  {
                         LedDis_flag= 0;
                         
                         PORTB =~ledbuf[tmp++];
                         if(tmp>13)
                                tmp= 0;
                  }
    //            PINB |= (1<< PINB3) | (1 << PINB2) | (1 << PINB1) | (1 << PINB0);
    //            delay_us(20000);
           }
    }
    注释:
    1)     ledbuf[14]为定义的LED花样流水灯显示数组,可根据兴趣手动修改。
    2)     定时器1采用的A通道捕获匹配方式,所以中断入口使用ISR(TIMER1_COMPA_vect)
    3)     这是我编写的第一个AVR程序,可能理解有错误,欢迎大家拍砖!
    工程文件见附件:
    led_timer_131123.rar (16.78 KB, 下载次数: 8)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-25 08:20:33 | 显示全部楼层
    顶一个·~~~~~~~~~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-25 08:51:18 | 显示全部楼层
    继续加油哟!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-12-16 10:30
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-11-25 11:30:40 | 显示全部楼层
    支持!!不错的!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-4-12 14:51
  • 签到天数: 163 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-12-2 18:22:04 | 显示全部楼层
    pichen 发表于 2013-11-25 11:30
    支持!!不错的!

    你的板子收回去了吗?怎么不见你继续分享了?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2013-12-16 10:30
  • 签到天数: 23 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-12-10 10:53:53 | 显示全部楼层
    wspytu 发表于 2013-12-2 18:22
    你的板子收回去了吗?怎么不见你继续分享了?

    最近太忙了,都没有时间整!!艳子还催了,呵呵,今天把板子寄回去
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-1-22 18:04
  • 签到天数: 189 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-12-29 17:42:58 | 显示全部楼层
    注释写得很全,赞一个
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-12-2 10:37:14 | 显示全部楼层
    谢谢楼主分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-23 06:12 , Processed in 0.189652 second(s), 30 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.