[求助] 使用STM32控制T6963C液晶没有显示

grieflw   2012-3-25 22:50 楼主

小弟这几天使用STM32F103的片子控制T6963C  24064 液晶,但是调试了好几天都没有任何显示,液晶屏在别人的程序上试过,没有问题,程序编译也很正常,控制端口输出电平读取电平也正常,估计是在对T6963C的控制上出现问题,小弟对液晶屏控制认识不多,请各位兄台指教一二,程序如下:

/////////////////主函数//////////////////////////////////////////////////////////////////

#include "Includes.h"
int main(void)
{
 InitSystem();
 GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1));

  LCD_RST_ABLE;
  delay_ms(1);
  LCD_RST_UNABLE;
  LCD_FONT_0;

     LCDInit();
 ClearRAM();

   while(1)
    {
      WriteRAM(1,1);  
 }
}

/////////////////STM32系统初始化设置文件///////////////////////////////////////////////////
#include "Includes.h"

void InitSystem(void)
{
 RCC_Configuration();
 GPIO_Configuration(); 
}

void RCC_Configuration(void)
{
 RCC_DeInit();     //RCC系统复位
   RCC_HSICmd(ENABLE);     //使用内部高速晶振8M
 
 RCC_HCLKConfig(RCC_SYSCLK_Div1);   //设置高速总线时钟 HCLK = SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1);   //配置低速总线时钟2 PCLK2 = HCLK
 RCC_PCLK1Config(RCC_HCLK_Div2);   //配置低速总线时钟1 PCLK1 = HCLK/2
 
   /* Flash 2 wait state */
   FLASH_SetLatency(FLASH_Latency_2);  //令FLASH处于等待状态
   /* Enable Prefetch Buffer */
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
 
   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);  //使用锁相环将外部晶振9倍频到72MHz
 RCC_PLLCmd(ENABLE);     //使能锁相环     

 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待锁相环输出稳定
   {
   }
 
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //选择锁相环输出作为系统时钟

   while(RCC_GetSYSCLKSource() != 0x08)   //等待锁相环时钟作为系统时钟正常运行
   {
   }
  
 /* Enable peripheral clocks --------------------------------------------------*/
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOE, ENABLE);
}

void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 /*配置PE*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_1 |      GPIO_Pin_0 ;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOE, &GPIO_InitStructure);

 /*配置PD*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3 |       GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_0 ;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_OD;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/////////////////LCD控制函数//////////////////////////////////////////////////////////////////
#include "Includes.h"

unsigned char hz[] = {0x08,0x02,0x08,0x82,0x08,0x92,0x08,0x92,0x7e,0x92,0x08,0x92, 0x08,0x92,0x08,0x92,0x08,0x92,0x08,0x92,0x0e,0x92,0x78,0x92,0x21,0x12,0x01,0x02,0x02,0x02,0x00,0x02};

//检查状态字的状态为0或1
void CheckBusy(unsigned char status)
{
   unsigned char data=0;
 
 GPIO_Write(GPIOD,0x00ff);
   LCD_CE_ABLE;  
 LCD_CD_CMD;  
 LCD_WR_UNABLE;
 LCD_RD_ABLE;
  
   while((data&status) != status)  
 {
  data = (unsigned char)(GPIO_ReadInputData(GPIOD));
 } 
 
  LCD_RD_UNABLE;
 LCD_WR_UNABLE;
 LCD_CE_UNABLE;  
}

void WriteData(unsigned char data) 

 CheckBusy(0x03);
 GPIO_Write(GPIOD,(unsigned int)data);

 LCD_CD_DATA;  
 LCD_RD_UNABLE;
 LCD_CE_ABLE;
 LCD_WR_ABLE;
 delay_us(1);
  
 LCD_WR_UNABLE;
 LCD_RD_UNABLE;
 LCD_CE_UNABLE;
}

//无参数写指令函数
void WriteCmd0(unsigned char cmd)
{
 CheckBusy(0x03);
 WriteData(cmd);
    
 LCD_CD_CMD; 
 LCD_RD_UNABLE; 
 LCD_WR_ABLE;
 LCD_CE_ABLE;
   delay_us(1);
   
 LCD_WR_UNABLE;
 LCD_RD_UNABLE;
 LCD_CE_UNABLE;
}

//单参数写指令函数
void WriteCmd1(unsigned char data,unsigned char cmd)
{
 WriteData(data); delay_us(1);
 WriteCmd0(cmd);  delay_us(1);
}
//双参数写指令函数
void WriteCmd2(unsigned char data0,unsigned char data1,unsigned char cmd)
{
 WriteData(data0);
 WriteData(data1);
 WriteCmd0(cmd);
}

//液晶初始化
void LCDInit()
{
  WriteCmd2(0x00,0x00,0x42); /*图形首址*/
 WriteCmd2(0x1E,0x00,0x43); /*图形区域*/
 
  WriteCmd0(0xa7); //设置光标形状
 WriteCmd0(0x80); //设置显示方式
 WriteCmd0(0x98); //设置显示开关

 ClearRAM();
}

