PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   driver cho LCD LMB162A (http://www.picvietnam.com/forum/showthread.php?t=5497)

tinhgiac_vp 11-12-2009 10:20 AM

driver cho LCD LMB162A
 
Em đang làm một mạch có giao tiếp LCD sử dụng chân RD5-RD7 cho RS,RW, EN, B0-B3 cho LCD DATA. Trước đây em sửa file lcd.c trong drivers và sử dụng OK nhưng do lâu không làm và file em sửa cũng bị mất nên giờ phải làm lại và kết quả là LCD không hiện được kí tự nào hết, chỉ thấy 2 hàng đầy những hình chữ nhật màu đen. Mong mọi người chỉ giúp.
đây là lcd driver (LCD162A):
[struct lcd_control_bit{
int unused:5;
BOOLEAN rs:1;
BOOLEAN rw:1;
BOOLEAN en:1;
}lcd_ctr;
#locate lcd_ctr = 0x08
struct lcd_data_byte{
int data:4;
int unused:4;
}lcd_data;
#locate lcd_data = 0x06
#ifndef lcd_type
#define lcd_type 2
#endif
#define lcd_line_two 0x40
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//BYTE lcdline;
BYTE lcd_read_byte() {
BYTE low,high;
set_tris_d(0x00);
set_tris_b(0xFF);//to read data from lcd
lcd_ctr.rw = 1;
delay_cycles(1);
lcd_ctr.en = 1;
delay_cycles(1);
high = lcd_data.data;
lcd_ctr.en = 0;
delay_cycles(1);
lcd_ctr.en = 1;
delay_us(1);
low = lcd_data.data;
lcd_ctr.en = 0;
set_tris_b(0xE1);
return( (high<<4) | low);
}
void lcd_send_nibble( BYTE n ) {
lcd_data.data = n;
delay_cycles(1);
lcd_ctr.en = 1;
delay_us(2);
lcd_ctr.en = 0;
}
void lcd_send_byte( BYTE address, BYTE n ) {

lcd_ctr.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd_ctr.rs = address;
delay_cycles(1);
lcd_ctr.rw = 0;
delay_cycles(1);
lcd_ctr.en = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
void lcd_init() {
BYTE i;
set_tris_b(0x00);
set_tris_d(0x00);
lcd_ctr.rs = 0;
lcd_ctr.rw = 0;
lcd_ctr.en = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd_ctr.rs=1;
value = lcd_read_byte();
lcd_ctr.rs=0;
return(value);
}
]
còn đây là chương trình chính
[#include <16F877A.h>
#device *=16 ADC = 8
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=20000000)
#include <LCD162A.c>
void main()
{
lcd_init();
delay_ms(50);
lcd_putc('\f');
delay_ms(100);
lcd_putc('h');
while(true);
}]
Không biết có phải nó không khởi tạo được không? và tại sao lại không khởi tạo được. Trước đây em dùng 18F4331 em khai báo lcd_ctr 0xF83 còn thằng lcd_dât là 0xF81


Múi giờ GMT. Hiện tại là 06:06 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam