📄 tc0_3.c
字号:
/**********************************************************
**** AVR T/C0 使用范例3(T/C0作为定时器, 溢出中断)***
**** 作者: liugangdi ***
**** 编译器:WINAVR20050214 ***
**** 日期:2005.12.11 ***
***********************************************************/
/*功能简单说明:T/C0作为定时器,T/C0溢出中断动态扫描5位数码管显示
将16位的二进制转换成5位十进制动态显示。由于mega16实验板的限制可以
将8位的二进制转换成3位十进制动态显示。由于mega16实验板上只有两个
数码管,所以只能显示3位十进制中的个位和十位。 此时的OC0可以设置没
有被连接,PB3作为普通的端口使用.*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define number 0b00101101
uchar temp,i_g=0x00, i_sh=0x00, i_b=0x00;
uchar num_g,num_sh,num_b;
//8位二进制转3位十进制函数
void b8td3(uchar n)
{
for (i_b=0;n>100;)
{n=n-100;
i_b=i_b+1;}
for (i_sh=0;n>10;)
{n=n-10;
i_sh=i_sh+1;}
i_g=n;
}
//T/C0溢出中断初始化,每2ms溢出中断一次(1/(8*1000000/64))*256=2ms
void init_timer0(void)
{TIMSK=0x01; //T/C0溢出中断使能
TCCR0=0X03; //64分频
TCNT0=0X00; //T/C0置初值0
}
//T/C0溢出中断服务程序
SIGNAL (SIG_OVERFLOW0)
{
switch (temp)
{
case 0xBF :PORTB=num_g;PORTA=temp;temp=0x7F;break; //判断是否是此位线,若是送字线和位线显示,并且修改位线
case 0x7F :PORTB=num_sh;PORTA=temp;temp=0xDF;break;
case 0xDF :PORTB=num_b;PORTA=temp;temp=0xBF;break;
default: break;
}
}
int main(void)
{
uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
b8td3(number); //调用8位二进制转3位十进制函数
num_g=tab[i_g];
num_sh=tab[i_sh];
num_b=tab[i_b]; //根据返回的个、十、百位的值查的相应的七数码管的值
DDRB=0xFF;
DDRA=0xFF; //A、B口定义方向
PORTA=0xBF; //A口赋初值(位线置初值)
temp=PINA;
init_timer0(); //调用T/C0溢出中断初始化函数
sei(); //开总中断
while(1){;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -