Như tiêu đề, mình đang thử điều khiển màn hình LCD 16x2 (LM016L). Mình chật vật với nó từ chiều qua tới giờ mà mãi không làm cái LCD kia hiện chữ đựoc, kính nhờ các cao thủ giúp đỡ. Mình không phải là dân chuyên điện tử, chỉ là muốn tìm hiểu và làm 1 số thứ mà mình thích nếu có sai sót gì thì mọi người chỉ bảo giúp mình với. Mình đính dưới đây 1 mạch vẽ bằng Proteus và 1 chưong trình keil c mà mình đang làm.
còn đây là chương trình C để mọi người tiện theo dõi
còn đây là chương trình C để mọi người tiện theo dõi
Code:
#include <REGX52.H> #define LCD_port P2 #define LCD_rs P2.0 #define LCD_en P2.1 #define LCD_D4 P2.4 #define LCD_D5 P2.5 #define LCD_D6 P2.6 #define LCD_D7 P2.7 #define MAX_INT 0xffff; /* void delay_us(unsigned); void delay_ms(char); */ void LCD_data (char); void LCD_cmd(unsigned char d); void LCD_reset(void); void LCD_init(void); int time=0; sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; sbit BF=P2^7; sbit LED=P2^3; void main(void) { P0=P1=P2=P3=0x00; LCD_init(); LCD_data('B'); //LED=1; while(1); } /* void delay_ms(char n) { int i=0, z=n*10; TMOD=0x02; // timer 0, mode 2 (8 bit) TL0=TH0=155; for(;i<=z;i++) { TR0=1; while(!TF0); TR0=0; TF0=0; } } void delay_us(unsigned n) { unsigned z=MAX_INT - n; TMOD=0x01; // timer 0, mode 1 16 bit TH0=((z>>8)&0xff); TL0=(z&0xff); TR0=1; // Start counter while(!TF0);// Wait TF0 gone 1 TR0=0; // Stop counter TF0=0; // Clear TF0 } */ LCD_busy() { /* RS=0; EN=BF=RW=1; */ LCD_port=0x86; while(BF) { EN=0; EN=1; } LCD_port=0; } void LCD_data (unsigned char dat) { LCD_port = (dat & 0xF0)|5; LCD_port=(dat & 0xF0); LCD_port = ((dat << 4)&0xf0)|5; LCD_port=((dat << 4)&0xf0); LCD_busy(); } void LCD_cmd(unsigned char d) { LCD_port=(d&0xf0)|4; LCD_port=(d&0xf0); LCD_port=((d<<4)&0xf0)|4; LCD_port=((d<<4)&0xf0); LCD_busy(); } void LCD_reset(void) { LCD_port=0xff; //Clear all state LCD_busy(); LCD_cmd(0x30); LCD_cmd(0x30); LCD_cmd(0x30); LCD_cmd(0x20); } void LCD_init(void) { LCD_reset(); LCD_cmd(0x28); //4bit mode 2 line 5x7 font LCD_cmd(0x28); LCD_cmd(0x0e); // No cursor no blink LCD_cmd(0x06); // Automatic increment no shift display //LCD_cmd(0x80); //Address DDRAM with 0 offset 80h }
Comment