CÙNG HỌC TẬP VÀ CHIA SẺ
 
IndexNỘI QUYCalendarTrợ giúpTìm kiếmĐăng kýĐăng Nhập

Share | 
 

 HỌ VI ĐIỀU KHIỂN AVR

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
Sunset_Pro
Thành viên chính thức
Thành viên chính thức


Tổng số bài gửi : 55
Điểm : 97
Danh tiếng : 11
Ngày tham gia : 25/12/2010
Đến từ : UNETI

Bài gửiTiêu đề: HỌ VI ĐIỀU KHIỂN AVR   Sat Jan 08, 2011 9:06 pm

Một chương trình ứng dụng nho nhỏ trên chip ATMEGA16: ĐIỀU KHIỂN LED 3D 5x5x5
[You must be registered and logged in to see this image.]
* CODE
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8d Professional
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
[You must be registered and logged in to see this link.]

Project :
Version :
Date : 3/11
Author : F4CG
Company : F4CG
Comments:


Chip type : ATmega16
Program type : Application
Clock frequency : 16.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*/
#include
#include

void display_flash(char flash *s) {

}
void HELLO(void)
{
/* this will work !!! */
/* the function addresses the string as it is located in FLASH */
display_flash("");

display_flash("Hello everybody");
}


////////////////main/////////////////////////////////////////////////////
char layer[5];
char col[25];
char t;
char i,j,k,m,n,p;
unsigned long dat[5];
unsigned int lan;
//CHUONG TRINH XUAT HIEN THI RA CAC LED
void out()
{
//XUAT MANG DIEU KHIEN LOP
PORTB.1=layer[4];
PORTB.2=layer[3];
PORTB.3=layer[2];
PORTB.4=layer[1];
PORTB.5=layer[0];
//XUAT MANG DIEU KHIEN PHAN TU LOP
PORTA.0=col[0];
PORTA.1=col[1];
PORTA.2=col[2];
PORTA.3=col[3];
PORTA.4=col[4];
PORTA.5=col[5];
PORTA.6=col[6];
PORTA.7=col[7];
PORTC.0=col[8];
PORTC.1=col[9];
PORTC.2=col[10];
PORTC.3=col[11];
PORTC.4=col[12];
PORTC.5=col[13];
PORTC.6=col[14];
PORTC.7=col[15];
PORTD.0=col[16];
PORTD.1=col[17];
PORTD.2=col[18];
PORTD.3=col[19];
PORTD.4=col[20];
PORTD.5=col[21];
PORTD.6=col[22];
PORTD.7=col[23];
PORTB.0=col[24];
}
/*CHUONG TRINH DOC DU LIEU VA QUET RA KHOI LAP PHUONG YEU CAU 5 GIA TRI
NGA VAO LA DU LIEU CUA 5 LOP DE XU LY SAU DO GOI HAM OUT DE XUAT RA */
void scan(char times)
{
for(k=0;k<=(times);k++)
{ //SO LAN QUET TAO RA THOI GIAN DELAY (1 VONG LAP > 1MS)
for(i=0;i<=4;i++)
{
layer[i]=0;
for(j=0;j<=24;j++)
{
col[j]=dat[i]>>j&0x01; //LAY TUNG BIT BANG CACH DICH VA CHE BIT
}
out();
delay_ms(1); // DELAY 1 MS DE DIEU KHIEN THOI GIAN TONG
layer[i]=1;
out();



}
}
}
//CHUONG TRINH BAT, TAT TAT CA KHOI LED VA CLEAR, SET DU LIEU DIEU KHIEN
void fill(char bits)
{
switch(bits)
{
case 0:
{
for(i=0;i<=4;i++){
layer[i]=1;

}
scan(1);
for(i=0;i<=4;i++){
dat[i]=0xffffffff;

}
break;
}
case 1:
{
for(i=0;i<=24;i++){
col[i]=0x00;
}
for(i=0;i<=4;i++){
layer[i]=0;
}
out();
break;
}

}
}


