打印

求助各位大侠,我要疯掉了。。。。

[复制链接]
1760|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
henry144|  楼主 | 2011-12-5 20:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 henry144 于 2011-12-15 08:34 编辑

LPC11系列控制ST7920的LCD,整了几天一直没有结果,时间来不及了,耗不下了,希望各位大侠帮忙,指出我的代码错误的地方。

单个命令能准确的显示,多个命令就不对了,多个数据也是乱码。。。。。小弟在此不胜感激啊!
/*******************************************************************************************************/
#include "LPC11xx.h"                                                    /* LPC11xx外设寄存器            */


/*********************************************************************************************************
  宏定义
*********************************************************************************************************/
#define uchar                        unsigned char
#define uint                        unsigned int
#define LCD_EN_H                LPC_GPIO2->DATA |=(1<<0)
#define LCD_EN_L                LPC_GPIO2->DATA &=~(1<<0)

#define LCD_PSB_H                LPC_GPIO2->DATA |=(1<<1)

#define LCD_RS_H                LPC_GPIO2->DATA |=(1<<3)
#define LCD_RS_L                LPC_GPIO2->DATA &=~(1<<3)

#define LCD_RW_H                LPC_GPIO3->DATA |=(1<<2)
#define LCD_RW_L                LPC_GPIO3->DATA &=~(1<<2)
/*********************************************************************************************************
  全局变量
*********************************************************************************************************/
const unsigned char dis1[]={"1234567890"};
const unsigned char dis2[]={"你好!"};
/*********************************************************************************************************
** Function name:       myDelay
** Descriptions:        软件延时
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Delay_1ms (uint n)
{
        uint i,j;
        j=0;
        i = 0;
    for(j=0;j<n;j++)
                for(i = 110;i > 0;i--);
       
}
void Delay_10us (uint n)
{
        uint i,j;
        j=0;
        i = 0;
    for(j=0;j<n;j++)
                for(i = 1;i > 0;i--);
       
}
/*********************************************************************************************************
** Function name:       GPIOInit
** Descriptions:        GPIO初始化
** input parameters:    无
** output parameters:   P2.4~P2.11对应D0~D7
** Returned value:      无
*********************************************************************************************************/
void GPIOInit( void )
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6);                              /* 初始化GPIO AHB时钟           */
    LPC_IOCON->PIO2_0 &= ~0x07;                                         /* 将P2.0-11初始化为GPIO功能    */
        LPC_IOCON->PIO2_1 &= ~0x07;
        LPC_IOCON->PIO2_3 &= ~0x07;
        LPC_IOCON->PIO2_4 &= ~0x07;
        LPC_IOCON->PIO2_5 &= ~0x07;
        LPC_IOCON->PIO2_6 &= ~0x07;
        LPC_IOCON->PIO2_7 &= ~0x07;
        LPC_IOCON->PIO2_8 &= ~0x07;
    LPC_IOCON->PIO2_9 &= ~0x07;
    LPC_IOCON->PIO2_10&= ~0x07;
    LPC_IOCON->PIO2_11&= ~0x07;
    LPC_GPIO2->DIR    |= 0xFFB ;                                     /* 将P2.0-11方向设置为输出      */
       
        LPC_IOCON->PIO3_2 &= ~0x07;
        LPC_GPIO3->DIR    |= (1 << 2);
}

void write_cmd(uchar cmd)
{
        uchar lcdtemp=0;
       
        LCD_RS_L;
        LCD_RW_H;
        LPC_GPIO2->DIR    &=~(0xFF<<4);
        do                                                                //判忙
        {
                LCD_EN_H;
                Delay_10us(1);
                lcdtemp |=LPC_GPIO2->DATA ;
                LCD_EN_L;
        }
        while(lcdtemp&(0x80<<4));
       
        LPC_GPIO2->DIR    |= 0xFFB ;
        LCD_RW_L;
        LPC_GPIO2->DATA =(cmd<< 4);
        LCD_EN_H;
        Delay_1ms(5);
        LCD_EN_L;
        }

void write_data(uchar data)
{
        uchar lcdtemp=0;
       
        LCD_RS_L;
        LCD_RW_H;
        LPC_GPIO2->DIR    &=~(0xFF<<4);
        do                                                        //判忙
        {
                LCD_EN_H;
                Delay_10us(1);
                lcdtemp=LPC_GPIO2->DATA ;
                LCD_EN_L;
        }
        while(lcdtemp&(0x80<<4));
       
        LPC_GPIO2->DIR    |= 0xFFB ;
        LCD_RS_H;
        LCD_RW_L;
        LPC_GPIO2->DATA =(data<< 4);
        LCD_EN_H;
        Delay_1ms(5);
        LCD_EN_L;
}

void lcd_init()
{
        LCD_PSB_H;                                        //并行口方式
        write_cmd(0x30);                        //基本指令操作
        Delay_1ms(5);
        write_cmd(0x02);                        //地址归位
        Delay_1ms(5);
        write_cmd(0x0C);                        //显示开,光标关
        Delay_1ms(5);
        write_cmd(0x01);                        //清除LCD的显示内容
        }
/*********************************************************************************************************
*********************************************************************************************************/
void main(void)
{
        uchar i;
       
        SystemInit();                                                   /* 初始化目标板,切勿删除       */
       
        GPIOInit();
        Delay_1ms(100);
        lcd_init();
  // while (1) {  
                //write_cmd(0x0E);
                write_cmd(0x90);
                i=0;
                while(dis1!='\0')
           {
                        write_data(dis1);
                        i++;
           }
         
        //}
}

/*********************************************************************************************************
  End Of File
*********************************************************************************************************/

相关帖子

沙发
henry144|  楼主 | 2011-12-16 07:49 | 只看该作者
问题找到了,P2.0~P2.3作为控制信号,P2.4~P2.11作为数据总线,当使用左移<<时,低位补0,使得控制信号失效,所以不对。。。。

使用特权

评论回复
板凳
Thunder_f| | 2011-12-16 13:48 | 只看该作者
还是自己对自己的问题比较舍得花时间

使用特权

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

本版积分规则

0

主题

2

帖子

1

粉丝