mong các bạn giúp đỡ. Mình đang làm mạch hiển thị chữ lên LCD, dùng Atmega8, viết bằng AVRstudio, mình đã mô phỏng trên Proteus mạch chạy tốt. Có điều khi nạp chương trình cho mạch thật chạy thì LCD chỉ hiện dòng đầu tiên với 16 ô đen thui mà không có gì khác. Chân điều chỉnh độ tương phản của LCD mình nối đất. LCD mình viết cho nó hoạt động ở chế độ 4bit. Mạch nạp mình dùng STK500 nhưng những thiết lập trước khi nạp cho chip atmega8 mình cóp trên mạng mà chưa hiểu bản chất, có thể nguyên nhân ở đây. Mình rất mong nhận được sự giúp đỡ của các bạn. Cảm ơn các bạn rất nhiều.!
một số hàm mình viết trong c/trình này liên quan tới LCD:
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <avr/interrupt.h>
#define setbit(sfr,bit) sfr|=_BV(bit)
#define clrbit(sfr,bit) sfr&=~(_BV(bit))
#define CTRL PORTB
#define DATA_O PORTB
#define DDR_DATA DDRB
#define LATCH_DATA {setbit(CTRL,EN); clrbit(CTRL,EN);}
void wait_LCD(){
_delay_ms(5); // không dùng cách đọc cờ bận của LCD
}
//============================
void Write2Nib(uint8_t chr){
uint8_t HNib,LNib,data;
wait_LCD();
data=DATA_O & 0x0F;
HNib=chr & 0xF0;
LNib=(chr<<4) & 0xF0;
DATA_O =(HNib|data);
LATCH_DATA;
DATA_O =(LNib|data);
LATCH_DATA; // chot data
}
//===========================
void khoi_tao_LCD(){
DDR_DATA = 0x3F; // khai bao chieu I, O cho cac PIN trên PORT B
clrbit(CTRL,RS);
setbit(CTRL,5);
LATCH_DATA;
Write2Nib(0x28);
Write2Nib(0x0c);
Write2Nib(0x06);
}
một số hàm mình viết trong c/trình này liên quan tới LCD:
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <avr/interrupt.h>
#define setbit(sfr,bit) sfr|=_BV(bit)
#define clrbit(sfr,bit) sfr&=~(_BV(bit))
#define CTRL PORTB
#define DATA_O PORTB
#define DDR_DATA DDRB
#define LATCH_DATA {setbit(CTRL,EN); clrbit(CTRL,EN);}
void wait_LCD(){
_delay_ms(5); // không dùng cách đọc cờ bận của LCD
}
//============================
void Write2Nib(uint8_t chr){
uint8_t HNib,LNib,data;
wait_LCD();
data=DATA_O & 0x0F;
HNib=chr & 0xF0;
LNib=(chr<<4) & 0xF0;
DATA_O =(HNib|data);
LATCH_DATA;
DATA_O =(LNib|data);
LATCH_DATA; // chot data
}
//===========================
void khoi_tao_LCD(){
DDR_DATA = 0x3F; // khai bao chieu I, O cho cac PIN trên PORT B
clrbit(CTRL,RS);
setbit(CTRL,5);
LATCH_DATA;
Write2Nib(0x28);
Write2Nib(0x0c);
Write2Nib(0x06);
}
Comment