完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 mengyao05527 于 2015-12-22 09:43 编辑
STM32f103控制12864I(驱动器为HD61202)LCD无显示,目前不确定程序的时序是否正确,请大家帮忙看看!附件里有原理图和源代码以及lcd手册!多谢! 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); } 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; } } } 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); } 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); } } } } 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; } 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; } 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; } /*延时时间ms,晶振为8MHz*/ void DelayNms(u32 T) { u8 I; while(--T) for(I=0;I<100;I++); } /* void DELAY(UINT T) { UINT I; while(--T) for(I=0;I<100;I++); } */ void Lcd_Printf(u8 row,u8 column,u8 *pString)//在液晶屏对应的行列位置输出字符串,把液晶屏分成4行16列 { u8 i=0; if((row>4)||(column>16)) return;//如果行列值超出范围,直接返回。 while(pString != 0) { if(pString<=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; } } } 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 if(Font_Asc8x16.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.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.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.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.Msk[j]); } } } } } 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 if((Font_Hz16x16.Index[0]==(*pHz)) && ((Font_Hz16x16.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.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.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.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.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.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.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.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.Msk[j]); } } } } } |
|
相关推荐
|
|
目前lcd管脚上有数据且是程序运行时的数据 ,就是屏幕无显示
|
|
|
|
|
|
|
|
|
|
|
|
我把主要代码写这里,
大家帮忙看看,看看时序是否正确,还有我的端口是来自不同的,这样实现是否正确,按说应该是正确的,目前lcd数据管脚可以测量到写数据时的数据变化,请大家帮忙 |
|
|
|
|
|
2373 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1257 浏览 0 评论
3206 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2977 浏览 4 评论
5546 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-22 23:12 , Processed in 0.570126 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号