240128液晶屏调试问题

2019-10-14 23:04发布

本帖最后由 anazel 于 2017-2-23 16:20 编辑

调了几天240*128液晶屏,T6963C控制器,一直没调出来,网上找了几个都不能用,请高人指教。
DB0-DB8接PB8-PB15
WR接PB5,RD接PB6,CD接PB7,CE接PA5,控制线全部接10K上拉电阻

240128.h

// PB8 - PB15接LCD数据口

#define  Dirout (GPIOB->CRH = 0X33333333 )        //推挽输出模式
#define  Dirin  (GPIOB->CRH = 0x88888888 )   // GPIOB->ODR &= 0x00ff //上拉输入模式


//#define  LCD_WriteData(x) {GPIOB->BSRR = x<<8 & 0xff00;GPIOB->BRR = ((~x)<<8) & 0xff00;}  //高8位的数据
#define  LCD_WriteData(a) ( GPIOB->ODR = ( (GPIOB->ODR&0X00FF)|((a|0x0000)<<8) ) )        //端口输出8位数据a a是一个无符号8位参数

#define  LCD_ReadData() (u8)(GPIOB->IDR>>8)

#define  WR             GPIO_Pin_5
#define  RD                     GPIO_Pin_6
#define  CD                     GPIO_Pin_7

#define  CE                     GPIO_Pin_5

#define  LCD_GPIO_DAT   GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15

#define    LCD_WR(x)   x ? GPIO_SetBits(GPIOB,WR):  GPIO_ResetBits(GPIOB,WR)
#define    LCD_RD(x)   x ? GPIO_SetBits(GPIOB,RD):  GPIO_ResetBits(GPIOB,RD)
#define    LCD_CD(x)   x ? GPIO_SetBits(GPIOB,CD):  GPIO_ResetBits(GPIOB,CD)
#define    LCD_CE(x)   x ? GPIO_SetBits(GPIOA,CE):  GPIO_ResetBits(GPIOA,CE)

240128.c

#define Delay_count 5


/************************************************************************************************
初始化硬件端口配置
************************************************************************************************/
void LCD240128_InitPort(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;        //定义结构体               
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);

        GPIO_InitStructure.GPIO_Pin  = LCD_GPIO_DAT;               
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         // 推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
        GPIO_Init(GPIOB , &GPIO_InitStructure);    //IO口初始化函数(使能上述配置)

        GPIO_InitStructure.GPIO_Pin  = WR|RD|CD;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB , &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin  = CE;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA , &GPIO_InitStructure);
}

//-------------------------------------------------------------------------------
//子程序名称:void lcdreset(void)
//功能:液晶显示控制器初始化
//图形方式初始化
//-------------------------------------------------------------------------------
void lcdreset(void)                     //液晶显示控制器初始化子程序
{   
        lcdwc(0x80);                        //OR MODE
        lcdwc(0x98);                        //图形模式开
       
        lcdwc3(0x42,0,0);                   //设置图形显示区首地址为0
        lcdwc3(0x43,30,0);                  //设置图形显示区宽度为30字节共240点
}

//-------------------------------------------------------------------------------
//子程序名称:void lcdfill(unsigned char d).
//功能:整屏显示d表示的字节数据.
//-------------------------------------------------------------------------------
void lcdfill(unsigned char d)           //整屏显示d代表的字节数据子程序
{   unsigned char i,j;
    lcdwc3(0x24,0,0);                   //设置内部RAM地址为0
    for(i=0;i<128;i++)    //128行
        for(j=0;j<30;j++)               //30个字节数据共240列
            lcdwd(d);                   //送图形数据
}



//-------------------------------------------------------------------------------
//子程序名称:voidlcdwaitidle(void).
//功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
//检测状态字,判断STA.0 STA.1是否准备好,为读写单个字做准备
//-------------------------------------------------------------------------------

void lcdwaitidle(void)                  //忙检测子程序
{   
        uint8_t sta;
  do
  {
                Dirout;
                LCD_WriteData(0xff);
               
                LCD_CD(1);
                LCD_RD(0);
               
                //自己添加的延时,要求大于150ns********************************************
                //nop12();
                delay_us(Delay_count);
               
                Dirin;
                sta = ( (LCD_ReadData())&0x03 );
                LCD_RD(1);
  }
  while(sta!=0x03);
}


