网摘:
几天前搞了个LCM1602来玩,网上下载了别人的程序改巴改巴就写到M48里面,就遇到了初始化很不稳定的问题.
上网查看,发现很多人都反映如此,也有人提供了解决方法但并不完美.继续找资料,查了很多pdf资料,最后在
微雪电子公布的技术文档里找到了答案.
原来1602初始化成4位数据线之前必需先初始化成8位(此时命令发送方式是8位格式,但数据线只需接4位),然后再改到4位线宽,
这样才能稳定的进入4位模式.
正确的初始化过程是这样的:
1)上电
2)等待15ms以上
3)8位模式写命令0b0011xxxx (后面4位线不用接,所以是无效的)
4)等待4.1ms以上
5)同3)
6)等待100us以上
7)同3)
以上步骤中不可查询BF状态,只能用延时控制
从一下步骤开始可以查询BF状态确定模块是否忙
8)8位模式写命令0b0010xxxx 进入4位模式
以下操作都必需用4位模式格式进行
9)4位模式写命令0b0010NFxx NF为行数和字符高度设置位,之后行数和字符高不可重设
10)4位模式写命令0b00001000 关闭现实
11)4位模式写命令0b00000001 清屏
12)4位模式写命令0b000001(I/D)S 设置光标模式
初始化完成,可以用4位模式写字符
适用型号:ZXM2002B1, LMB402C, JHD824M10, J402B
sbit LCD_DB0=P1^4;
sbit LCD_DB1=P1^5;
sbit LCD_DB2=P1^6;
sbit LCD_DB3=P1^7;
sbit LCD_RS=P2^7;
sbit LCD_RW=P2^6; //只读数据而不写时可以直接接地
sbit LCD_E=P2^5;
/*-------------------------------------
;首次初始化时 要先运行此函数
;
/*************************************/
void LCD_init_first(void)
{
delay_ms(50);
LCD_write_command(0x30);
delay_ms(6);
LCD_write_command(0x30);
delay_ms(1);
LCD_write_command(0x30);
delay_ms(1);
LCD_write_command(0x02);
}
void LCD_init(void)
{
//LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x28);//设置4位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n10us(100); //延时清屏,延时函数,延时约n个10us
}
void main()
{
int i;
EA = 0;
init_serialcomm(); //初始化串口
EA = 1;
//send_string("lcm\r\n");
LCD_init_first();
LCD_init();
LCD_disp_str(0, 1, "test");
LCD_disp_char(0, 1, 'A');
delay_ms(10);
LCD_disp_char(3, 1, 'd');
delay_ms(10);
LCD_disp_char(4, 1, 'c');
while(1)
{
send_string("lcm\r\n");
LCD_disp_str(0, 1, "WDY Technology Co.,Ltd.");
LCD_disp_str(0, 2, "WDY Co.,Ltd.");
delay_ms(10);
}
}