OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4111|回复: 4

基于STM32F103 的LCD 12864驱动工程求助

[复制链接]

4

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2015-8-4
在线时间
46 小时
发表于 2015-11-17 17:24:36 | 显示全部楼层 |阅读模式
5金钱
刚刚接触32这东西,今天买了块12864带字库的3.0寸LCD,在STM32F103RB的板子上想要把原子的LCD工程改成可以驱动12864的,可是折腾了半天也没弄出结果,想来论坛里找找有没有好心人留一份工程文件。并行串行的的都可以。虽然串行的调试已经可以了。有的话留一份附件吧。谢了

最佳答案

查看完整内容[请看2#楼]

自行结贴,LCD_12864并行驱动 直接添加到你的工程里就好了,仿照原子的LCD调用语句
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2015-8-4
在线时间
46 小时
 楼主| 发表于 2015-11-17 17:24:37 | 显示全部楼层
自行结贴,LCD_12864并行驱动 直接添加到你的工程里就好了,仿照原子的LCD调用语句

LCD_12864并行.rar

2.72 KB, 下载次数: 433

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-17 22:25:57 | 显示全部楼层
帮顶.....
回复

使用道具 举报

4

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2015-8-4
在线时间
46 小时
 楼主| 发表于 2015-11-18 16:24:31 | 显示全部楼层
[mw_shl_code=c,true] LCD.c[/mw_shl_code] [mw_shl_code=c,true]#include "lcd.h" #include "delay.h" /************************************************************************************************ //FILE:液晶12864驱动程序 //VERS:1.0 ************************************************************************************************/ /************************************************************************************************ @f_name: void LCD12864_InitPort(void) @brief: 初始化硬件端口配置 @param: None @return: None ************************************************************************************************/ void LCD12864_InitPort(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义结构体 RCC_APB2PeriphClockCmd(GPIOCLKA | GPIOCLKB | RCC_APB2Periph_AFIO, ENABLE); //使能功能服用IO时钟,不开启服用时钟不能显示|RCC_APB2Periph_AFIO // GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把调试设置普通IO口 // RCC_APB2PeriphClockCmd(GPIOCLKB, ENABLE); GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD12864_DATA, &GPIO_InitStructure); //IO口初始化函数(使能上述配置) GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LCD12864_CMD, &GPIO_InitStructure); GPIO_Init(LCD12864_CMD, &GPIO_InitStructure); //初始化IO配置 // GPIO_Write(LCD12864_GPIO ,0xff); 输出高是干嘛的??? // GPIO_Write(LCD12864_DATA ,0xff); } /************************************************************************************************ @f_name: u8 LCD12864_busy(void) @brief: 检测忙状态 @param: None @return: None ************************************************************************************************/ u8 LCD12864_busy(void) { u8 x; LCD_RS(0); LCD_RW(1); delay_us(2); LCD_EN(1); delay_us(2); x=Text_Busy; LCD_EN(0); return x; } /************************************************************************************************ @f_name: void LCD12684_Wcmd(u8 dat) @brief: 写指令 @param: u8 dat 输入指令 @return: None ************************************************************************************************/ void LCD12684_Wcmd(u8 dat) { while(LCD12864_busy()); //忙检测 LCD_RS(0); LCD_RW(0); delay_us(2); LCD_EN(1); delay_us(2); LCD_WriteData(dat); delay_us(2); LCD_EN(0); delay_us(2); // LCD_EN(0); } /************************************************************************************************ @f_name: void LCD12684_Wcmd(u8 dat) @brief: 写数据 @param: u8 dat 输入数据 @return: None ************************************************************************************************/ void LCD12684_Wdat(u8 dat) { while(LCD12864_busy()); //忙检测 LCD_RS(1); LCD_RW(0); delay_us(2); LCD_EN(1); delay_us(2); LCD_WriteData(dat); delay_us(2); LCD_EN(0); delay_us(2); // LCD_EN(0); } /************************************************************************************************ @f_name: void LCD12864_Init(void) @brief: 液晶初始化 @param: None @return: None ************************************************************************************************/ void LCD_Init(void) { // LCD_PSB(1); //并口方式 LCD_RST(0); //液晶复位 低电平有效 delay_us(2); LCD_RST(1); //置高电平等待复位 delay_us(2); LCD12684_Wcmd(0x34); //扩充指令操作 delay_us(4); LCD12684_Wcmd(0x30); //基本指令操作 delay_us(8); LCD12684_Wcmd(0x0c); //显示开,关光标 delay_us(4); LCD12684_Wcmd(0x01); //清除LCD的显示内容 delay_us(80); } /************************************************************************************************ @f_name: void LCD12864_Clr(void) @brief: 清屏 @param: None @return: None ************************************************************************************************/ void LCD12864_Clr(void) { LCD12684_Wcmd(0x34); //扩充指令操作 “绘图” delay_us(2); LCD12684_Wcmd(0x30); //基本指令操作 delay_us(2); LCD12684_Wcmd(0x01); //清屏 delay_us(2); } /************************************************************************************************ @f_name: void LCD12864_Pos(u8 x,u8 y) @brief: 设置显示位置 @param: u8 x:X轴 u8 y:Y轴 @return: None ************************************************************************************************/ void LCD12864_Pos(u8 x,u8 y) { u8 pos; if (x==1) {x=0x80;} else if (x==2) {x=0x90;} else if (x==3) {x=0x88;} else if (x==4) {x=0x98;} else x=0x80; pos = x+y ; LCD12684_Wcmd(pos); //显示地址 } /************************************************************************************************ @f_name: void LCD12864_PhotoDis(u8 *bmp) @brief: 显示图形 @param: u8 *bmp 图形数组 @return: None ************************************************************************************************/ void LCD12864_PhotoDis(u8 *bmp) { u8 i,j; LCD12684_Wcmd(0x34); //关闭图形显示 for(i=0;i<32;i++) { LCD12684_Wcmd(0x80+i); //先写入水平坐标值 LCD12684_Wcmd(0x80); //写入垂直坐标值 for(j=0;j<16;j++) //再写入两个8位元的数据 LCD12684_Wdat(*bmp++); delay_ms(2); } for(i=0;i<32;i++) { LCD12684_Wcmd(0x80+i); LCD12684_Wcmd(0x88); for(j=0;j<16;j++) LCD12684_Wdat(*bmp++); delay_ms(2); } LCD12684_Wcmd(0x36); //写完数据,开图形显示 } /************************************************************************************************ @f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p) @brief: 显示字符串 @param: u8 *bmp 图形数组 @return: None ************************************************************************************************/ void LCD_ShowString(u8 x,u8 y,const u8 *p) { u8 temp; if(x>4) {x=1;} if(y>4) {y=0;} LCD12864_Pos(x,y); temp=*p; while(temp!='\0') { LCD12684_Wdat(temp); temp=*(++p); } } LCD.h #ifndef __LCD_H #define __LCD_H #include "sys.h" //管脚定义 //************************************************************************************************************************** #define LCD12864_CMD GPIOB #define LCD12864_DATA GPIOA #define GPIOCLKB RCC_APB2Periph_GPIOB #define GPIOCLKA RCC_APB2Periph_GPIOA #define RS GPIO_Pin_5 #define RW GPIO_Pin_6 #define EN GPIO_Pin_7 //#define PSB GPIO_Pin_4 #define RST GPIO_Pin_8 #define Busy GPIO_Pin_7 #define LCD_GPIO_DAT GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 #define LCD_GPIO_CMD GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8 #define LCD_RS(x) x ? GPIO_SetBits(LCD12864_CMD,RS): GPIO_ResetBits(LCD12864_CMD,RS) #define LCD_RW(x) x ? GPIO_SetBits(LCD12864_CMD,RW): GPIO_ResetBits(LCD12864_CMD,RW) #define LCD_EN(x) x ? GPIO_SetBits(LCD12864_CMD,EN): GPIO_ResetBits(LCD12864_CMD,EN) //#define LCD_PSB(x) x ? GPIO_SetBits(LCD12864_GPIO,PSB): GPIO_ResetBits(LCD12864_GPIO,PSB) #define LCD_RST(x) x ? GPIO_SetBits(LCD12864_CMD,RST): GPIO_ResetBits(LCD12864_CMD,RST) #define Text_Busy GPIO_ReadInputDataBit(LCD12864_DATA ,Busy) //PAin(7) //#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;} //高8位的数据 #define LCD_WriteData(x) {LCD12864_DATA->BSRR = x & 0x00ff;LCD12864_DATA->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据 void LCD12864_InitPort(void); //硬件端口初始化 u8 LCD12864_busy(void); //检测忙状态 void LCD12684_Wcmd(u8 dat); //写指令 void LCD12684_Wdat(u8 dat); //写数据 void LCD_Init(void); //液晶初始化 void LCD12864_Clr(void); //清屏 void LCD12864_Pos(u8 x,u8 y); //设置显示位置 void LCD12864_PhotoDis(u8 *bmp); //显示图片 void LCD_ShowString(u8 x,u8 y,const u8 *p); //显示字符串 //********************************************************************************************************************** #endif int main() { delay_Init(); LCD12864_InitPort(); LCD_Init(); LCD12864_Pos(3,5); LCD12684_Wdat(0x35); LCD_ShowString(1,1,"我我我"); while(1); } [/mw_shl_code]

回复

使用道具 举报

4

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
327
金钱
327
注册时间
2015-8-4
在线时间
46 小时
 楼主| 发表于 2015-11-18 16:26:47 | 显示全部楼层
今天改了一天,还是没让 QC12864B (带字库)显示出东西,代码贴上来,希望你们有空可以帮我看看,哪里出错了代码参考论坛的帖子改的。晚上继续(用的是STM32F103RB的板子,,VDD接3.3V,数据脚 D0-D7接GPIOA0-GPIO7,PSC接到3.3V上了所以没配置(PSC高为并行),RS,RW,EN,REST分别接到GPIOB5-GPIOB8)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 07:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表