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
}
, hay do mình không biết cách hỏi thế?

Comment