//-------------------------------------------------------------------------------
//子程序名称:lcdwc(unsigned char c).
//功能:向液晶显示控制器送指令.
//-------------------------------------------------------------------------------
void lcdwc(u8 c)             //送指令子程序
{   
        lcdwaitidle();                      //检测液晶显示控制器是否空闲
        
        LCD_CD(1);        //CD=1 CE=0 WR=0
        LCD_CE(0);
        LCD_WR(0);
        
        Dirout;
        LCD_WriteData(c);  //写入控制指令
        
        delay_us(1);

        LCD_WR(1);                            //CD=1 CE=1 WR=1
        LCD_CE(1);
        delay_us(1);
        LCD_CD(0);
        delay_us(Delay_count);
}


//-------------------------------------------------------------------------------
//子程序名称:lcdwc2(unsigned char c,unsigned char d).
//功能:向液晶显示控制器送2字节指令.
//-------------------------------------------------------------------------------
void lcdwc2(u8 c,u8 d) //送2字节指令子程序
{   lcdwdata(d);                        //送指令参数
    lcdwc(c);                           //送指令码
}
//-------------------------------------------------------------------------------
//子程序名称:lcdwc3(unsigned char c,unsigned char d1,unsigned char d2).
//功能:向液晶显示控制器送3字节指令.
//-------------------------------------------------------------------------------
void lcdwc3(unsigned char c,unsigned char d1,unsigned char d2) //送3字节指令子程序
{   
        lcdwdata(d1);                        //送指令参数1
        lcdwdata(d2);                        //送指令参数2
        lcdwc(c);                            //送指令码
}


//-------------------------------------------------------------------------------
//子程序名称:void lcdwdata(u8 d).
//功能:向液晶显示控制器送数据.
//-------------------------------------------------------------------------------

void lcdwdata(unsigned char d)          //写数据子程序
{   
        lcdwaitidle();                      //检测液晶显示控制器是否空闲
        
        LCD_CD(0);   //CD = 0;CE = 0;WR = 0;
        LCD_CE(0);
        LCD_WR(0);

        
        //设置数据口为输出方向
  //读取数据( 假设这里用PB8 - PB15 )
        Dirout;
        LCD_WriteData(d);

        Delay(1);
        
        LCD_WR(1);
        LCD_CE(1);

        Delay(1);
        LCD_CD(1);
        delay_us(Delay_count);
}




main.c

int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //开启AFIO时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭JTAG口,使PB3,PB4,PA15这几个IO作为普通IO使用

        
        delay_init();                         //延时函数初始化
        
        delay_ms(500);

        LCD240128_InitPort();
        
        delay_ms(100);
        
        LCD_WR(1);
        LCD_RD(1);
        LCD_CD(1);
        LCD_CE(0);
        
        lcdreset();                     //初始化液晶显示控制器
        Reverse_Display=0;                 //反显关闭
        
        
        lcdfill(0);
        
  while(1);
        
}


液晶屏a.jpg


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
操作系统
1楼-- · 2019-10-15 01:24
是不是扫描方式不对.
anazel
2楼-- · 2019-10-15 02:15
操作系统 发表于 2017-2-23 16:37
是不是扫描方式不对.

程序中也没有显示字符,只是个清屏函数。这个函数应该不会错,是在51上用的。
操作系统
3楼-- · 2019-10-15 07:08
anazel 发表于 2017-2-23 17:17
程序中也没有显示字符,只是个清屏函数。这个函数应该不会错,是在51上用的。

看你发过来的图片,是没有清除干净.那就是地址不对吧.看一下DATASHEET.屏的起始地址,一行有多少个点.有些屏的实际点数比128还会多一到两个点呢.多看资料.
正点原子
4楼-- · 2019-10-15 12:58
帮顶
anazel
5楼-- · 2019-10-15 15:35
 精彩回答 2  元偷偷看……
anazel
6楼-- · 2019-10-15 20:53
关键是写指令函数跟写数据函数是不是正确。

一周热门 更多>