本帖最后由 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);
}
一周热门 更多>