Trang chủ Chưa phân loạiAtmega16 Đếm Từ 0-9999 Hiển Thị Led 7 Thanh – CodeVision

Atmega16 Đếm Từ 0-9999 Hiển Thị Led 7 Thanh – CodeVision

bởi Admin
24 lượt xem 2 Phút đọc

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ơ đồ

banner

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);  
          }
}

Demo



Để lại bình luận

Focus Mode

Đã phát hiện trình chặn quảng cáo

Vui lòng hỗ trợ chúng tôi bằng cách tắt tiện ích chặn quảng cáo (AdBlocker) trên trình duyệt của bạn khi truy cập trang web của chúng tôi.