Nút nhấn bt2 led PORTX.1 sáng.. Nút nhấn bt3 led PORTX.2 sáng.. Nút nhấn bt4 led PORTX.3 sáng... Dùng 2 nút nhấn ĐK ngắt ngoài.
Trang 1Bài 1a : Chớp tắt LED dùng for nhấp nháy 3 lần.
#include <mega8.h>
#include <delay.h>
#define data PORTB
unsigned int i,;
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void tatled()
{
data=0x00;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
Trang 2ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
// Place your code here
tatled();
for(i=0;i<6;i++)
{
data=~data;
delay_ms(50);
}
}
Trang 3Bài 1b : đếm nhị phân từ 0 -> 255.
#include <mega8.h>
#include <delay.h>
#define data PORTB
unsigned int i,;
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void tatled()
{
data=0x00;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
Trang 4ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
tatled();
for(i=0;i<256;i++)
{
data=i;
delay_ms(50);
}
}
Trang 5Bài 1c : Dùng 2 nút nhấn:
Nút nhấn bt1 chạy led từ PORTX.0 -> PORTX.7 lưu lại Nút nhấn bt2 tắt led từ PORTX.7 -> PORTX.0
#include <mega8.h>
#include <delay.h>
#define data PORTB
#define bt1 PIND.0
#define bt2 PIND.1
unsigned int i, k;
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void tatled()
{
data=0x00;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x0f;
DDRC=0x0f;
PORTD=0x0f;
DDRD=0x0f;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
Trang 6OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
for(k=0;k<16;k++)
{
if(bt1==0)
{
for(i=0;i<8;i++)
{
data=(data<<1)|0x01; delay_ms(100);
}
}
if(bt2==0)
{
for(i=0;i<8;i++)
{
data=(data>>1); delay_ms(100);
}
Trang 7}
}
Bài 1d : Dùng 1 nút nhấn
Bật nút 8 đèn sáng của PORTX Thả nút 8 đèn tắt của PORTX
#include <mega8.h>
#include <delay.h>
#define data PORTB
#define bt1 PIND.0
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x0f;
DDRD=0x0f;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
Trang 8OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
if(bt1==0)
{
data=0xff;
delay_ms(30);
}
if(bt1==1)
{
data=0x00;
delay_ms(30);
}
}
Trang 9Bài 1e : Dùng 4 nút nhấn
Nút nhấn bt1 led PORTX.0 sáng Nút nhấn bt2 led PORTX.1 sáng Nút nhấn bt3 led PORTX.2 sáng Nút nhấn bt4 led PORTX.3 sáng.
#include <mega8.h>
#include <delay.h>
#define data PORTB
#define bt1 PIND.0
#define bt2 PIND.1
#define bt3 PIND.2
#define bt4 PIND.3
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void tatled()
{
data=0x00;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x0f;
DDRD=0x0f;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
Trang 10TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
if(bt1==0)
{
data=0x01;
delay_ms(50);
}
if(bt2==0)
{
data=0x02;
delay_ms(50);
}
if(bt3==0)
Trang 11data=0x04;
delay_ms(50);
}
if(bt4==0)
{
data=0x08;
delay_ms(50);
}
}
}
Bài 1f : Chạy 8 led từ PORTX.0 -> PORTX.7… không lưu led.
#include <mega8.h>
#include <delay.h>
#define data PORTB
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
Trang 12TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
data=0x01;
delay_ms(100);
data=0x02;
delay_ms(100);
data=0x04;
delay_ms(100);
data=0x08;
delay_ms(100);
data=0x10;
delay_ms(100);
data=0x20;
delay_ms(100);
Trang 13delay_ms(100);
data=0x80;
delay_ms(100);
}
}
Bài 1g : Dùng 2 nút nhấn.
Nút nhấn bt1 chạy 8 led từ PORTX.0 -> PORTX.7… không lưu led Nút nhấn bt2 chạy 8 led từ PORTX.7 -> PORTX.0… không lưu led
#include <mega8.h>
#include <delay.h>
#define data PORTB
#define bt1 PIND.0
#define bt2 PIND.1
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void tatled()
{
data=0x00;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x0f;
DDRD=0x0f;
Trang 14TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SPCR=0x00;
TWCR=0x00;
while (1)
{
tatled();
if(bt1==0)
{
data=0x01;
delay_ms(100);
data=0x02;
delay_ms(100);
Trang 15delay_ms(100); data=0x08; delay_ms(100); data=0x10; delay_ms(100); data=0x20; delay_ms(100); data=0x40; delay_ms(100); data=0x80; delay_ms(100); }
tatled();
if(bt2==0) {
data=0x80; delay_ms(100); data=0x40; delay_ms(100); data=0x20; delay_ms(100); data=0x10; delay_ms(100); data=0x08; delay_ms(100); data=0x04; delay_ms(100); data=0x02; delay_ms(100); data=0x01; delay_ms(100); }
}
}
Trang 16Bài 2 Dùng 2 nút nhấn ĐK ngắt ngoài.
1 nút nhấn bt1 đếm lên từ số 0 -> 9 (led 7 đoạn)
1 nút nhấn bt2 đếm xuống từ số 9 -> 0.
#include <mega8.h>
#include <delay.h>
#define bt1 PIND.2
#define bt2 PIND.3
unsigned char dem;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
dem++;
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
dem ;
}
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x0f;
Trang 17TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
GICR|=0xC0;
MCUCR=0x0B;
GIFR=0xC0;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84;
SPCR=0x00;
TWCR=0x00;
#asm("sei")
while (1)
{
bt1=dem;
if(dem>9) dem=0;
PORTB=dem;
bt2=dem;
if(dem<0) dem=9;
PORTB=dem;
}
}
Trang 18Bài 3 : Viết chương trình hiển thị lần lượt các số từ 0 đến 9 lên LED 7 đoạn
#include <mega8.h>
#include <delay.h>
unsigned char i;
unsigned char so[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
#define ADC_VREF_TYPE 0x00
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
void main(void)
{
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
Trang 19ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84;
SPCR=0x00;
TWCR=0x00;
while (1)
{
for(i=0;i<10;i++)
{
PORTB=so[i];
delay_ms(100);
}
}
}