Giao tiếp LCD với AVR
Dưới đây là giao diện chế độ 8 bit của màn hình LCD với bộ vi điều khiển AVR.
1) Giao diện LCD với Avr Atmega8
2) Giao diện LCD với Atmega32
Để kết nối LCD với Avr cần có bus dữ liệu 8 bit. Ngoài ra, chúng ta cần bus điều khiển 2 bit cho chế độ chỉ ghi hoặc bus điều khiển 3 bit cho chế độ Đọc cộng với ghi. Kết nối chân 1 của LCD với GND, chân 2 đến Vcc . Kết nối biến trở (2 đến 5 K Ohm) trên toàn bộ nguồn cung cấp và GND. Kết nối chân giữa của biến trở với chân 3 của LCD. Nếu muốn làm sáng đèn sau, nối chân LED- với GND và chân LED+ của màn hình LCD với nguồn Vcc bằng điện trở. Hình dưới đây là hai sơ đồ mạch!
Giao diện LCD với Avr Atmega8
Giao diện LCD với Atmega32
Trong mã C , chúng được khai báo dưới các hàm 'LCD ()' và 'LCDcmd ()'
Để ngăn sự cố phải cho phép LCD hoàn thành việc thực hiện từng thao tác. Ở đây chúng ta sẽ sử dụng các vòng lặp trì hoãn có sẵn từ Thư viện studio AVR. Mỗi lệnh hoặc dữ liệu mất ít nhất 40uS để được thực thi. Vòng chờ dài nhất là 1,65mS.
Chương trình
#include
#include
#define DPORT PORTB // Định nghĩa Port
#define DPDDR DDRB
#define CPORT PORTD //Định nghĩa tín hiệu Port
#define CPDDR DDRD
#define RS PD6 //Khai báo chân Reset
#define EN PD7 //Khai báo chân Enable
#define LCDClear 0x01 //Xóa màn hình LCD
#define LCD8bit 0x38 //Khởi tạo LCD chế độ 8 bit
#define LCDCursorOn 0x0f //Cho phép con trỏ
#define LCDSeek00 0x80 //Tìm con trỏ
void LCD(char ch);
void LCDcmd(void);
void LCDInitialize(void);
int main()
{ DPDDR=0xff;
CPDDR=0xf0;
_delay_ms(2000);
LCDInitialize();
LCD(‘C’);
LCD(‘i’);
LCD(‘r’);
LCD(‘c’);
LCD(‘u’);
LCD(‘i’);
LCD(‘t’);
LCD(‘s’);
LCD(‘ ’);
LCD(‘T’);
LCD(‘o’);
LCD(‘d’);
LCD(‘a’);
LCD(‘y’);
return 0;
}
void LCD(char ch)
{ DPORT=ch; // Gán giá trị vào các Port
CPORT=(1< _delay_us(10); CPORT=(1< _delay_us(45); } void LCDcmd(char ch) { DPORT=ch; CPORT=(0< _delay_ms(10); CPORT=(0< _delay_ms(45); if(ch==0x01||ch==0x02) // Nếu các lệnh là LCD Clear hoặc LCDSeek00 thì trì hoãn 2mS _delay_ms(2); } void LCDInitialize(void) { LCDcmd(LCD8bit); LCDcmd(LCDCursorOn); LCDcmd(LCDClear); LCDcmd(LCDSeek00); } Phía trên chỉ là chương trình cơ bản, sau đây sẽ là chương trình thực hiện thêm một số chức năng tốt hơn trong LCD với AVR là in ra màn hình LCD. #include #include #define DPORT PORTB #define DPDDR DDRB #define CPORT PORTD #define CPDDR DDRD #define RS PD6 #define EN PD7 #define LCDClear 0x01 #define LCD8bit 0x38 #define LCDCursorOn 0x0f #define LCDSeek00 0x80 void LCD(char ch); void LCDcmd(void); void LCDInitialize(void); void printStringLCD(char *str); int printIntLCD(unsigned int i); int main() { DPDDR=0xff; CPDDR=0xf0; _delay_ms(500); LCDInitialize(); printStringLCD(“Circuits Today”); _delay_ms(5000); LCDcmd(LCDClear); prinStringLCD(“Print an Integer”); LCDcmd(0xc0); printIntLCD(990); return 0; } void LCD(char ch) { DPORT=ch; CPORT=(1< _delay_us(10); CPORT=(1< _delay_us(45); } void LCDcmd(unsigned char ch) { DPORT=ch; CPORT=(0< _delay_us(10); CPORT=(0< _delay_us(45); if(ch==0x01||ch==0x02) _delay_ms(2); } void LCDInitialize(void) { LCDcmd(LCD8bit); LCDcmd(LCDCursorOn); LCDcmd(LCDClear); LCDcmd(LCDSeek00); } void printStringLCD(char *str) { int i=0; while(str[i]!=’ ′) { DPORT=str[i]; LCD(ch); i++; } } int printIntLCD(unsigned int i) { static int a; a=0; if(i!=0) { printIntLCD(i/10); LCD(‘0’+i%10); a++; } return a; } Nguồn tham khảo: http://www.circuitstoday.com/lcd-interfacing-with-avr
Hotline: 0979 466 469