BÀI TẬP
1.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, mỗi nút nhấn làm LED sáng chạy theo một chiều. (1 con sáng chạy)
#include <mega16.h>
#include <delay.h>
int x,y,i;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
if(PINA.0==0)
{x=0b00000001;
for(i=0;i<8;i++)
{
PORTC=x;
delay_ms(100);
x=(x<<1);
}
}
if(PINA.1==0)
{
y=0b10000000;
for(i=0;i<8;i++)
{
PORTC=y;
delay_ms(100);
y=y>>1;
}
}
}
}
2.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, mỗi nút nhấn làm LED sáng dần theo một chiều.
#include <mega16.h>
#include <delay.h>
int x,y,i;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
if(PINA.0==0)
{x=0b00000001;
for(i=0;i<8;i++)
{
PORTC=x;
delay_ms(100);
x=(x<<1)+0b00000001;
}
}
if(PINA.1==0)
{
y=0b10000000;
for(i=0;i<8;i++)
{
PORTC=y;
delay_ms(100);
y=(y>>1)+0b10000000;
}
}
}
}
3.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, mỗi nút nhấn làm số LED sáng chạy theo một chiều tăng dần.
#include <mega16.h>
#include <delay.h>
int x,y,x1,y1,i,j;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
x1=0b10000000;
y1=0b00000001;
for(i=0;i<8;i++)
{
if(PINA.0==0)
{
x=x1;
for (j=8-i;j>0;j--)
{
PORTC=x;
x=x>>1;
delay_ms(50);
}
x1=(x1>>1)+0b10000000;
}
if(PINA.1==0)
{
y=y1;
for (j=8-i;j>0;j--)
{
PORTC=y;
y=y<<1;
delay_ms(50);
}
y1=(y1<<1)+0b00000001;
}
}
}
}
4.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, mỗi nút nhấn làm LED sáng dồn theo một chiều (1 LED sáng chạy rồi giữ lại
để sáng dần cho tới hết)
#include <mega16.h>
#include <delay.h>
int x,y,i,j;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
if(PINA.0==0)
{
y=0b00000000;
for(i=0;i<8;i++)
{
x=0b10000000;
for(j=8-i;j>0;j--)
{
PORTC=x+y;
delay_ms(50);
x=x>>1;
}
y=PORTC;
}
}
if(PINA.1==0)
{
y=0b00000000;
for(i=0;i<8;i++)
{
x=0b00000001;
for(j=8-i;j>0;j--)
{
PORTC=x+y;
delay_ms(50);
x=x<<1;
}
y=PORTC;
}
}
}
}
5.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, một nút nhấn làm LED sáng dần từ hai bên vào, một nút nhấn làm LED sáng
dần từ giữa ra.
#include <mega16.h>
#include <delay.h>
int x,y,i;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
if(PINA.0==0)
{
x=0b00000001;
y=0b10000000;
for(i=0;i<4;i++)
{ PORTC=x+y;
delay_ms(50);
x=x<<1;
y=y>>1;
}
}
if(PINA.1==0)
{
x=0b00001000;
y=0b00010000;
for(i=0;i<4;i++)
{ PORTC=x+y;
delay_ms(50);
x=(x>>1)+0b00001000;
y=(y<<1)+0b00010000;
}
}
}
}
6.
Thực hiện kết nối phần cứng và viết chương trình nhận dữ liệu từ hai nút
nhấn, một nút nhấn làm số LED sáng chạy từ hai bên vào giữa, một nút làm số LED
sáng chạy từ giữa ra hai bên tăng dần.
#include <mega16.h>
#include <delay.h>
int x,y,i,j,x1,y1;
void main(void)
{
DDRC=0xFF;
DDRA=0x00;
PORTA=0xFF;
while (1)
{
if(PINA.0==0)
{
x=0b00000001;
y=0b10000000;
for(i=0;i<4;i++)
{ PORTC=x+y;
delay_ms(50);
x=x<<1;
y=y>>1;
}
}
if(PINA.1==0)
{
x1=0b00001000;
y1=0b00010000;
for(j=0;j<4;j++)
{
x=x1;
y=y1;
for(i=4-j;i>0;i--)
{ PORTC=x+y;
delay_ms(100);
x=(x>>1);
y=(y<<1);
}
x1=(x1>>1)+0b00001000;
y1=(y1<<1)+0b00010000;
}
}
}
}
Câu 7: Thực hiện giao tiếp HMI một nút nhấn và 8 LED, nhấn nút một lần làm
LED sáng dịch chuyển một vị trí.
char maygiat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int i=0;
void main(void)
{
while (1)
{
if(!PINA.0)
{
while(!PINA.0);
PORTC=maygiat[i];
i++;
if(i>8)
{
i=0;
}
}
}
}
Câu 8: Thực hiện HMI nhập dữ liệu 4 chữ số cho một biến x từ bàn phím ma trận,
hiển thị lên 4 LED 7 đoạn.
#include <mega16.h>
#include <delay.h>
#define
HANG1 PORTA.0
#define
HANG2 PORTA.1
#define
HANG3 PORTA.2
#define
HANG4 PORTA.3
#define
COT1
PINA.4
#define
COT2
PINA.5
#define
COT3
PINA.6
#define
COT4
PINA.7
char
led7[10]={0b10111111,0b10000110,0b11011011,0b11001111,0b11100110,0b11101101,0
b11111101,0b10000111,0b111111111,0b11101111};
int key,a,b,z,x,y;
int banphim()
{
PORTA=0xF0;
if(COT1==0)z=0;
if(COT2==0)z=1;
if(COT3==0)z=2;
if(COT4==0)z=3;
if(COT1==COT2==COT3==COT4==1)
{
key=16;
}
else
{
x=0xFE;
y=-1;
do
{
PORTA=x;
x=x<<1;
y++;
}
while(COT1==COT2==COT3==COT4==1);
key=(y*4)+z;
}
return key;
}
void hienthi(unsigned char x)
{
a=x%10;
b=x/10;
PORTC=led7[b];
PORTD=led7[a];
}
void main(void)
{
{
DDRA=0x00;
DDRC=0Xff;
DDRD=0Xff;
}
while (1)
{
banphim();
hienthi(key);
}
}
Câu 9: Thực hiện HMI nhập dữ liệu 4 chữ số cho một biến x từ bàn phím ma trận,
hiển thị lên LCD16x2.
#include <mega16.h>
#include <delay.h>
#include <alcd.h>
#define hang0 PORTA.0
#define hang1 PORTA.1
#define hang2 PORTA.2
#define hang3 PORTA.3
#define cot0 PINA.4
#define cot1 PINA.5
#define cot2 PINA.6
#define cot3 PINA.7
int key,x,y,z,a,b,so,so1,so2;
int banphim()
{
PORTA=0xF0;
if(cot0==cot1==cot2==cot3==1)
{
key=16;
}
else
{
x=0xFE;
y=-1;
do
{
PORTA=x;
y=y+1;
x=x<<1;
}
while(cot0==cot1==cot2==cot3==1);
if(cot0==0&cot1==cot2==cot3==1) z=0;
if(cot1==0&cot0==cot2==cot3==1) z=1;
if(cot2==0&cot0==cot1==cot3==1) z=2;
if(cot3==0&cot0==cot1==cot2==1) z=3;
key=(y*4)+z;
return key;
}
}
void hienthi(unsigned char so)
{
lcd_gotoxy(0,0);
lcd_puts("Phim duoc nhan:");
lcd_gotoxy(0,1);
if(so<10)
{
lcd_putchar('0');
lcd_putchar(so+48);
}
else
{
so1=so/10;
so2=so%10;
lcd_putchar(so1+48);
lcd_putchar(so2+48);
}
}
void main(void)
{
{
DDRA=0x00;
DDRC=0Xff;
lcd_init(16);
}
while (1)
{
banphim();
hienthi(banphim());
}
}
Câu 10: Thực hiện HMI nhập dữ liệu 4 chữ số cho một biến x từ các phím “tăng”,
“giảm”, “trái”, “phải”, “enter”, hiển thị lên 4 LED 7 đoạn.
#include <mega16.h>
#include <delay.h>
#define
UP
PINA.0
#define
DOWN
#define
LEFT
#define
RIGHT
PINA.3
#define
ENTER
PINA.4
#define
SETTING
PINA.1
PINA.2
PINA.5
unsigned char led7[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE4,0xFE,0xF6};
unsigned char quetled[4]={0b00001110,0b00001101,0b00001011,0b00000111};
unsigned char abcd[4];
int i,a,b,c,d;
void hienthi()
{
abcd[0]=a;
abcd[1]=b;
abcd[2]=c;
abcd[3]=d;
for(i=0;i<4;i++)
{
PORTD=quetled[i];
PORTC=led7[abcd[i]];
delay_ms(5);
PORTD=0xFF;
}
}
void nutbam()
{
if(!RIGHT)
{
i++;
if(i>3)
{
i=0;
}
while(!RIGHT);
}
if(!LEFT)
{
i--;
if(i<0)
{
i=3;
}
while(!LEFT);
}
if(!UP)
{
if(i==0)
{
a++;
if(a>9)
{
a=0;
}
}
if(i==1)
{
b++;
if(b>9)
{
b=0;
}
}
if(i==2)
{
c++;
if(c>9)
{
c=0;
}
}
if(i==3)
{
d++;
if(d>9)
{
d=0;
}
}
while(!UP);
}
if(!DOWN)
{
if(i==0)
{
a--;
if(a<0)
{
a=9;
}
}
if(i==1)
{
b--;
if(b<0)
{
b=9;
}
}
if(i==2)
{
c--;
if(c<0)
{
c=9;
}
}
if(i==3)
{
d--;
if(d<0)
{
d=9;
}
}
}
while(!DOWN);
}
void main(void)
{
{
DDRA=0x00;
DDRC=0xFF;
DDRD=0XFF;
}
while (1)
{
if(!SETTING)
{
nutbam();
PORTD=quetled[i];
if(i==0)
{
PORTC=led7[a];
}
if(i==1)
{
PORTC=led7[b];
}
if(i==2)
{
PORTC=led7[c];
}
if(i==3)
{
PORTC=led7[d];
}
}
if(!ENTER)
{
hienthi();
}
}
}
Câu 11: Thực hiện kết nối phần cứng viết chương trình nhận dữ liệu từ 8 nút nhấn nối vào
cổng A của Atmega16-1 truyền qua USART hiện số từ 1 đến 8 lên led 7 đoạn nối vào
Atmega16-2.
#include <mega16.h>
#include <stdio.h>
void main(void)
{
{
DDRA=0x00;
PORTA=0xFF;
}
while (1)
{
switch(PINA)
{
case(0b11111110):
{
putchar(1);
}
break;
case(0b11111101):
{
putchar(2);
}
break;
case(0b11111011):
{
putchar(3);
}
break;
case(0b11110111):
{
putchar(4);
}
break;
case(0b11101111):
{
putchar(5);
}
break;
case(0b11011111):
{
putchar(6);
}
break;
case(0b10111111):
{
putchar(7);
}
break;
case(0b01111111):
{
putchar(8);
}
break;
}
}
}
Lệnh Nhận
#include <mega16.h>
unsigned char led7[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F};
#include <stdio.h>
void main(void)
{
{
DDRC=0XFF;
}
while (1)
{
switch(getchar())
{
case(1):
{
PORTC=led7[1];
}
break;
case(2):
{
PORTC=led7[2];
}
break;
case(3):
{
PORTC=led7[3];
}
break;
case(4):
{
PORTC=led7[4];
}
break;
case(5):
{
PORTC=led7[5];
}
break;
case(6):