PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 11-12-2009, 10:20 AM   #1
tinhgiac_vp
Đệ tử 2 túi
 
Tham gia ngày: Oct 2007
Bài gửi: 42
:
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
tinhgiac_vp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:56 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam