amobbs.com 阿莫电子技术论坛

标题: lcd1602 [打印本页]

作者: jyou    时间: 2009-10-12 09:15
标题: lcd1602
大家好,我是PSOC的初学者,在用1602的过程中,它不但不显示我所定义的字符,而且只亮第一行,第二行一点反应都没有,希望各位高手能帮小妹解答一下,谢谢了。
作者: 32446975    时间: 2009-10-12 09:51
1.先确定1602是正常的,换另一块1602或把1602装到另一正常的板子上。
2.检查程序。
作者: jyou    时间: 2009-10-12 15:58
亮第一行,说明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);
}
作者: jyou    时间: 2009-10-12 16:03
还有一个显示程序:
#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一点反应都没有,还是接电只亮第一行,而且没有任何显示,我想是不是应该进行初始化,并且重设地址?还望高手指点!
作者: 32446975    时间: 2009-10-13 08:52
1.不知道PROTEUS能不能仿真,没用过PSOC。
2.找个范例试一下。
作者: walter_wang    时间: 2009-10-13 09:10
你的LCD没有做好初始化,按照Data Sheet上的标准初始化流程需要先送3遍初始化命令,这3次不必读状态位,然后读状态位,再送一次初始化命令。
同时要注意时序,网上好多例程都无法正确驱动,还是要自己看手册
作者: jyou    时间: 2009-10-13 10:06
这是我刚加的初始化程序,帮我看看:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define LCD_1RS         (1<<P0[5]) //0x04   portD2       out
#define LCD_1E        (1<<P0[4]) //0x08   portD3       out
#define LCD_1DATA       ((1<<P0[0])|(1<<P0[1])|(1<<P0[2])|(1<<P0[3])) //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  
   }
作者: jyou    时间: 2009-10-13 10:07
编译是成功的,但还是以前的老样子,只亮第一行
作者: walter_wang    时间: 2009-10-13 11:09
驱动函数库可能有问题,我有一个以前用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
作者: jyou    时间: 2009-10-16 09:07
谢谢各位的协助,我的LCD搞好了!
作者: 32446975    时间: 2009-10-19 14:57
【9楼】 jyou :祝贺你LCD搞好了!  但是请把原因和排除方法说出来,这样才不失论坛互相帮助的目的。
作者: jyou    时间: 2009-10-20 11:29
我犯了个超低级的错误,把LCD给插错地方了,以前只是纸上谈兵,现刚开始动手,还望各位见谅!
作者: flybuick    时间: 2009-12-24 14:33
LZ 我们沟通过 嘿嘿




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4