lcd1602
大家好,我是PSOC的初学者,在用1602的过程中,它不但不显示我所定义的字符,而且只亮第一行,第二行一点反应都没有,希望各位高手能帮小妹解答一下,谢谢了。 1.先确定1602是正常的,换另一块1602或把1602装到另一正常的板子上。2.检查程序。 亮第一行,说明1602应该没有坏。我写的程序很简单,只是想先让1602亮,程序如下:
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main()
{
BYTE LCD_SOLID_BG;
LCD_1_Start();
LCD_1_InitBG(LCD_SOLID_BG);
LCD_1_DrawBG(0,0,16,72);
LCD_1_DrawBG(1,3,10,32);
} 还有一个显示程序:
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main()
{
char theStr[] = "PSoC LCD"; // Define RAM string
LCD__1_Start(); // Initialize LCD
LCD_1_Delay50uTimes(BYTE 2);
LCD__1_Position(0,5); // Place LCD cursor at row 0, col 5.
LCD_PrString(theStr); // Print "PSoC LCD" on the LCD
}
这两个程序编译都是正确的,但LCD一点反应都没有,还是接电只亮第一行,而且没有任何显示,我想是不是应该进行初始化,并且重设地址?还望高手指点! 1.不知道PROTEUS能不能仿真,没用过PSOC。
2.找个范例试一下。 你的LCD没有做好初始化,按照Data Sheet上的标准初始化流程需要先送3遍初始化命令,这3次不必读状态位,然后读状态位,再送一次初始化命令。
同时要注意时序,网上好多例程都无法正确驱动,还是要自己看手册 这是我刚加的初始化程序,帮我看看:
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define LCD_1RS (1<<P0) //0x04 portD2 out
#define LCD_1E (1<<P0) //0x08 portD3 out
#define LCD_1DATA ((1<<P0)|(1<<P0)|(1<<P0)|(1<<P0)) //0xf0 portD4/5/6/7 out
unsigned char x=1,y=4;
void _LCD_1_Init(void) //液晶初始化
{
LCD_1_Control(0x28);
LCD_1_Delay50uTimes(200);
LCD_1_Delay50uTimes(800);
LCD_1_Control(0x28);//4位显示
LCD_1_Control(0x0c);//显示开
LCD_1_Control(0x01);//清屏
LCD_1_Delay50uTimes(4000);
}
void _LCD_1_WriteData( unsigned char address )//写地址函数
{
unsigned char x,y;
while(1)
{if (x == 0) address = 0x80 + y;
else address = 0xc0 + y;
LCD_1_Control(address);
}
}
void main(void)
{
LCD_1_Start(); // Initialize LCD
LCD_1_Init();
LCD_1_Delay50uTimes(4000);
LCD_1_Position(x,y); // Place LCD cursor at row 0, col 5.
LCD_1_PrCString("PSoC LCD"); // Print "PSoC LCD" on the LCD
} 编译是成功的,但还是以前的老样子,只亮第一行 驱动函数库可能有问题,我有一个以前用51汇编写的测试代码,刚刚翻出来试了一下没有问题,第一行显示数字1~0
AT89S52,24M晶振
P1接8位数据,三个控制位是RS -》 P3.7, RW -》P3.6, E -》P3.5
--------------------------------------------------
P1 DATA 90H
P2 DATA 0A0H
P3 DATA 0B0H
LRS EQU P3.7
LRW EQU P3.6
LCE EQU P3.5
JMP prog0
ORG 40H
prog0: CLR LCE ;LCD初始化
CLR LRS
CLR LRW
MOV P1, #00111000B
SETB LCE
LCALL delay5m
CLR LCE
CLR LRS
CLR LRW
MOV P1, #00111000B
SETB LCE
LCALL delay5m
CLR LCE
CLR LRS
CLR LRW
MOV P1, #00111000B
SETB LCE
LCALL delay5m
LCALL chk ;设置工作方式,设置2遍以确认以
MOV P1, #00111000B
LCALL wcmd
LCALL chk
MOV P1,#00111000B
LCALL wcmd
;LCD初始化结束
LCALL chk ;设置显示状态
MOV P1, #00001111B
LCALL wcmd
LCALL chk ;设置输入方式
MOV P1, #00000110B
LCALL wcmd
LCALL chk
MOV P1, #00000010B ;显示指针归零
LCALL wcmd
LCALL chk
MOV P1, #00000001B ;清屏指令
LCALL wcmd
LCALL chk
MOV P1, #31H
LCALL wdtd
LCALL chk
MOV P1, #32H
LCALL wdtd
LCALL chk
MOV P1, #33H
LCALL wdtd
LCALL chk
MOV P1, #34H
LCALL wdtd
LCALL chk
MOV P1, #35H
LCALL wdtd
LCALL chk
MOV P1, #36H
LCALL wdtd
LCALL chk
MOV P1, #37H
LCALL wdtd
LCALL chk
MOV P1, #38H
LCALL wdtd
LCALL chk
MOV P1, #39H
LCALL wdtd
LCALL chk
MOV P1, #30H
LCALL wdtd
LCALL chk
MOV P1, #31H
LCALL wdtd
LCALL chk
MOV P1, #32H
LCALL wdtd
LCALL chk
MOV P1, #33H
LCALL wdtd
LCALL chk
MOV P1, #34H
LCALL wdtd
LCALL chk
MOV P1, #35H
LCALL wdtd
LCALL chk
MOV P1, #36H
LCALL wdtd
loop1: MOV P2, #0FEH
JMP loop1
delay5m: MOV R1, #10
l11: DJNZ R1, l11
RET
chk: MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR LRS
SETB LRW
CLR LCE
NOP
SETB LCE
JB P1.7, chk ;如果P1.7为高电平表示忙就循环等待
RET
wcmd: CLR LCE
CLR LRS
CLR LRW
SETB LCE
NOP
NOP
CLR LCE
RET
wdtd: CLR LCE
SETB LRS
CLR LRW
SETB LCE
NOP
NOP
CLR LCE
RET
END 谢谢各位的协助,我的LCD搞好了! 【9楼】 jyou :祝贺你LCD搞好了!但是请把原因和排除方法说出来,这样才不失论坛互相帮助的目的。 我犯了个超低级的错误,把LCD给插错地方了,以前只是纸上谈兵,现刚开始动手,还望各位见谅! LZ 我们沟通过 嘿嘿
页:
[1]