![]() |
|
|
|
|
#1 |
|
Đệ tử 9 túi
|
LCD_8bit interface, có kiểm tra cờ bận.
Bài cuối về LCD. Hoạt động theo 8bit interface, có hỏi cờ bận đảm bảo LCD luôn thực thi đúng lệnh yêu cầu ! Chú ý việc hỏi cờ bận là hết sức cần thiết!
Một điều nữa là Protues mô phỏng cho LCD hơi cà thoạt, nên dùng Picsimulator.Tốt nhất kiếm 1 chú LCD làm cho xom! Chương trình hiển thị dòng chữ "WONDERFUL PICVIETNAM!",tham khảo source code của CCS C. Code:
/*-----------------------------------------------------------------------------
* Author : nhh
* Date : 05/04/06
* Hardware : PIC16F877A
* Compiler : CCS C 3.249
* Description : Hien thi LCD
*=============================================================================*/
#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define E RD2
#define RS RD0
#define RW RD1
#byte lcd_data = 0x06 // Dia chi PORTB
/* Khai bao nguyen mau cac ham su dung */
byte lcd_read_byte();
void lcd_send_byte( byte address, byte n );
void lcd_init();
void lcd_gotoxy( byte x, byte y);
void lcd_putc( char c);
void lcd_refresh();
/* Doc mot byte tu LCD */
byte lcd_read_byte()
{
byte read_byte;
set_tris_B(0xFF); // PORTB = input
RW = 1;
delay_cycles(1);
E = 1;
delay_cycles(1);
read_byte = lcd_data;
E = 0;
set_tris_B(0x00); // PORTB = output
return(read_byte);
}
/* Goi 1byte den LCD */
void lcd_send_byte( byte address, byte n )
{
RS = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
RS = address;
delay_cycles(1);
RW = 0;
delay_cycles(1);
E = 0;
lcd_data = n;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
}
/* Khoi tao ban dau cho LCD */
void lcd_init()
{
byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};
byte i;
set_tris_B(0x00);
RS = 0;
RW = 0;
E = 0;
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_data = 3;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
}
lcd_data = 2;
delay_cycles(1);
E = 1;
delay_us(2);
E = 0;
delay_ms(5);
for(i=0;i<=3;++i)
{
lcd_send_byte(0,lcd_init_string[i]);
}
}
/* Nhay den vi tri (x,y) tren LCD,nhay nham y se bao loi */
void lcd_gotoxy( byte x, byte y)
{
byte address;
switch(y)
{
case 1: address=0;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
case 2: address=0x40;
address+=x-1;
lcd_send_byte(0,0x80|address);
break;
default :lcd_init();
lcd_putc("ERROR Y POSITION");
while(true); // Dung tai day!
}
}
/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_putc( char c)
{
lcd_send_byte(1,c);
}
/* Hien thi ki tu hoac chuoi ra LCD */
void lcd_refresh()
{
lcd_send_byte(0,1);
lcd_send_byte(0,6);
}
/* Ham main */
void main (void)
{
set_tris_B(0); //PORTB = output
set_tris_D(0); //PORTD = output
lcd_init();
lcd_gotoxy(5,1);
lcd_putc("WONDERFUL");
lcd_gotoxy(4,2);
lcd_putc("PICVIETNAM!");
}
![]() Nên gom các hàm trên thành 1 file lcd_8bit.c chẳng hạn, đến khi sử dụng chỉ việc include nó vào cho khỏe... ![]()
__________________
Ngày mai bắt đầu từ ngày hôm nay Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này: http://www.picvietnam.com/forum//showthread.php?t=1263 |
|
|
|
|
#2 | |
|
Đệ tử 3 túi
Tham gia ngày: Oct 2005
Bài gửi: 47
: |
Trích:
|
|
|
|
|
|
#3 | |
|
Trưởng lão PIC bang
|
Trích:
http://www.picvietnam.com/forum/showthread.php?t=330 Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
![]() |
|
|
Similar Threads
|
||||
| Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
| TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
| TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
| Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
| Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
| Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |