小弟这几天使用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);
|