Hi!,chào các bạn,mong sớm được giúp đỡ!
Mình đang viết một chương trình đơn giản để truyền một kí tự từ PC xuông atmega16 và lấy kí tự đó hiển thị LCD và truyền ngược lại máy tính,nhưng không hiểu sao khi mình truyền chữ "a" thì máy tính nhận lại được lad 1 kí tự khác và trên LCD lại hiển thị kí tự khác
chương trình của mình như sau:
#include<avr\io.h>
#include<avr\interrupt.h>
#include<avr\delay.h>
#include<avr\signal.h>
#include<D:\HamLCD.h>
void UARTinit(void);
unsigned char USART_Receive(void);
unsigned char isCharAvailable();
unsigned char receivechar();
void sendChar(unsigned char data );
/************************************************** **********************/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>*/
void UARTinit(void)
{
DDRD &=~(1<<0);//rx dau vao,tx dau ra
DDRD |=(1<<1);
PORTD |=(1<<1);//keo tro trong
UCSRA=0x00;//u2x=0;
UCSRB=(1<<TXEN)|(1<<RXEN)|(0<<RXCIE)|(0<<TXCIE)|(0 <<UCSZ2);//cho phep truyen(1<<TXEN) va nhan(1<<RXEN)
UCSRC=(0<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0 <<USBS)|(3<<UCSZ0)|(0<<UCPOL);//che do hoat dong khong dong bo(0<UMSEL) ,khong dung che do chan le(0<<UPM0),mot bit stop(0<<USBS)
//8 bit du lieu(3<<UCSZ0)
UBRRH=0x00;
UBRRL=0x67;//che do khong dong bo,16MHZ,baud=9600.
}
unsigned char isCharAvailable()
{
//Kiem tra bit RXC cua thanh ghi dieu khien va trang thai UCSRA
//cho biet mot ki tu da duoc nhan xong hay chua
if(UCSRA & (0x80)) return 1;//neu bo dem nhan da day RXC=1 thi isChaavaiable=1;
else return 0; //neu bo dem nhan rong RXC=0 thi isCharavaiable=0;
}
unsigned char receiveChar()
{
//tra lai char trong thanh ghi UDR
return UDR; //receivechar=UDR
}
void sendChar(unsigned char data)
{
int i=0;
//de truyen du lieu voi UART dat du lieu vao trong thanh ghi UART
UDR=data;
//kiem tra xem ngat toan cuc da duoc cho phep chua
if (SREG & 0x80)
{
//doi cho den khi du lieu truyen xong hoac bo dem bi tran
while(!(UCSRA & 0x40) && (i<1000)) //trong khi TXC=0 va i<1000 thi tiep tuc tang i
{
i++;
}
}
else // doi cho den khi byte duoc truyen
while(!(UCSRA & 0x40))
;//trong khi TXC=0 thi khong lam gi
//xoa TXC tuc dua TXC len 1
UCSRA=UCSRA|0x40;
}
unsigned char USART_Receive(void)
{
// doi cho den khi du lieu duoc nhan
while(!(UCSRA & (1<<RXC)))
;
//nhan va tro lai nhan du lieu tu bo dem
return UDR;
}
vao bo dem,gui du kieu
void main(void)
{
unsigned char data;
//chay cac trinh khoi tao
UARTinit();
khoitaoLCD();
sei();
for(; ; )
{
//bat dau giao tiep voi may tinh;
//kiem tra de biet duoc co ki tu nao dang doi khong
if(isCharAvailable()==1)
{
//neu mot ki tu moi da duoc nhan ,hien thi no
data=receiveChar();
In_chuoi(0x80,"nhan vao*");//hien thi len LCD
In_kitu(0xC0,data);//hien thi len LCD
sendChar(data);
}
}
}
Mình đang viết một chương trình đơn giản để truyền một kí tự từ PC xuông atmega16 và lấy kí tự đó hiển thị LCD và truyền ngược lại máy tính,nhưng không hiểu sao khi mình truyền chữ "a" thì máy tính nhận lại được lad 1 kí tự khác và trên LCD lại hiển thị kí tự khác
chương trình của mình như sau:
#include<avr\io.h>
#include<avr\interrupt.h>
#include<avr\delay.h>
#include<avr\signal.h>
#include<D:\HamLCD.h>
void UARTinit(void);
unsigned char USART_Receive(void);
unsigned char isCharAvailable();
unsigned char receivechar();
void sendChar(unsigned char data );
/************************************************** **********************/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>*/
void UARTinit(void)
{
DDRD &=~(1<<0);//rx dau vao,tx dau ra
DDRD |=(1<<1);
PORTD |=(1<<1);//keo tro trong
UCSRA=0x00;//u2x=0;
UCSRB=(1<<TXEN)|(1<<RXEN)|(0<<RXCIE)|(0<<TXCIE)|(0 <<UCSZ2);//cho phep truyen(1<<TXEN) va nhan(1<<RXEN)
UCSRC=(0<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0 <<USBS)|(3<<UCSZ0)|(0<<UCPOL);//che do hoat dong khong dong bo(0<UMSEL) ,khong dung che do chan le(0<<UPM0),mot bit stop(0<<USBS)
//8 bit du lieu(3<<UCSZ0)
UBRRH=0x00;
UBRRL=0x67;//che do khong dong bo,16MHZ,baud=9600.
}
unsigned char isCharAvailable()
{
//Kiem tra bit RXC cua thanh ghi dieu khien va trang thai UCSRA
//cho biet mot ki tu da duoc nhan xong hay chua
if(UCSRA & (0x80)) return 1;//neu bo dem nhan da day RXC=1 thi isChaavaiable=1;
else return 0; //neu bo dem nhan rong RXC=0 thi isCharavaiable=0;
}
unsigned char receiveChar()
{
//tra lai char trong thanh ghi UDR
return UDR; //receivechar=UDR
}
void sendChar(unsigned char data)
{
int i=0;
//de truyen du lieu voi UART dat du lieu vao trong thanh ghi UART
UDR=data;
//kiem tra xem ngat toan cuc da duoc cho phep chua
if (SREG & 0x80)
{
//doi cho den khi du lieu truyen xong hoac bo dem bi tran
while(!(UCSRA & 0x40) && (i<1000)) //trong khi TXC=0 va i<1000 thi tiep tuc tang i
{
i++;
}
}
else // doi cho den khi byte duoc truyen
while(!(UCSRA & 0x40))
;//trong khi TXC=0 thi khong lam gi
//xoa TXC tuc dua TXC len 1
UCSRA=UCSRA|0x40;
}
unsigned char USART_Receive(void)
{
// doi cho den khi du lieu duoc nhan
while(!(UCSRA & (1<<RXC)))
;
//nhan va tro lai nhan du lieu tu bo dem
return UDR;
}
vao bo dem,gui du kieu
void main(void)
{
unsigned char data;
//chay cac trinh khoi tao
UARTinit();
khoitaoLCD();
sei();
for(; ; )
{
//bat dau giao tiep voi may tinh;
//kiem tra de biet duoc co ki tu nao dang doi khong
if(isCharAvailable()==1)
{
//neu mot ki tu moi da duoc nhan ,hien thi no
data=receiveChar();
In_chuoi(0x80,"nhan vao*");//hien thi len LCD
In_kitu(0xC0,data);//hien thi len LCD
sendChar(data);
}
}
}
Comment