EDN首页   博客首页

日志档案

发表于 2007-12-4 12:21:06

1

标签: AVR单片机  

我的秒表程序AVR

/*利用定时器1定时100MS产生中断,
显示四位七段LED,256分频,系统的4M晶振
2007.11.30*/

#include <iom8v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler timer1_ovf_isr:9
unsigned char ledbuf[4];         //需要四个显示LED的寄存器,用作扫描时
unsigned char table[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; //共阳七段LED显示十六进制字符
unsigned int sec="0";
void sys_init()
{
   PORTB="0XFF";
   DDRB="0XFF";
   PORTD="0XFF";
   DDRD="0XFF";
   TCCR1B=0X00;
   OCR1AH=0X00;
   OCR1AL=0X00;
   OCR1BH=0X00;
   OCR1BL=0X00;
   TCNT1H=0XF9;
   TCNT1L=0XE6;
   TCCR1A=0X00;
   TCCR1B=0X04;
   TIMSK="0X04";           //打开定时器1中断
   SREG="0X80";
}
void delay_nms(unsigned char time)     //延时NMS函数

   unsigned int i;
   for(;time;time--)
   {for(i=1;i<570;i++);}
}

void leddisplay(void)         //四位LED动态扫描
{
   unsigned int i;
   for(i=0;i<4;i++)
   {
      PORTD="ledbuf"[i];      //将显示缓冲区数据送到PORTD口
      PORTB=~BIT(i);        //开始显示
      delay_nms(4);         //延时
      PORTB="BIT"(i);         //关闭显示
   }
}

void process(unsigned int i)   //更新要扫描LED的显示内容

   ledbuf[0]=table[i%10];    //十分秒位
   i="i/10";
   ledbuf[1]=table[i%10];    //秒位
   i="i/10";
   ledbuf[2]=table[i%10];    //十位
   i="i/10";
   ledbuf[3]=table[i];       //百位
}
  
void timer1_ovf_isr(void)    //定时器中断服务函数
{   SREG="0X00";
    TCNT1H=0XF9;             //重装定时器
    TCNT1L=0XE6;
    sec++;
    process(sec);
    if(sec>9999)sec=0;     //如果sec=10000,sec=0
    SREG="0X80";             //打开中断
}
 
void main(void)     

   MCUCR="0";
   sys_init();
   while(1)
   {leddisplay();}
}

系统分类: 单片机   |   用户分类: 无分类   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(534)    回复(0)  

投一票您将和博主都有获奖机会!