//BANG TRA DU LIEU ALPHABET
void table(char text)
{ //text LA 1 KY TU HOA
switch (text)
{
/*CAC DU LIEU DIEU KHIEN
HIEN THI KY TU */
case 'A':
{
dat[0]=0xFEFFFFEF;
dat[1]=0xFEF7BDEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFFF7FDFF;
dat[4]=0xFFFFBFFF;
break;

}
case 'B':
{
dat[0]=0xFFF7BDEF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFFF7BDEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDEF;
break;

}
case 'C':
{
dat[0]=0xFEF7BDFF;
dat[1]=0xFFFFFFEF;
dat[2]=0xFFFFFFEF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFEF7BDFF;
break;

}
case 'D':
{
dat[0]=0xFFF7BDEF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDEF;
break;

}
case 'E':
{
dat[0]=0xFEF7BDEF;
dat[1]=0xFFFFFFEF;
dat[2]=0xFFF7BDEF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFEF7BDEF;
break;

}
case 'F':
{
dat[0]=0xFFFFFFEF;
dat[1]=0xFFFFFFEF;
dat[2]=0xFFF7BDEF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFEF7BDEF;
break;

}
case 'G':
{
dat[0]=0xFEF7BDFF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEF7FFEF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFEF7BDFF;
break;

}
case 'H':
{
dat[0]=0xFEFFFFEF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEF7BDEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'I':
{
dat[0]=0xFEF7BDEF;
dat[1]=0xFFFFBFFF;
dat[2]=0xFFFFBFFF;
dat[3]=0xFFFFBFFF;
dat[4]=0xFEF7BDEF;
break;

}
case 'J':
{
dat[0]=0xFFF7BDFF;
dat[1]=0xFEFFFFEF;
dat[2]=0XFEFFFFFF;
dat[3]=0XFEFFFFFF;
dat[4]=0xFEF7BDEF;
break;

}
case 'K':
{
dat[0]=0xFEFFFFEF;
dat[1]=0XFFF7FFEF;
dat[2]=0XFFFFBDEF;
dat[3]=0XFFF7FFEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'L':
{
dat[0]=0xFEF7BDEF;
dat[1]=0xFFFFFFEF;
dat[2]=0xFFFFFFEF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFFFFFFEF;
break;

}
case 'M':
{
dat[0]=0xFEFFFFEF;
dat[1]=0xFEFFFFEF;
dat[2]=0XFEFFBFEF;
dat[3]=0XFEF7FDEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'N':
{
dat[0]=0xFEFFFFEF;
dat[1]=0xFEF7FFEF;
dat[2]=0XFEFFBFEF;
dat[3]=0XFEFFFDEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'O':
{
dat[0]=0xFFF7BDFF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDFF;
break;

}
case 'P':
{
dat[0]=0xFFFFFFEF;
dat[1]=0xFFF7BDEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDEF;
break;

}
case 'Q':
{
dat[0]=0xFEFFBDFF;
dat[1]=0xFFF7FFEF;
dat[2]=0XFEFFBFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDFF;
break;

}
case 'R':
{
dat[0]=0xFEF7FFEF;
dat[1]=0xFFF7BDEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFFF7BDEF;
break;

}
case 'S':
{
dat[0]=0xFFF7BDEF;
dat[1]=0xFEFFFFFF;
dat[2]=0xFFF7BDFF;
dat[3]=0xFFFFFFEF;
dat[4]=0xFEF7BDFF;
break;

}
case 'T':
{
dat[0]=0xFFFFBFFF;
dat[1]=0xFFFFBFFF;
dat[2]=0xFFFFBFFF;
dat[3]=0xFFFFBFFF;
dat[4]=0xFEF7BDEF;
break;

}
case 'U':
{
dat[0]=0xFFF7BDFF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'V':
{
dat[0]=0xFFFFBFFF;
dat[1]=0xFFF7FDFF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'W':
{
dat[0]=0xFFF7BDFF;
dat[1]=0XFEFFBFEF;
dat[2]=0XFEFFBFEF;
dat[3]=0XFEFFBFEF;
dat[4]=0xFEFFFFEF;
break;

}
case 'X':
{
dat[0]=0xFEFFFFEF;
dat[1]=0xFFF7FDFF;
dat[2]=0XFFFFBFFF;
dat[3]=0xFFF7FDFF;
dat[4]=0xFEFFFFEF;
break;

}
case 'Y':
{
dat[0]=0xFFFFBFFF;
dat[1]=0xFFFFBFFF;
dat[2]=0XFFFFBFFF;
dat[3]=0xFFF7FDFF;
dat[4]=0xFEFFFFEF;
break;

}
case 'Z':
{
dat[0]=0xFEF7BDEF;
dat[1]=0xFFFFFDFF;
dat[2]=0XFFFFBFFF;
dat[3]=0xFFF7FFFF;
dat[4]=0xFEF7BDEF;
break;

}

}
}
//HIEU UNG HIEN THI VA DICH CHU
void effect(char speed)
{
p=0;
//msg[p]=text;
while(1)
{
for(n=0;n<=4;n++)
{
table('A');
for(m=0;m<=4;m++)
{
dat[m]=dat[m]>>n;
}
scan(speed);
fill(0);
}
p++;

}
}
// HIEU UNG DUOI BAT

void effect1(char speed, char times)
{
for(n=0;n<=times;n++)
{ //VONG LAP SO VONG THUC HIEN
dat[0]=0xFEFFFFFE;
dat[1]=0xFF7FFFFD;
dat[2]=0xFFBFFFFB;
dat[3]=0xFFDFFFF7;
dat[4]=0xFFEFFFEF;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1]; //CHEP DU LIEU LOP TREN XUONG LOP DUOI
}
dat[4]=0xFFFF7DFF; //THAY DOI DU LIEU LOP TREN
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFFFFBBFF;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFFF7FFDF;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFEFFFFFE;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFF7FFFFD;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFFBFFFFB;
scan(speed);
for(m=0;m<=3;m++){
dat[m]=dat[m+1];
}
dat[4]=0xFFDFFFF7;
scan(speed);

}
}


//HIEU UNG PHAO HOA
void effect2(char speed)
{
fill(0);
dat[0]=0xFEEEEEAE;
scan(speed);
dat[1]=0xFFFFEFFF;
scan(speed);
dat[2]=0xFFFFEFFF;
scan(speed);
dat[3]=0xFFFFEFFF;
scan(speed);
for(m=0;m<=40;m++){
//dat[4]=scan();
//dat[4]=(dat[4]<<16|scan());
scan(speed/4);
}
delay_ms(1000);

}
//Hieu ung do hat
void effect3(char speed,char times)
{
//FRAME1
fill(0);
dat[0]=0xFE0739C0;
scan(speed);
//FRAME2
dat[1]=0xFEEFFFEE;
scan(speed);
//FRAME3
dat[2]=dat[1];
scan(speed);
//FRAME4
dat[2]=0x00;
scan(speed);
//FRAME 5
dat[0]=0xffffffff;
scan(speed);
//FRAME 6
dat[1]=0xffffffff;
scan(speed);
//FRAME 7
dat[3]=0xFFF8D63F;
dat[2]=0xFE0739C0;
scan(speed);
//FRAME 8
dat[4]=0xFFFFEFFF;
scan(speed);
//FRAME 9
dat[3]=0x00;
dat[2]=dat[0];
scan(speed);
//FRAME 10
dat[4]=0x00;
dat[3]=dat[0];
scan(speed);
//FRAME 11
dat[3]=0xFEEFFFEE;
dat[4]=~dat[3];
scan(speed);
//FRAME 12
dat[2]=dat[3];
dat[3]=0xFD777DD5;
dat[4]=0xFFB8831B;
scan(speed);
//FRAME 13
dat[1]=dat[2];
dat[2]=dat[3];
dat[3]=0xFFFAFEBF;
dat[4]=0xFFFDC77F;
scan(speed);
//FRAME 14
dat[0]=dat[1];
dat[1]=dat[2];
dat[2]=dat[3];
dat[3]=0xFFFDD77F;
dat[4]=0xFFFFEFFF;
scan(speed);
//FRAMES final
dat[4]=0xffffffff;
for(n=0;n<=3;n++){
dat[0]=dat[0]&dat[1];
for(m=1;m<=3;m++){
dat[m]=dat[m+1];
}
scan(speed);
dat[0]=0x00;
}

}
//HIEU UNG KIM CUONG
void effect4(char speed, char times)
{
for(m=0;m<=times;m++)
{
fill(0);
// FRAME 1
dat[0]=0xFEEFFFEE;
dat[4]=0xFEEFFFEE;
scan(speed);
// FRAME 2
dat[1]=0xFFFAFEBF;
dat[3]=0xFFFAFEBF;
scan(speed);
// FRAME
dat[2]=0xFFFFEFFF;
scan(speed);
// FRAME 3
dat[0]=0xffffffff;
dat[4]=dat[0];
scan(speed);
// FRAME 4
dat[1]=dat[0];
dat[3]=dat[0];
scan(speed);
// FRAME 5
delay_ms(500);
dat[1]=dat[2];
dat[3]=dat[2];
dat[2]=0xFFFAEEBF;
scan(speed);
// FRAME 6
dat[0]=0xFFFFEFFF;
dat[4]=dat[0];
dat[1]=0xFFF8C63F;
dat[3]=dat[1];
dat[2]=0x00;
scan(speed);
// FRAME RANDOM

for(m=0;m<30;m++)
{
for(i=0;i<=4;i++)
{
// dat[i]=scan();
// dat[i]=(dat[4]<<16|scan());
}
scan(speed/10);

} fill(1);
delay_ms(1000);
}


}

//HIEU UNG TRAI TIM
void effect5(char speed, char times)
{
for(m=0;m<=times;m++)
{
//FRAME1
dat[0]=0xFFFFBBFF;
dat[1]=0xFFF739DF;
dat[2]=0xFEE739CE;
dat[3]=0xFEE739CE;
dat[4]=0xFFF77DDF;
scan(speed);
//FRAME2
dat[0]=0xFFFFD7FF;
dat[1]=0xFFFAD6BF;
dat[2]=0xFF5AD6B5;
dat[3]=0xFF5AD6B5;
dat[4]=0xFFFAFEBF;
scan(speed);
//FRAME3
dat[0]=0xFFFFEFFF;
dat[1]=0xFFFDEF7F;
dat[2]=0xFFBDEF7B;
dat[3]=0xFFBDEF7B;
dat[4]=0xFFFDFF7F;
scan(speed);
//FRAME4
dat[0]=0xFFFFEFFF;
dat[1]=0xFFFBEFBF;
dat[2]=0xFEFBEFBE;
dat[3]=0xFEFBEFBE;
dat[4]=0xFFFBFFBF;
scan(speed);
//FRAME5
dat[0]=0xFFFFEFFF;
dat[1]=0xFFFFC7FF;
dat[2]=0xFFFF83FF;
dat[3]=0xFFFF83FF;
dat[4]=0xFFFFD7FF;
scan(speed);
//FRAME6
dat[0]=0xFFFFEFFF;
dat[1]=0xFFFEEEFF;
dat[2]=0xFFEEEEEF;
dat[3]=0xFFEEEEEF;
dat[4]=0xFFFEFEFF;
scan(speed);
//FRAME7
dat[0]=0xFFFFEFFF;
dat[1]=0xFFFDEF7F;
dat[2]=0xFFBDEF7B;
dat[3]=0xFFBDEF7B;
dat[4]=0xFFFDFF7F;
scan(speed);

}

}


//QUET TAO KHUNG
void effect6(char speed, char times)
{
for(n=0;n<=times;n++)
{
times--;
// FRAME 0
fill(0);
dat[1]=0xFFF8C63F;
dat[2]=0xFFF8C63F;
dat[3]=0xFFF8C63F;
scan(speed);
// FRAME 1
fill(0);
dat[0]=0xFE0739C0;
scan(speed);
//FRAME 2
dat[1]=0xFEEFFFEE;
scan(speed);
//FRAME 3
dat[2]=dat[1];
scan(speed);
//FRAME 4
dat[3]=dat[1];
scan(speed);
//FRAME 5
dat[4]=dat[0];
scan(speed);
//FRAME6-10
for(m=5;m>=1;m--)
{
fill(0);
dat[m-1]=0x00;
scan(speed);
}
//frame 11
fill(0);
dat[1]=0xFFF8C63F;
dat[2]=0xFFF8C63F;
dat[3]=0xFFF8C63F;
scan(speed);
// FRAME 12
fill(0);
dat[0]=0xFEF7BDEF;
dat[1]=0xFEFFFFEF;
dat[2]=0xFEFFFFEF;
dat[3]=0xFEFFFFEF;
dat[4]=0xFEF7BDEF;
scan(speed);
// FRAME 13-16
for(m=1;m<=3;m++){
dat[0]=0xFEFFFFEF;
dat[0]=dat[4]&(dat[0]>>m);
dat[4]=dat[0];
scan(speed);
}
// FRAME 17

dat[0]=dat[0]&0xFFEF7BDE;
dat[1]=dat[1]&0xFFEFFFFE;
dat[2]=dat[2]&0xFFEFFFFE;
dat[3]=dat[3]&0xFFEFFFFE;
dat[4]=dat[4]&0xFFEF7BDE;
scan(speed);
// FRAME 18
dat[0]=0xFFEF7BDE;
dat[1]=dat[0];
dat[2]=dat[0];
dat[3]=dat[0];
dat[4]=dat[0];
scan(speed);
// FRAME 19-24
for(m=1;m<=4;m++){
dat[0]=0xFFEF7BDE;
dat[1]=0xFFEF7BDE;
dat[0]=~((~dat[1])< dat[1]=dat[0];
dat[2]=dat[0];
dat[3]=dat[0];
dat[4]=dat[0];
scan(speed);
}
}
}
//HIEU UNG KHOI
void effect7(char speed, char times)
{
for(m=0;m<=times;m++)
{
//frame 1
fill(0);
dat[4]=0xFFFFFF9C;
dat[3]=dat[4];
scan(speed);
//frame 2
fill(0);
dat[1]=0xFFFFCE7F;
dat[2]=dat[1];
scan(speed);
//frame 3
fill(0);
dat[2]=0xFFCE7FFF;
dat[3]=dat[2];
scan(speed);
//frame 4
fill(0);
dat[4]=0xFFF39FFF;
dat[3]=dat[4];
scan(speed);
//frame 5
fill(0);
dat[0]=0xFFFCE7FF;
dat[1]=dat[0];
scan(speed);
//frame 6
fill(0);
dat[4]=0xFFFFFE73;
dat[3]=dat[4];
scan(speed);
//frame 7
fill(0);
dat[1]=0xFFFE73FF;
dat[0]=dat[1];
scan(speed);
//frame 8
fill(0);
dat[2]=0xFFF39FFF;
dat[3]=dat[2];
scan(speed);

}
}
//SUI BOT
void effect8(char speed, long temp)
{
fill(0);
temp=0xAAAAAAAA;
for(n=0;n<=25;n++)
{
temp=~temp;
//dat[0]=rand()|rand();
//dat[0]=((dat[4]<<15)|rand())|temp;
for(m=1;m<=4;m++)
{
scan(speed);
dat[m]=dat[0];
}
}
}
//HIEU UNG TIA SANG
void effect9 (char speed, char times)
{
for(n=0;n<=times;n++)
{

fill(0);
for(m=1;m<=4;m++){
dat[0]=0xFFFFFFFE;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[1]=0xFFFFFFFD;
for(m=1;m<=4;m++){
scan(speed);
dat[1]=dat[1]&(~((~dat[1])<<5));
}
fill(0);
for(m=1;m<=4;m++)
{
dat[0]=0xFFFFFFEF;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[3]=0xFFFFFFEF;
for(m=1;m<=4;m++)
{
scan(speed);
dat[3]=dat[3]&(~((~dat[3])<<5));
}
fill(0);
for(m=1;m<=4;m++)
{
dat[0]=0xFFFFEFFF;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[4]=0xFFFFBFFF;
for(m=1;m<=4;m++)
{
scan(speed);
dat[4]=dat[4]&(~((~dat[4])>>1));
}
fill(0);
for(m=1;m<=4;m++)
{
dat[0]=0xFFFF7FFF;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[2]=0xFEFFFFFF;
for(m=1;m<=4;m++)
{
scan(speed);
dat[2]=dat[2]&(~((~dat[2])>>1));
}
fill(0);

for(m=1;m<=4;m++)
{
dat[0]=0xFEFFFFFF;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[0]=0xFFDFFFFF;
for(m=1;m<=4;m++)
{
scan(speed);
dat[0]=dat[0]&(~((~dat[0])>>5));
}
fill(0);
for(m=1;m<=4;m++)
{
dat[0]=0xFFFFFBFF;
scan(speed);
dat[m]=dat[0];
}
fill(0);
dat[2]=0xFF7FFFFF;
for(m=1;m<=4;m++)
{
scan(speed);
dat[2]=dat[2]&(~((~dat[2])>>5));
}
fill(0);
}
}
//==========khoi tao cac PORT==========///////////
void init_PORT(void)
{
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0xFF;

PORTD=0x00;
DDRD=0xFF;
}
void main(void)
{

init_PORT();


while (1)
{
// Place your code here
for(lan=0;lan<10000;lan++) //so lan lap
{
/// speed(toc do), times(so lan lap moi chuong trinh) thay doi do nguoi dung (nhanh hay cham....)
effect(40,"UNETI CHAO TAT CA CAC BAN ");//Hieu ung hien thi l loi nhan, (speed,msg)
effect(70);//Hieu ung hien thi l loi nhan, (speed,msg)
effect2(100);
effect4(150,3);//Hieu ung kim cuong (speed, times)
effect5(100,3);//Hieu ung trai tim (speed, times)
effect1(20,5);//Hieu ung duoi bat (speed, times)
effect3(30,2);//Hieu ung do hat (speed, times)
effect6(40,2);//Hieu ung quet khung (speed, times)
effect7(50,2);//Hieu ung khoi (speed, times)
effect8(10,2);//Hieu ung sui bot (speed, times)
effect9(15,2);//Hieu ung tia sang (speed, times)
}
};
}



*******************
** CHƯƠNG TRÌNH TỔNG HỢP ĐẦY ĐỦ TẠI LINKS SAU:http://www.mediafire.com/?rlc678meq3vth10
Về Đầu Trang Go down
star_honxu
Thành viên mới
Thành viên mới


Tổng số bài gửi : 9
Điểm : 9
Danh tiếng : 0
Ngày tham gia : 08/01/2011

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Sat Jan 08, 2011 9:19 pm

cháo bác sunset.bác có thể giúp em định hướng học về vi điều khiển được không
Về Đầu Trang Go down
trungkienksnb.tk
Thành viên tích cực
Thành viên tích cực


Tổng số bài gửi : 115
Điểm : 195
Danh tiếng : 15
Ngày tham gia : 06/12/2010
Tuổi : 28
Đến từ : Ninh Bình

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Tue Jan 11, 2011 1:35 pm

sunset huong dan di tu buoc dau tien di.?
Về Đầu Trang Go down
http://trungkienksnb.tk
star_honxu
Thành viên mới
Thành viên mới


Tổng số bài gửi : 9
Điểm : 9
Danh tiếng : 0
Ngày tham gia : 08/01/2011

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Tue Jan 11, 2011 9:18 pm

trungkien muon lam j tu dau nao.day la mot chuong trinh c viet cho atmega 16/16l
Về Đầu Trang Go down
trungkienksnb.tk
Thành viên tích cực
Thành viên tích cực


Tổng số bài gửi : 115
Điểm : 195
Danh tiếng : 15
Ngày tham gia : 06/12/2010
Tuổi : 28
Đến từ : Ninh Bình

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Tue Jan 11, 2011 9:25 pm

Các pro nên làm video rùi đưa lên a em xem chứ post thế này thì.........hi
Về Đầu Trang Go down
http://trungkienksnb.tk
Sunset_Pro
Thành viên chính thức
Thành viên chính thức


Tổng số bài gửi : 55
Điểm : 97
Danh tiếng : 11
Ngày tham gia : 25/12/2010
Đến từ : UNETI

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Wed Jan 12, 2011 2:34 pm

GIỚI THIỆU QUA VỀ AVR
- CẤU TRÚC BỘ NHỚ:
[You must be registered and logged in to see this image.]
* Ta thấy không gian bộ nhớ của bộ nhớ chương trình gồm 4Kx8 và có địa chỉ từ 0000H tới FFFH
* Bộ nhớ dữ liệu gồm hai phần: bộ nhớ RAM và bộ nhớ EEPROM trong đó không gian bộ nhớ RAM lại chia làm 3 phần: Các thanh ghi chức năng chung, các thanh ghi vào ra và cuối cùng là 512 byte bộ nhớ SRAM. Bộ nhớ EEPROM mặc dù cùng là một phần của bộ nhớ dữ liệu nhưng lại hoàn toàn đứng độc lập như một bộ nhớ độc lập và cũng được đánh địa chỉ riêng.
- BỘ NHỚ DỮ LIỆU
AVR có 32 thanh ghi chức năng chung và chúng được liên kết trực tiếp với ALU đây là điểm khác biệt của AVR và tạo cho nó một tốc độ xử lý cực cao. Các thanh ghi được đặt tên từ R0 tới R31. Và đặc biệt cặp 6 thanh ghi cuối (từ R6 tới R31) từng đôi một tao thành các thanh ghi 16 bit sử dụng làm con trỏ trỏ tới bộ nhớ chương trình và dữ liệu. Chúng lần lượt có tên là X, Y, Z.
[You must be registered and logged in to see this image.]
By sunset_sunset at 2011-01-11
- BỘ NHỚ CHƯƠNG TRÌNH
Bộ nhớ chương trình có địa chỉ từ 0000H tới 0010H được dành cho bảng véc tơ ngắt
[You must be registered and logged in to see this image.]
By sunset_sunset at 2011-01-11
[You must be registered and logged in to see this image.]
Về Đầu Trang Go down
Sunset_Pro
Thành viên chính thức
Thành viên chính thức


Tổng số bài gửi : 55
Điểm : 97
Danh tiếng : 11
Ngày tham gia : 25/12/2010
Đến từ : UNETI

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Wed Jan 12, 2011 3:08 pm

TIẾP THEO TÔI SẼ ĐI VÀO MỘT CHƯƠNG TRÌNH CỤ THỂ. MỤC ĐÍCH CỦA BÀI VIẾT NÀY LÀ TÔI MUỐN CÁC BẠN HIỂU QUA VỀ CẤU TRÚC CỦA AVR, NÊN VÌ VẬY TÔI SẼ LẬP TRÌNH BẰNG CHÍNH NGÔN NGỮ CỦA NÓ (TỨC ASM).
* LẬP TRÌNH CHO LED ĐƠN CHẠY TỪ GIỮA RA.
CODE:
[You must be registered and logged in to see this image.]
- GIẢI THÍCH CÁC DÒNG LỆNH.
INCLUDE"M16DEF.INC" : KHAI BÁO THƯ VIỆN, Ở ĐÂY LÀ ATMEGA 16. HOẶC "M32DEF.INC" LÀ ATMEGA 32,.V.V.V
.CSEG : BÁO CHO TRÌNH BIÊN DỊCH RẰNG PHẦN CODE SAU LÀ CHƯƠNG TRÌNH THỰC THI.
.ORG 0x0000 : SET VỊ TRÍ TRONG BỘ NHỚ ĐƯỢC TÁC ĐỘNG ĐẾN, XÁC ĐỊNH VỊ TRÍ CODE NGAY SAU SẼ NẰM Ở VỊ TRÍ 0x0000 VÀ DÒNG LỆNH TIẾP THEO SẼ LÀ RJMP BATDAU
KHOI_TAO: ;KHOI TAO CAC DIEU KIEN BAN DAU
LDI R16,HIGH(RAMEND)
out SPL,R16
LDI R17,LOW(RAMEND)
out SPH,R17

==> KHỞI TẠO NGĂN XẾP INIT STACK
LDI R16,$FF
OUT DDRB,R16 ;PORTB LA CONG RA

==>PORTB LA CONG RA
**** TRONG LẬP TRÌNH AVR DẠNG SỐ HEXA:0x00FF TA CÓ THỂ VIẾT NGẮN GỌN THÀNH $FF
* GIẢI THÍCH CÂU LỆNH
- LDI : LDI Rd,K :CHUYỂN GIÁ TRỊ TRỤC TIẾP VÀO THANH GHI Rd: Rd<-- K. SỐ CHU KỲ MÁY 1.
- OUT: OUT P,Rr : XUẤT DỮ LIỆU RA PORT.
LƯU Ý: TRONG LẬP TRÌNH CHO AVR TA KHÔNG THỂ XUẤT TRỰC TIẾP GIÁ TRỊ RA PORT MÀ PHẢI CHUYỂN QUA THANH GHI.
- MOV : MOV Rd,Rr : CHUYỂN DỮ LIỆU QUA LẠI GIỮA CÁC THANH GHI.

** CHƯƠNG TRÌNH HOÀN CHỈNH NHƯ SAU:
.INCLUDE"M16DEF.INC"
.CSEG
.ORG 0x0000
RJMP KHOI_TAO
.ORG 0x0020
KHOI_TAO: ;KHOI TAO CAC DIEU KIEN BAN DAU
LDI R16,HIGH(RAMEND)
out SPL,R16
LDI R17,LOW(RAMEND)
out SPH,R17
LDI R16,$FF
OUT DDRB,R16 ;PORTB LA CONG RA
MAIN:
LDI R16,0B00011000
OUT PORTB,R16
RCALL DELAY

LDI R16,0B00111100
OUT PORTB,R16
RCALL DELAY

LDI R16,0B01111110
OUT PORTB,R16
RCALL DELAY

LDI R16,0B11111111
OUT PORTB,R16
RCALL DELAY
RJMP MAIN

DELAY1S:

ldi R17, $09
LOOP0_1s: ldi R18, $BC
LOOP1_1s: ldi R19, $C4
LOOP2_1s: dec R19
brne LOOP2_1s
dec R18
brne LOOP1_1s
dec R17
brne LOOP0_1s

ret
- ĐỂ HIỂU RÕ HƠN VỀ CÁCH THIẾT LẠP ĐÂU RA ĐẦU VÀO CHO AVR THI XIN MỜI CÁC BẠN ĐỌC TÀI LIỆU:
[You must be registered and logged in to see this link.]
- PHẦN MỀM LẬP TRÌNH AVRSTUDIO:
[You must be registered and logged in to see this link.]
- TRANG THAM KHẢO HOCAVR.COM


Được sửa bởi sunset_sunset ngày Wed Jan 12, 2011 4:00 pm; sửa lần 1.
Về Đầu Trang Go down
Sunset_Pro
Thành viên chính thức
Thành viên chính thức


Tổng số bài gửi : 55
Điểm : 97
Danh tiếng : 11
Ngày tham gia : 25/12/2010
Đến từ : UNETI

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Wed Jan 12, 2011 3:48 pm

GIAO TIẾP LED 7 ĐOẠN: QUA IC GIẢI MÃ 7447 VÀ PHƯƠNG PHÁP QUÉT LED
- GIẢI THUẬT VƠI LED 7 ĐOẠN CŨNG GIỐNG VỚI GIẢI THUẬT CỦA 8051, NHƯNG XỬ LÝ SẼ PHỨC TẠP HƠN.VÌ VẬY NÊN KHI LẬP TRÌNH AVR, VIẾT BẰNG ASM VỚI NHỮNG CHƯƠNG TRÌNH PHỨC TẠP THÌ NHỮNG BẠN KHI MỚI HỌC SẼ CẢM THẤY CHÓNG NẢN.
* 7447 CÁC BẠN VÀO TRANG HOCAVR.COM THAM KHẢO
- CÁC CÂU LỆNH THAM KHẢO DATASHEET: [You must be registered and logged in to see this link.]
** PHƯƠNG PHÁP QUÉT LED 7 ĐOẠN.
;=========================================================================
.include "m16def.inc"

;=========================================================================
; KHAI BAO BIEN
;=========================================================================
; 32 Reg
;------------------------------------------------------------
.def X0 =R2 ;toan hang thu nhat(LSB)
.def X1 =R3
.def X2 =R4
.def X3 =R5 ;toan hang thu nhat(MSB)

.def Y0 =R6 ;toan hang thu hai(MSB)
.def Y1 =R7
.def Y2 =R8
.def Y3 =R9 ;toan hang thu hai(MSB)

.def Z0 =R10 ;ket qua(LSB)
.def Z1 =R11
.def Z2 =R12
.def Z3 =R13 ;ket qua(MSB)

.def PR0 =R14 ;so du cua phep chia(LSB)
.def PR1 =R15 ;so du cua phep chia(MSB)

.def temp =R16
.def dem =R17 ;bien dem vong lap cua cac phep chia

; SRAM
;------------------------------------------------------------;
; cac bien dung cho subr hextodec
;------------------------------------------------------------
.equ Digit0 =0x60 ;Digit0 la chu so hang don vi
.equ Digit1 =0x61 ;Digit1 la chu so hang chuc
.equ Digit2 =0x62 ;Digit2 la chu so hang tram
.equ Digit3 =0x63 ;Digit3 la chu so hang nghin
.equ Digit4 =0x64 ;Digit4 la chu so hang van
.org 0
rjmp start
;=========================================================================
; MAIN PROGRAM
;=========================================================================
.org 100 ;#s

start:

cli

ldi temp,low(RAMEND) ;init stack
out spl,temp
ldi temp,high(RAMEND)
out sph,temp

rcall Init_port ;init chieu cua cac port

rcall delay2ms
sei
here:

rjmp here
;=========================================================================
; SUB : test_quetled
; function :
; in :
;=========================================================================
test_quetled:
lds temp,digit0
rcall decto7seg
out portd,temp
ldi temp,0x02
out portb,temp
rcall delay2ms
ldi temp,0x00
out portb,temp
rcall delay2ms

lds temp,digit1
rcall decto7seg
out portd,temp
ldi temp,0x04
out portb,temp
rcall delay2ms
ldi temp,0x00
out portb,temp
rcall delay2ms

lds temp,digit2
rcall decto7seg
out portd,temp
ldi temp,0x08
out portb,temp
rcall delay2ms
ldi temp,0x00
out portb,temp
rcall delay2ms

ret
;=========================================================================
; SUB : test_led
;function :
;=========================================================================
test_led:
ldi temp,0x00 ; led on
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xc0 ; 0
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xc0 ; 0
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xf9 ; 1
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xa4 ; 2
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xb0 ; 3
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0x99 ; 4
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0x92 ; 5
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0x82 ; 6
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xf8 ; 7
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0x80 ; 8
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0x90 ; 9
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ldi temp,0xff ; led off
out portd,temp
ldi temp,0xff
out portb,temp
rcall delay1s

ret
;=========================================================================
; SUB :init_port
;function :khoi tao cac chieu cho cac Port

;=========================================================================
init_port:

ldi temp,0xff
out ddrd,temp

ldi temp,0xff
out ddrb,temp

ret

;=========================================================================
; CAC SUBR TINH TOAN CHO VDK ATMEGA 16
;=========================================================================
;add8u :8+8 bit unsigned
;sub8u :8-8 bit unsigned
;mul8u :8*8 bit unsigned
;div8u :8/8 bit unsigned
;add16u :16+16 bit unsigned
;sub16u :16-16 bit unsigned
;mul16u :16*16 bit unsigned
;div16u :16/16 bit unsigned
;add32u :32+32 bit unsigned
;sub32u :32-32 bit unsigned
;mul32u :32*32 bit unsigned
;div32u :32/32 bit unsigned

;=========================================================================
; subr :add8u
; Z(Z0) = X(X0) + Y(Y0); zov =1 neu tran
;=========================================================================
add8u:
push temp
clc
mov temp,X0
add temp,Y0 ;X0+Y0-->temp
mov Z0,temp ;temp -->Z0

brcc clear_zov_add8u ;skip neu carry =0
rcall set_zov ;set zov neu carry =1
rjmp end_add8u
clear_zov_add8u:
rcall clear_zov ;clear zov neu khong tran
end_add8u:
pop temp
ret

;=========================================================================
; subr :set_zov
; :set co zov
;=========================================================================
set_zov:
set ;set bit T
bld co_tinhtoan,zov ;T -->zov
ret

;=========================================================================
; subr :clear_zov
; :clear co zov
;=========================================================================
clear_zov:
clt ;clear bit T
bld co_tinhtoan,zov ;T -->zov
ret

;=========================================================================
;sub :sub8u
; :Z(Z0)=X(X0)-Y(Y0)
; :neu Y>X thi zov=1
;=========================================================================
sub8u:
push temp
clc
mov temp,X0 ;chuyen X0 vao temp
sub temp,Y0 ;X0 - Y0-->temp
mov Z0,temp ;Z0 =temp

brcs set_zov_sub8u ;nhay toi set_zov neu C=1
rcall clear_zov ;neu tru duoc thi clear zov
rjmp end_sub8u
set_zov_sub8u:
rcall set_zov ;neu Y>X thi zov =1
end_sub8u:
pop temp
ret

;=========================================================================
;sub :mul8u
;input :X0,Y0
;output :Z(Z1:Z0) =X0*Y0
;=========================================================================
mul8u:
mul X0,Y0
movw Z1:Z0,R1:R0
ret

;=========================================================================
;sub :div8u
;input :so bi chia =X0
; ;so chia =Y0
;output : thuong =Z0
; :zov =1 neu Y0 =0,..
;=========================================================================
div8u:
push temp
push R0 ;R0 chua so bi chia ban dau
push R1 ;R1 =thuong chay

mov temp,Y0
cpi temp,0
brne div8_ok ;neu Y0#0 thi thuc hien chia
set ;set T
bld co_tinhtoan,zov ;zov =1
rjmp end_div8
div8_ok:
mov R0,X0 ;chuyen X0 vao R0
clr X0 ;clear X0
clr R1 ;clear thuong chay
clr Z0 ;clear Z0
clr PR0 ;clear PR0
ldi dem,8 ;nap so dem
div8_loop:
clc ;clear carry
rol R0
rol X0
rcall sub8u

sbrc co_tinhtoan,zov ;skip neu zov=0
rjmp khong_tru_duoc ;zov=1
sec ;lam cho c=1(tru duoc)
mov X0,Z0 ;update so du
rjmp rol_R1
khong_tru_duoc:
clc ;lam cho c=0
rol_R1:
rol R1
dec dem ;giam dem
cpi dem,0 ;dem =0?
brne div8_loop ;nhay toi neu dem#0
mov Z0,R1 ;duoc so thuong
mov PR0,X0 ;duoc so du
clt ;clear T
bld co_tinhtoan,zov ;clear zov
end_div8:
pop R1
pop R0
pop temp
ret

;=========================================================================
;subroutine add16u
;input : X (X1:X0),Y:(Y1:Y0)
;output : Z (Z1:Z0),ZOV =1 neu tran so
;=========================================================================
add16u:
push temp

clc
mov temp,X0
add temp,Y0
mov Z0,temp

mov temp,X1
adc temp,Y1
mov Z1,temp

brcs set_zov_add16u ;set zov neu tran
rcall clear_zov ;clear zov neu khong tran
rjmp end_add16u
set_zov_add16u:
rcall set_zov
end_add16u:
pop temp
ret

;=========================================================================
;sub :sub16u
; :Z(Z1:Z0)=X(X1:X0)-Y(Y1:Y0)
; :neu Y>X thi zov=1
;=========================================================================
sub16u:
push temp
mov temp,X0 ;nap byte thap cua X vao temp
clc ;clear c
sbc temp,Y0 ;tru hai byte thap
mov Z0,temp ;cat ket qua vao Z0
mov temp,X1 ;nap byte cao cua X vao temp
sbc temp,Y1 ;tru hai byte cao
mov Z1,temp ;cat ket qua vao Z1

brcs set_zov_sub16u ;nhay toi set_zov neu C=1
clt ;clear T
bld co_tinhtoan,zov ;neu tru duoc thi clear zov
rjmp end_sub16u
set_zov_sub16u:
set ;set T
bld co_tinhtoan,zov
end_sub16u:
pop temp
ret

;=========================================================================
;sub :div16u
;input :X(X1:X0),Y(Y1:Y0)
;output :thuong =Z(Z1:Z0)
; :so du =PR(PR1:PR0)
; zov=1 neu Y=0,..
; r1:r0 store the high and low bytes of partial
; remainder(so bi chia ban dau). r5:r4 la thuong chay
;=========================================================================
div16u:
push temp
push R1 ;R1:R0 chua so bi chia ban dau
push R0
push R5 ;R5:R4 la so thuong chay
push R4

mov temp,Y1
or temp,Y0
cpi temp,0
brne div_ok ;neu Y#0 thi thuc hien chia
set ;set T
bld co_tinhtoan,zov ;zov =1
rjmp end_div16u
div_ok:
push X1
push X0
mov r1,X1 ;cat so bi chia vao R1:R0
mov r0,X0
clr X1 ;clear so bi chia chay
clr X0
clr r5 ;clear thuong chay
clr r4
ldi dem,16 ;set loop count
div16_loop:
clc ;clear carry
rol r0 ;shift the highest bit of the dividend...
rol r1 ;...into...
rol X0 ;...the lowest bit of the partial...
rol X1 ;...remainder
rcall sub16u

sbrc co_tinhtoan,zov ;skip neu zov=0(tru duoc)
rjmp clear_c ;khong tru duoc thi zov=1
sec ;C=1
mov X1,Z1 ;dua ket qua phep tru vao X1:X0
mov X0,Z0
rjmp div_1
clear_c:
clc ;C=0
div_1:
rol r4
rol r5
dec dem
cpi dem,0
brne div16_loop
mov Z1,r5
mov Z0,r4
mov PR0,X0
mov PR1,X1
pop X0
pop X1
clt ;clear T
bld co_tinhtoan,zov ;clear zov
end_div16u:
pop r4
pop r5
pop r0
pop r1
pop temp
ret
;=========================================================================
; subroutine mul16u
; nhan hai so 16 bit khong dau
; :Z(Z3:Z2:Z1:Z0) = X(X1:X0) * Y(Y1:Y0)
; input :X(X1: X0),Y(Y1: Y0)
; output :Z3, Z2, Z1, Z0
; :Z3 is the most significant byte.
; :Z0 is the least significant byte.
;rcall :BMW
;=========================================================================
mul16u:
push temp
push R20 ;R20 dung lam thanh ghi tam thoi

rcall mul8_16u ;X0*Y(Y1:Y0)
push Z2 ;push Z2_1
push Z1 ;push Z1_1
push Z0 ;push Z0_1

push X0
mov X0,X1 ;chuyen X1 vao X0
rcall mul8_16u ;X1*Y(Y1:Y0)
pop X0
mov R20,Z0 ;cat Z02 vao R20
pop Z0 ;Z0 =Z01
pop temp ;lay Z11 tu stack
add temp,R20 ;temp =Z11+Z02
mov R20,Z1 ;cat Z12 vao R20
mov Z1,temp ;Z1 =temp
pop temp ;temp =Z21
adc temp,R20 ;temp =Z21+Z12+Carry
mov R20,Z2 ;cat Z22 vao R20
mov Z2,temp ;duoc Z2
clr temp ;temp =0
adc temp,R20 ;temp =0+Z22+carry
mov Z3,temp ;duoc Z3

pop R20 ;phuc hoi lai R20
pop temp ;va temp tu stack
ret

;=========================================================================
; subroutine mul8_16u
;function :nhan mot so 8 bits voi mot so 16 bits
; :Z(Z2:Z1:Z0) = X0 * Y(Y1:Y0)
; input : X0, Y1,,Y0
; output : Z(Z2:Z1:Z0)
; :Z2 is the most significant byte.
; :Z0 is the least significant.
;=========================================================================
mul8_16u:
push temp
mul X0,Y0 ;ket qua-->R1:R0
mov Z0,R0 ;save result low byte
push R1 ;push result high byte
mul X0,Y1 ;ket qua-->R1:R0
pop temp ;pop temp to recall X0*Y0 high byte
add temp,R0 ;add X0*Y0 high byte and X0*Y1 low byte
mov Z1,temp ;save result
clr temp
adc temp,R1 ;temp = R1+carry
mov Z2,temp
pop temp ;phuc hoi lai temptu stack
ret
;=========================================================================
; subroutine div32u
;function :chia hai so 32 bits khong dau
; input :so bi chia =X(X3:X2:X1:X0)
; :so chia =Y(Y3:Y2:Y1:Y0)
; output :thuong =Z(Z3:Z2:Z1:Z0)
; :so du =PR(PR3:PR2:PR1:PR0)
; ZOV is set if Y=0, i.e., the result is out of range.
;rcall :sub32u
;=========================================================================
div32u:
push temp
push R31 ;R31:R30:R29:R28 chua so bi chia ban dau
push R30
push R29
push R28
push R27 ;R27:R26:R25:R24 =thuong chay
push R26
push R25
push R24

mov temp,Y1
or temp,Y0
cpi temp,0 ;Y=0?
brne div32u_ok ;neu Y#0 thi thuc hien chia
set ;set T
bld co_tinhtoan,zov ;zov =1 neu Y=0
rjmp end_div32u
div32u_ok:
clr Y3 ;Y3 =0
clr Y2 ;Y2 =0
push X3 ;cat so bi chia vao stack
push X2
push X1
push X0
mov R31,X3 ;cat so bi chia ban dau
mov R30,X2 ;vao so du ban dau
mov R29,X1
mov R28,X0

clr X3 ;clear partial remainder
clr X2
clr X1
clr X0
clr R27 ;clear thuong chay
clr R26
clr R26
clr R25
ldi dem,32 ;nap so dem
div32u_loop:
clc
rol R28 ;rol so du ban dau
rol R29
rol R30
rol R31
rol X0 ;rol X
rol X1
rol X2
rol X3
rcall sub32u

sbrc co_tinhtoan,zov ;skip neu zov=0
rjmp khong_tru_duoc_div32u
sec ;lam cho C=1
mov X3,Z3 ;update so du
mov X2,Z2
mov X1,Z1
mov X0,Z0
rjmp rol_thuongchay
khong_tru_duoc_div32u:
clc ;lam cho C=0
rol_thuongchay:
rol R24
rol R25
rol R26
rol R27

dec dem
cpi dem,0 ;dem =0?
brne div32u_loop
mov Z3,R27 ;cat thuong so
mov Z2,R26
mov Z1,R25
mov Z0,R24

mov PR1,X1 ;cat so du
mov PR0,X0

pop X0 ;lay lai so bi chia tu stack
pop X1
pop X2
pop X3

clt ;clear T
bld co_tinhtoan,zov ;divisor is not 0
end_div32u:
pop R24
pop R25
pop R26
pop R27
pop R28
pop R29
pop R30
pop R31
pop temp
ret
;=========================================================================
;subroutine sub32u
;function :tru hai so 32 bits khong dau
;input :so bi tru =X(X3:X2:X1:X0)
; :so tru =Y(Y3:Y2:Y1:Y0)
;output :Z(Z3:Z2:Z1:Z0) =X-Y.
; if Y > X then ZOV = 1
;=========================================================================
sub32u:
push temp ;cat temp vao stack

mov temp,X0 ;X0-->temp
clc ;clear carry
sbc temp,Y0 ;X0-Y0-0 -->temp
mov Z0,temp ;duoc Z0

mov temp,X1 ;X1-->temp
sbc temp,Y1 ;X1-Y1-c -->temp
mov Z1,temp ;duoc Z1

mov temp,X2 ;X2-->temp
sbc temp,Y2 ;X2-Y2-C -->temp
mov Z2,temp ;duoc Z2

mov temp,X3 ;X3-->temp
sbc temp,Y3 ;X3-Y3-C -->temp
mov Z3,temp ;duoc Z3

brcs set_zov_sub32u ;neu c=1 thi set zov
clt ;clear T
bld co_tinhtoan,zov ;zov=0
rjmp end_sub32u
set_zov_sub32u:
set ;set T
bld co_tinhtoan,zov ;set zov
end_sub32u:
pop temp ;lay lai temp tu stack
ret

;=========================================================================
; MODULE CONVERT
; sub : hectodec
; sub : decto7seg (A chung)
;=========================================================================
; subr :hextodec
;function :doi hai byte so hex ra 4 byte so dec
;input :X(X1:X0) o dang hex
;output :Digit3:Digit2:Digit1:Digit0
; Digit3 la chu so hang nghin
; Digit2 la chu so hang tram
; Digit1 la chu so hang chuc
; Digit0 la chu so hang don vi
;=========================================================================
hextodec: ;#htd_nd
push temp
push X0
push X1

ldi temp,high(500)
mov Y1,temp
ldi temp,low(500)
mov Y0,temp
rcall mul16u ;N*1000

mov X0,Z0
mov X1,Z1
mov X2,Z2
mov X3,Z3
ldi temp,low(1023)
mov Y0,temp
ldi temp,high(1023)
mov Y1,temp
ldi temp,0
mov Y2,temp
ldi temp,0
mov Y3,temp
rcall div32u ;(N*1000)/1023

mov X0,Z0
mov X1,Z1
ldi temp,10
mov Y0,temp
ldi temp,0
mov Y1,temp
rcall div16u
sts led0,PR0

mov X0,Z0
mov X1,Z1
ldi temp,10
mov Y0,temp
ldi temp,0
mov Y1,temp
rcall div16u
sts led1,PR0
sts led2,Z0


pop X1
pop X0
pop temp

ret
;=========================================================================
; subr :hextodec
;function :doi hai byte so hex ra 4 byte so dec
;input :X(X1:X0) o dang hex
;output :Digit3:Digit2:Digit1:Digit0
; Digit3 la chu so hang nghin
; Digit2 la chu so hang tram
; Digit1 la chu so hang chuc
; Digit0 la chu so hang don vi
;=========================================================================
hextodec_da: ;#htda
push temp
push X0
push X1

ldi temp,0x00
mov Y1,temp
ldi temp,100
mov Y0,temp
rcall mul16u ;N*100

mov X0,Z0
mov X1,Z1
mov X2,Z2
mov X3,Z3
ldi temp,low(1023)
mov Y0,temp
ldi temp,high(1023)
mov Y1,temp
ldi temp,0
mov Y2,temp
ldi temp,0
mov Y3,temp
rcall div32u ;(N*100)/1023

mov X0,Z0
ldi temp,10
mov Y0,temp
rcall div8u
sts led4,Z0
sts led3,PR0


pop X1
pop X0
pop temp

ret
;=========================================================================
; Sub : decto7seg
; in : temp dang dec
; out : temp dang 7seg

;=========================================================================
decto7seg: ;#dt7
cpi temp,0
brne num1
ldi temp,0xc0 ; 0
rjmp quit
num1:
cpi temp,1
brne num2
ldi temp,0xf9 ; 1
rjmp quit
num2:
cpi temp,2
brne num3
ldi temp,0xa4 ; 2
rjmp quit
num3:
cpi temp,3
brne num4
ldi temp,0xb0 ; 3
rjmp quit
num4:
cpi temp,4
brne num5
ldi temp,0x99 ; 4
rjmp quit
num5:
cpi temp,5
brne num6
ldi temp,0x92 ; 5
rjmp quit
num6:
cpi temp,6
brne num7
ldi temp,0x82 ; 6
rjmp quit
num7:
cpi temp,7
brne num8
ldi temp,0xf8 ; 7
rjmp quit
num8:
cpi temp,8
brne num9
ldi temp,0x80 ; 8
rjmp quit
num9:
cpi temp,9
brne quit
ldi temp,0x90 ; 9
quit:
nop
ret

;=========================================================================
; CAC SUBR DELAY

;=========================================================================
; subr :delay1s
;function :tao khoang tre 1s
;=========================================================================
delay1s:
push r19
ldi R17, $09
LOOP0_1s: ldi R18, $BC
LOOP1_1s: ldi R19, $C4
LOOP2_1s: dec R19
brne LOOP2_1s
dec R18
brne LOOP1_1s
dec R17
brne LOOP0_1s
pop r19
ret
;=========================================================================
; subr :delay2ms
;function :2000 cycles
; delaying 1998 cycles:
;=========================================================================
delay2ms:

; delaying 498 cycles:
ldi R17, $AA
WGLOOP0: dec R17

brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
ret
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 17 17
Về Đầu Trang Go down
ducnhanbka
Thành viên mới
Thành viên mới


Tổng số bài gửi : 22
Điểm : 20
Danh tiếng : -2
Ngày tham gia : 30/01/2013

Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Mon May 27, 2013 11:29 pm

cam on cac bac
Về Đầu Trang Go down
Sponsored content




Bài gửiTiêu đề: Re: HỌ VI ĐIỀU KHIỂN AVR   Today at 7:53 am

Về Đầu Trang Go down
 
HỌ VI ĐIỀU KHIỂN AVR
Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
 :: CÔNG NGHỆ KỸ THUẬT ĐIỆN TỬ ,TRUYỀN THÔNG :: VI XỬ LÝ- VI ĐIỀU KHIỂN :: Phần mềm và trao đổi kiến thức môn-
Chuyển đến