/*利用定时器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();}
}
点击此处查看原文 >>
系统分类:
单片机 | 用户分类:
无分类
| 来源:
原创