打印
[ZLG-ARM]

菜鸟求助:LPC2132控制1602显示

[复制链接]
2137|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzx520|  楼主 | 2008-8-25 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚学ARM,水平很菜,最近一直在调2132控制LCD1602显示。但是1602一直没字符显示。通上电,下载程序进去之后,一直就是显示一排黑点。着急!希望哪位大哥能指点!程序如下:(这个程序能在51板子上显示,我现在是把它移植到LPC2132上):
#include"LPC21XX.H"
#include"config.h"
#include"GPIOCTRL.H"
#include"LCD1602.H"
int  main(void)
{
        INT8U Text1[]="Nice to See You!";
        INT8U Text2[]="QQ:34088177";
        GPIOx_Set(P1_25,GPIO_Mode_OUTPUT);   //依次为DB0到DB7
        GPIOx_Set(P1_16,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_3,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_31,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_19,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_0,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_2,GPIO_Mode_OUTPUT); 
        GPIOx_Set(P0_1,GPIO_Mode_OUTPUT); 
        GPIOx_Set(LCD_RS,GPIO_Mode_OUTPUT); 
        GPIOx_Set(LCD_RW,GPIO_Mode_OUTPUT); 
        GPIOx_Set(LCD_EN,GPIO_Mode_OUTPUT);  
        LCD_Init();
    while(1)
   {
        LCD_SetPointion(0x00);        
        LCD_PrintString(Text1);
        LCD_SetPointion(0x40);
        LCD_PrintString(Text2);
   }
}

LCD1602.c文件程序如下:
#include"LPC21XX.H"
#include"config.h"
#include"LCD1602.h"
#include"GPIOCTRL.h"

static const  INT32U LCD_Data_IO[8]={P1_25,P1_16,P0_3,P0_31,P0_19,P0_0,P0_2,P0_1};

void Delayms(INT32U count)    //Delayms(400)约6ms,Delayms(1000)约为15ms
{
    INT32U  i,j;
    for(i=0;i<count;i++)
    for(j=0;j<200;j++);


void Delayus(INT8U i)
{
    while(i--);    
}

void LCD_IO_Data(INT8U  data)
{
    INT8U i;
    for(i=0;i<8;i++)
    {
        if((data>>i)&0x01)
            {
                GPIOx_PinSetHigh(LCD_Data_IO);
            }        
        else
            {
                GPIOx_PinSetLow(LCD_Data_IO);
            }
    }            
}

void Delay_Check(void)
{
    do
    {
        GPIOx_Set(LCD_BUSY,GPIO_Mode_INPUT);    /***把DB7设置为输入模式****/
        GPIOx_PinSetLow(LCD_RS);
        GPIOx_PinSetHigh(LCD_RW);  
        GPIOx_PinSetLow(LCD_EN);
        Delayus(10);
        GPIOx_PinSetHigh(LCD_EN);
    
    }
    while(IO0PIN&LCD_BUSY);    
    GPIOx_Set(LCD_BUSY,GPIO_Mode_OUTPUT);    
}


void  LCD_WriteCommand(INT8U cmd)
{
    GPIOx_PinSetLow(LCD_RS);
    GPIOx_PinSetLow(LCD_RW);
    GPIOx_PinSetLow(LCD_EN);
    Delay_Check();
    LCD_IO_Data(cmd);
    GPIOx_PinSetHigh(LCD_EN);
}

void LCD_Write_Data(INT8U data)
{    
    GPIOx_PinSetHigh(LCD_RS);
    GPIOx_PinSetLow(LCD_RW);    
    GPIOx_PinSetLow(LCD_EN);
    Delay_Check();
    LCD_IO_Data(data);
    GPIOx_PinSetHigh(LCD_EN);
}

void LCD_Init(void)
{
    Delayms(100);
    LCD_WriteCommand(0x38);    //设置显示模式:8位2行5x7点阵
    LCD_WriteCommand(0x08);    //****关闭显示********/
    LCD_WriteCommand(0x01);        //清屏并光标复位
    LCD_WriteCommand(0x06);        //文字不动,光标自动右移 
    LCD_WriteCommand(0x0f);        //显示器开、光标关、光标禁止闪烁

}

void LCD_SetPointion(INT8U x)
{
           LCD_WriteCommand(x|0x80);
}

void LCD_PrintChar(INT8U lcd_data)            //输出一个字符到LCD
{
          LCD_Write_Data(lcd_data);
}

void LCD_PrintString(INT8U *lcd_string)       //输出一个字符串到LCD
{
     INT8U i=0;
     while(lcd_string!='\0')
      {
           LCD_Write_Data(lcd_string);
           i++;
       } 

}    
其中类似这些函数是借鉴别人的,一直都是能用,没问题
GPIOx_Set(LCD_RS,GPIO_Mode_OUTPUT); 
GPIOx_PinSetHigh(LCD_Data_IO);    GPIOx_PinSetLow(LCD_Data_IO);
其中LCD1602的DB0到DB7和2132的IO脚不是按顺序来连着的, 所以我用了一个数组把这些IO脚放在一起,在用移位来进行写数据和命令。希望哪位大哥帮我看看,小弟感激不尽!    

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

12

帖子

0

粉丝