void WriteRAM(unsigned char lin,unsigned char column)
{
 unsigned char i;
 unsigned int StartAddr;

 StartAddr=lin*30 + column; //定位起始行

 for(i=0;i<16;i++)
 {
 WriteCmd2( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
 WriteCmd1( hz[i*2], 0xc0); //左半部 地址加一
 WriteCmd1( hz[i*2+1], 0xc4); //右半部 字模地址加一

 StartAddr=StartAddr + 0x1E;
 }
}

void ClearRAM(void)
{
  unsigned int i;   // 清显示 RAM 区 0000h--2000h (8k)
  WriteCmd2(0x00,0x00,0x24); //设置指针地址0000H
  WriteCmd0(0xb0); //设置自动写状态
  for(i=0x00;i<0x2000;i++) WriteData(0x00); // data=0;
  WriteCmd0(0xb2); // 自动写结束

}

void delay_us(unsigned long n)
{
  unsigned long j;
 
  while(n--)
  {
    j=8;
    while(j--);
  }
}

void delay_ms(unsigned long n)
{
  while(n--)
   delay_us(1100);   //1ms 
}


/////////////////include.h文件///////////////////////////////////////////////////////////////
#define LCD_WR_ABLE    GPIO_WriteBit(GPIOE, GPIO_Pin_0, (BitAction)(0)) //LCD写操作 0电平有效
#define LCD_WR_UNABLE  GPIO_WriteBit(GPIOE, GPIO_Pin_0, (BitAction)(1))

#define LCD_RD_ABLE    GPIO_WriteBit(GPIOE, GPIO_Pin_1, (BitAction)(0)) //LCD读操作 0电平有效
#define LCD_RD_UNABLE  GPIO_WriteBit(GPIOE, GPIO_Pin_1, (BitAction)(1))
    
#define LCD_CE_ABLE    GPIO_WriteBit(GPIOE, GPIO_Pin_2, (BitAction)(0)) //LCD片选信号 0电平有效
#define LCD_CE_UNABLE  GPIO_WriteBit(GPIOE, GPIO_Pin_2, (BitAction)(1)) //1电平无效

#define LCD_CD_DATA    GPIO_WriteBit(GPIOE, GPIO_Pin_3, (BitAction)(0)) //LCD数据通道选择
#define LCD_CD_CMD GPIO_WriteBit(GPIOE, GPIO_Pin_3, (BitAction)(1)) //LCD指令通道选择

#define LCD_RST_ABLE   GPIO_WriteBit(GPIOE, GPIO_Pin_4, (BitAction)(0)) //LCD复位操作 0电平有效
#define LCD_RST_UNABLE GPIO_WriteBit(GPIOE, GPIO_Pin_4, (BitAction)(1))

#define LCD_FONT_0 GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(0))
#define LCD_FONT_1 GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1)) 
/*----------------------------------------------------------------------------------*/
void WriteData(unsigned char data);
unsigned char ReadDataPort(void);
void CheckBusy(unsigned char status);
void WriteCmd0(unsigned char cmd);
void WriteCmd1(unsigned char data,unsigned char cmd);
void WriteCmd2(unsigned char data0,unsigned char data1,unsigned char cmd);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void InitSystem(void);
void delay_us(unsigned long);
void delay_ms(unsigned long);
void LCDWriteRAM(void);
void LCDInit(void);
void WriteRAM(unsigned char x,unsigned char y);
void ClearRAM(void);

回复评论 (2)

没有人回复, 难道没有人懂这个液晶控制吗
点赞  2012-3-26 22:23
你的问题解决了么?
点赞  2012-9-18 11:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复