STM32f103rct6
芯片控制lcd12864i控制器为HD61202,主代码贴下面,目前程序调试无输出,测量lcd管脚上有相应输出,lcd屏无显示,求解!
- <P>void main()
- {
-
- /* 设置系统时钟 */
- RCC_Configuration();
-
- /* 设置NVIC */
- NVIC_Configuration();
-
- /* 设置GPIO端口 */
- GPIO_Configuration();
-
- /*设置TIM3*/
- TIM3_Configuration();
-
- /* 设置USART1 */
- USART_Configuration();
-
- /* 设置USART1 中断*/
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
-
- /*SPI 设置*/
- //SPI_Configuration();
- //SPI_SSOutputCmd(SPI1,DISABLE);
- /*PC.8输出高电平Led on!*/
- GPIO_SetBits(GPIOC , GPIO_Pin_8);
-
- Lcd_Init();
- Lcd_Printf(1,2,"ABCD");//输出ABCD
- Lcd_Printf(2,3,"液晶显示程序");//输出汉字“液晶显示程序”
- while(1);</P>
- <P>}
- void LcdIO(unsigned char data)
- {
- int i;
- for(i=0;i<8;i++)
- {
- if(data>>i&0x01==0x01)
- switch(i)
- {
- case 0: GPIO_SetBits(GPIOC,GPIO_Pin_0);
- break;
- case 1:GPIO_SetBits(GPIOC,GPIO_Pin_3);
- break;
- case 2:GPIO_SetBits(GPIOC,GPIO_Pin_6);
- break;
- case 3:GPIO_SetBits(GPIOC,GPIO_Pin_7);
- break;
- case 4:GPIO_SetBits(GPIOC,GPIO_Pin_9);
- break;
- case 5:GPIO_SetBits(GPIOC,GPIO_Pin_10);
- break;
- case 6:GPIO_SetBits(GPIOC,GPIO_Pin_11);
- break;
- case 7:GPIO_SetBits(GPIOC,GPIO_Pin_12);
- break;
- }
- else
- switch(i)
- {
- case 0:GPIO_ResetBits(GPIOC,GPIO_Pin_0);
- break;
- case 1:GPIO_ResetBits(GPIOC,GPIO_Pin_3);
- break;
- case 2:GPIO_ResetBits(GPIOC,GPIO_Pin_6);
- break;
- case 3:GPIO_ResetBits(GPIOC,GPIO_Pin_7);
- break;
- case 4:GPIO_ResetBits(GPIOC,GPIO_Pin_9);
- break;
- case 5:GPIO_ResetBits(GPIOC,GPIO_Pin_10);
- break;
- case 6:GPIO_ResetBits(GPIOC,GPIO_Pin_11);
- break;
- case 7:GPIO_ResetBits(GPIOC,GPIO_Pin_12);
- break;
- }
- }
- }</P>
- <P>
- void Lcd_Init(void)//对液晶屏进行初始化
- {
- LcdRES_L;//LcdRST = 0;//复位
- DelayNms(10);
- LcdRES_H;//LcdRST = 1;
- DelayNms(10);
- Lcd_SetL(0x3E);//关显示命令
- Lcd_SetR(0x3E);
- Lcd_SetL(0x3F);//开显示命令
- Lcd_SetR(0x3F);
- Lcd_SetL(0xC0);//显示起始行设置
- Lcd_SetR(0xC0);
- Lcd_SetL(0xB8);//显示起始行设置
- Lcd_SetR(0xB8);
- Lcd_SetL(0x40);//显示起始行设置
- Lcd_SetR(0x40);
- }</P>
- <P>
- void Lcd_Clear(void)
- {
- u8 i,j,k;
-
- for(i=0;i<8;i++)
- {
- Lcd_SetL(i+0xB8);//设置页地址
- Lcd_SetR(i+0xB8);
- for(j=0;j<64;j++)//设置列地址
- {
- Lcd_SetL(j+0x40);
- Lcd_SetR(j+0x40);
- for(k=0;k<64;k++)
- {
- Lcd_DataL(0x00);//清屏
- Lcd_DataR(0x00);
- }
- }
- }
- }</P>
- <P>
- u8 Lcd_BusyL(void)//检测左半屏是否忙
- {
- u8 dat=0;
- //LcdEN_L;//LcdE = 0;
- //delay_(400);
- LcdCSL_H;//LcdCSL = 1;
- LcdCSR_L;//LcdCSR = 0;
- LcdDI_L;//LcdDI = 0;
- LcdRW_H;//LcdRW = 1;
- // delay_(400);
- LcdEN_H;//LcdE = 1;
- GPIO_Configuration1();
- dat=GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_12);//dat = LcdIO;
- LcdEN_L;//LcdE = 0;
- GPIO_Configuration2();
- if((dat&0x1) == 0x01)
- return Yes;
- else return No;
-
- }
- u8 Lcd_BusyR(void)//检测右半屏是否忙
- {
- u8 dat=0;
- //LcdEN_L;//LcdE = 0;
- //delay_(400);
- LcdCSL_L;//LcdCSL = 0;
- LcdCSR_H;//LcdCSR = 1;
- LcdDI_L;//LcdDI = 0;
- LcdRW_H;//LcdRW = 1;
- // delay_(400);
- LcdEN_H;//LcdE = 1;
- GPIO_Configuration1();
- dat=GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_12);//dat = LcdIO;
- LcdEN_L;//LcdE = 0;
- GPIO_Configuration2();
- if((dat&0x1) == 0x01)
- return Yes;
- else return No;
-
- }</P>
- <P>
- void Lcd_SetL(u8 dat)//对左半屏进行设置
- {
- while(Lcd_BusyL() == Yes);
- //LcdEN_L;//LcdE = 0;
- // delay_(400);
- LcdCSL_H;//LcdCSL = 1;
- LcdCSR_L;//LcdCSR = 0;
- LcdRW_L;//LcdRW = 0;
- LcdDI_L;//LcdDI = 0;
- //delay_(400);
- LcdIO(dat);//LcdIO = dat;
- LcdEN_H;//LcdE = 1;
- DelayNms(3);
- LcdEN_L;//LcdE = 0;
- LcdCSL_L;
- }
- void Lcd_DataL(u8 dat)//对左半屏写入点阵数据
- {
- while(Lcd_BusyL() == Yes);
- //LcdEN_L;//LcdE = 0;
- // delay_(400);
- LcdCSL_H;//LcdCSL = 1;
- LcdCSR_L;//LcdCSR = 0;
- LcdRW_L;//LcdRW = 0;
- LcdDI_H;//LcdDI = 1;
- //delay_(400);
- LcdIO(dat);//LcdIO = dat;
- LcdEN_H;//LcdE = 1;
- DelayNms(3);
- LcdEN_L;//LcdE = 0;
- LcdCSL_L;
- }</P>
- <P>
- void Lcd_SetR(u8 dat)//对右半屏进行设置
- {
- while(Lcd_BusyR() == Yes);
- //LcdEN_L;//LcdE = 0;
- // delay_(400);
- LcdCSL_L;//LcdCSL = 0;
- LcdCSR_H;//LcdCSR = 1;
- LcdRW_L;//LcdRW = 0;
- LcdDI_L;//LcdDI = 0;
- // delay_(400);
- LcdIO(dat);//LcdIO = dat;
- LcdEN_H;//LcdE = 1;
- DelayNms(3);
- LcdEN_L;//LcdE = 0;
- LcdCSR_L;
- }
- void Lcd_DataR(u8 dat)//对右半屏写入点阵数据
- {
- while(Lcd_BusyR() == Yes);
- //LcdEN_L;//LcdE = 0;
- // delay_(400);
- LcdCSL_L;//LcdCSL = 0;
- LcdCSR_H;//LcdCSR = 1;
- LcdRW_L;//LcdRW = 0;
- LcdDI_H;//LcdDI = 1;
- //delay_(400);
- LcdIO(dat);//LcdIO = dat;
- LcdEN_H;//LcdE = 1;
- DelayNms(3);
- LcdEN_L;//LcdE = 0;
- LcdCSR_L;
- }</P>
- <P> </P>
- <P>
- /*延时时间ms,晶振为8MHz*/
- void DelayNms(u32 T)
- {</P>
- <P> u8 I;
- while(--T)
- for(I=0;I<100;I++);
- }</P>
- <P>/*
- void DELAY(UINT T)
- {
- UINT I;
- while(--T)
- for(I=0;I<100;I++);
- }
- */</P>
- <P>
- void Lcd_Printf(u8 row,u8 column,u8 *pString)//在液晶屏对应的行列位置输出字符串,把液晶屏分成4行16列
- {
- u8 i=0;
- if((row>4)||(column>16)) return;//如果行列值超出范围,直接返回。
- while(pString[i] != 0)
- {
- if(pString[i]<=0x80)//如果是ASC字符
- {
- Lcd_PutAsc(row,column,pString+i);//输出ASC码
- if(++column > 16) //调整行列值,如果到达液晶最后点,则返回
- {
- column = 1;
- if(++row > 4) return;
- }
- i++;
- }
- else //如果是汉字
- {
- if(column == 16)//如果当前行无法显示整个汉字,则变换到下一行
- {
- column = 1;
- if(++row > 4) return;
- }
- Lcd_PutHz(row,column,pString+i);//输出汉字
- column++;column++;//调整行列值,如果到达液晶最后点,则返回
- if(column >16)
- {
- column = 1;
- if(++row > 4) return;
- }
- i = i+2;
- }
- }
- }</P>
- <P>
- void Lcd_PutAsc(u8 row,u8 column,u8 *pChar)//在液晶屏对应的行列位置输出ASC字符
- {
- u8 i,j,FontNum;
- FontNum = sizeof(Font_Asc8x16)/sizeof(Font_Asc8x16[0]);
- for(i=0;i<FontNum;i++)
- {
- if(Font_Asc8x16[i].Index[0] == (*pChar))
- {
- if(column<=8)//设置行列地址
- {
- Lcd_SetL((column-1)*8+0x40);//左半屏
- Lcd_SetL((row-1)*2+0xB8);
- for(j=0;j<8;j++)
- {
- Lcd_DataL(Font_Asc8x16[i].Msk[j]);
- }
- Lcd_SetL((column-1)*8+0x40);
- Lcd_SetL((row-1)*2+1+0xB8);
- for(j=9;j<16;j++)
- {
- Lcd_DataL(Font_Asc8x16[i].Msk[j]);
- }
- }
- else
- {
- Lcd_SetR((column-8-1)*8+0x40);//右半屏
- Lcd_SetR((row-1)*2+0xB8);
- for(j=0;j<8;j++)
- {
- Lcd_DataR(Font_Asc8x16[i].Msk[j]);
- }
- Lcd_SetR((column-8-1)*8+0x40);
- Lcd_SetR((row-1)*2+1+0xB8);
- for(j=9;j<16;j++)
- {
- Lcd_DataR(Font_Asc8x16[i].Msk[j]);
- }
- }
- }
- }
- }</P>
- <P>
- void Lcd_PutHz(u8 row,u8 column,u8 *pHz)//在液晶屏对应的行列位置输出汉字
- {
- u8 i,j,FontNum;
- FontNum = sizeof(Font_Hz16x16)/sizeof(Font_Hz16x16[0]);
- for(i=0;i<FontNum;i++)
- {
- if((Font_Hz16x16[i].Index[0]==(*pHz)) && ((Font_Hz16x16[i].Index[1])==(*(pHz+1))))
- {
- if(column <= 8)
- {
- Lcd_SetL((column-1)*8+0x40);//写左半屏
- Lcd_SetL((row-1)*2+0xB8);
- for(j=0;j<8;j++)//显示汉字左上角
- {
- Lcd_DataL(Font_Hz16x16[i].Msk[j]);
- }
- Lcd_SetL((column-1)*8+0x40);
- Lcd_SetL((row-1)*2+1+0xB8);
- for(j=16;j<24;j++)//显示汉字左下角
- {
- Lcd_DataL(Font_Hz16x16[i].Msk[j]);
- }
- }
- else
- {
- Lcd_SetR((column-8-1)*8+0x40);//写左半屏
- Lcd_SetR((row-1)*2+0xB8);
- for(j=0;j<8;j++)//显示汉字左上角
- {
- Lcd_DataR(Font_Hz16x16[i].Msk[j]);
- }
- Lcd_SetR((column-8-1)*8+0x40);
- Lcd_SetR((row-1)*2+1+0xB8);
- for(j=16;j<24;j++)//显示汉字左下角
- {
- Lcd_DataR(Font_Hz16x16[i].Msk[j]);
- }
- }
- column++;
- //显示汉字右半屏
- if(column <= 8)
- {
- Lcd_SetL((column-1)*8+0x40);//写右半屏
- Lcd_SetL((row-1)*2+0xB8);
- for(j=8;j<16;j++)//显示汉字右上角
- {
- Lcd_DataL(Font_Hz16x16[i].Msk[j]);
- }
- Lcd_SetL((column-1)*8+0x40);
- Lcd_SetL((row-1)*2+1+0xB8);
- for(j=24;j<32;j++)//显示汉字右下角
- {
- Lcd_DataL(Font_Hz16x16[i].Msk[j]);
- }
- }
- else
- {
- Lcd_SetR((column-8-1)*8+0x40);//写右半屏
- Lcd_SetR((row-1)*2+0xB8);
- for(j=8;j<16;j++)//显示汉字右上角
- {
- Lcd_DataR(Font_Hz16x16[i].Msk[j]);
- }
- Lcd_SetR((column-8-1)*8+0x40);
- Lcd_SetR((row-1)*2+1+0xB8);
- for(j=24;j<32;j++)//显示汉字右下角
- {
- Lcd_DataR(Font_Hz16x16[i].Msk[j]);
- }
- }
- }
- }
- } </P>
复制代码
-
一周热门 更多>