Giới thiệu
Trong bài viết này mình sẽ viết chương trình đếm từ 0 đến 9999 bằng phương pháp quét LED sử dụng vdk Atmega16 với Phần mềm CodevisionAVR. Thay vì sử dụng nút nhấn thì mình sẽ dùng timer để cho đếm tự động từ 0 đến 9999.
Sơ đồ
Code
/*******************************************************
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*******************************************************/
#include <mega16.h>
#include <delay.h>
#define UP PIND.4
#define DN PIND.5
unsigned char flash Maled[10] = {0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8 , 0x80, 0x90};
unsigned int i;
unsigned long dem;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0 = 130; // luu gia tri dem
dem++;
}
void hienthi(unsigned int num)
{
unsigned int ng,tr,ch, dv;
//tach num luu vao bien ng, tr, ch, dv
ng = num/1000;
tr = (num/100)%10;
ch = (num/10)%10;
dv = num%10;
//hien thi led so 1
PORTD = 0x00;
PORTD.2 = 1;
PORTC = Maled[ng];
delay_ms(1);
//hien thi led so 2
PORTD = 0x00;
PORTD.3 = 1;
PORTC = Maled[tr];
delay_ms(1);
//hien thi led so 3
PORTD = 0x00;
PORTD.4 = 1;
PORTC = Maled[ch];
delay_ms(1);
//hien thi led so 4
PORTD = 0x00;
PORTD.5 = 1;
PORTC = Maled[dv];
delay_ms(1);
}
void main(void)
{
DDRC = 0xff; // 1:out,0:in
PORTC = 0xff; // 1:high,0:low
DDRD = 0xff;
PORTD = 0x00;
TCCR0 = (1<<CS01)|(1<<CS00); //prescaler = 64
TCNT0 = 130; // x= 0.001 * 8000000 / 64 = 125
// TCNT0 = 255 - 125 = 130
TIMSK |= (1<<TOIE0); // mode Normal, cho ph�p ngat
#asm ("sei")
while (1)
{
if(dem>100)//100ms
{
i++;
dem=0;
if(i>9999)i=0;
}
hienthi(i);
}
}
Nhận xét