STM32F10x并行驱动lcd12864遇到的问题及其解决方案
程序
- 代码的移植时参见CSDN中的常见代码,网上几乎都一致。改动较小,常见为该管脚,因此需要注意。
- 改变管脚时要注意stm32中A、B管脚中有一部分管脚与烧录有关(例如B04),因此常要在启动前加入代码(一般建议不要用这几号管脚),我选择避开这些管脚。使用B08-B15
- 当发现无法显示时,使用硬件仿真发现程序死在检测忙时状态(即检查DB7),网上摘录的程序是并行数据口DB0-DB7使用的是推挽输出,但因为使用并行方式,需要读取也需要写入,因此最合适的应该是开漏输出(具体介绍自查)。
- 在字体能成功输出,但是字体却与输入的字体对不上时,先别怀疑自己,这已经离成功非常接近了。可以通过硬件仿真跟踪每一步的过程,看输入的字符是否转换的字码是否正确,运行到显示输出时,观察屏幕输出的字码是否与你输入的一样(这时你可能会问为什么直接运行时不一样,但是仿真时却是一样呢?),这时,你就要关注时序表了(我是对比两个不同的程序码发现),我的LCD_Write_Cmd与LCD_Write_Dat没有在适当的位置延时
,查资料可得每条指令发送的时间不能少于73微秒。我怀疑时32发送得太快,而lcd没反应过来。事实证明加入延时delay_ms(2)后字体显示正常
硬件
- 以前一般很少关注硬件问题,但这次让我栽了大跟头
- http://www.elecfans.com/xianshi/20180411660204.html在上面有一张接线图以及接线的提示
- 注意单片机时3.3V(但是我给它接入5V似乎并没有问题),在输出高电平时也是3V以上,低电平也符合。(至于好像说32有一些特殊引脚才能输出5V,但是这次没有用到我就先不说了)就是说单片机输出的电平是与屏幕是对应的,不会出现我自认为输出高电平而屏幕识别为低电平的情况(这一点就当写给自己看吧,我不知道3.3V单片机驱动5V的屏幕会不会出现高低电平不匹配而导致错误的问题,当然,用电表在硬件仿真时对应命令一步一步测就好了,真想有个逻辑分析仪)
- 在用电表和硬件仿真一步一步debug
在这里插入代码片
的时候,我发现了一个很奇怪的事,就是同一条导线两端单片机引脚与lcd引脚的电平一个是0一个是1,我一度怀疑是自己的引脚配置问题。最后竟然发现是导线断了!!!!!(是那种外表看不出来,然而就是这么神奇的事情),买导线质量一定要过关!!!!
如果上面的话有错漏的话请批评指正
代码如下
侵删
#ifndef __lcd_H__
#define __lcd_H__#include "SysTick.h"#define RS PAout(0)
#define RW PAout(1)
#define EN PAout(2)#define RS_Pin GPIO_Pin_0
#define RW_Pin GPIO_Pin_1
#define EN_Pin GPIO_Pin_2typedef enum
{Command,Data
}WR_Mode;#define LINE1 0x80
#define LINE2 0x90
#define LINE3 0x88
#define LINE4 0x98
void LCD_Wait_Ready(void);
void LCD_Write_Cmd(uint8_t cmd);
void LCD_Write_Dat(uint8_t dat);
void LCD_Init(void);
void LCD_Write_Word(uint8_t *str);
void LCD_Write_Test(WR_Mode mode, uint8_t word);
void LCD_Clr(void);
void LCM_CLR(void);
void LCD12864_Show(uint8_t line, uint8_t pos, uint8_t *str);
void LCD12864Configuration(void);#endif
#include "lcd.h"void LCD_Wait_Ready(void)
{// delay_ms(10);
// GPIO_InitTypeDef GPIO;uint8_t status;RS = 0;RW = 1;GPIOB->ODR = 0xff<<8;do{EN = 1;delay_ms(5);status = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);}while(status & 0x01);EN = 0;
}void LCD_Write_Cmd(uint8_t cmd)
{LCD_Wait_Ready();RS = 0;RW = 0;EN = 1;delay_ms(2);//tryGPIOB->ODR = cmd<<8;delay_ms(2);//tryEN = 0;
}void LCD_Write_Dat(uint8_t dat)
{LCD_Wait_Ready();RS = 1;RW = 0;EN = 1;delay_ms(2);//tryGPIOB->ODR = dat<<8;delay_ms(2);//tryEN = 0;
}void LCD_Init(void)
{LCD_Write_Cmd(0x30);LCD_Write_Cmd(0x0C);LCD_Write_Cmd(0x01);
}void LCD_Write_Word(uint8_t *str)
{while (*str > 0){LCD_Write_Dat(*str);str ++;}
}void LCD_Write_Test(WR_Mode mode, uint8_t word)
{switch(mode){case Command:LCD_Write_Cmd(word);break;case Data:LCD_Write_Dat(word);break;}
}void LCD_Clr(void)
{LCD_Write_Test(Command, 0x01);
}void LCM_CLR(void)
{uint8_t clear[16] = " ";// 清屏LCD_Write_Test(Command, LINE1);LCD_Write_Word(clear);LCD_Write_Test(Command, LINE2);LCD_Write_Word(clear);LCD_Write_Test(Command, LINE3);LCD_Write_Word(clear);
}void LCD12864_Show(uint8_t line, uint8_t pos, uint8_t *str)
{LCD_Write_Test(Command, line + pos);LCD_Write_Word(str);
}void LCD12864Configuration(void)
{GPIO_InitTypeDef GPIO;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);GPIO.GPIO_Pin = RS_Pin | RW_Pin | EN_Pin | GPIO_Pin_3;//| PSB_Pin | RST_Pin;GPIO_Pin_3单纯用来做个vcc没啥用GPIO.GPIO_Speed = GPIO_Speed_50MHz;GPIO.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO);//新加,让屏幕重启一下GPIO_ResetBits(GPIOA,GPIO_Pin_3);delay_ms(10);GPIO_SetBits(GPIOA,GPIO_Pin_3);//Data Port , PB8 ~ PB15delay_ms(10);GPIO.GPIO_Mode = GPIO_Mode_Out_OD;GPIO.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_Init(GPIOB,&GPIO);LCD_Init();LCD_Clr();
}
STM32F10x并行驱动lcd12864遇到的问题及其解决方案相关推荐
- STM32单片机驱动LCD12864(型号:OCM J4X8C)
0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...
- Arduino UNO通过SPI串行方式驱动LCD12864液晶屏
LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字.英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低.显示内容丰富等特点而应用广 ...
- STM32F4_LCD12864并行驱动
头文件: #ifndef __12864LCD_H__ #define __12864LCD_H__#include "stm32f4xx.h" #include "st ...
- stm32驱动LCD12864液晶屏驱动程序,亲测可行,复制直接能用!
废话不多说,直接贴程序,你自己复制过去即可,免得我通过把工程上传的方式,你下载还得需要c币,这个现在很贵呀!!! 就两个文件,LCD12864.h和LCD12864.c,自己复制过去后,改一下引脚即可 ...
- STM32驱动LCD12864(串行模式)
效果呈现 引脚定义:(VCC接入先询问厂家供电) PIN1--GND PIN2--5V PIN3--不接 PIN4--RS(CS) PIN5--R/W(SID) PIN6--E(SCK) PIN7-- ...
- STM32/51单片机实训day6(一)——Proteus8.6版本+STM32F103驱动LCD12864显示|Keil5单片机程序设计
内 容:实现LCD显示 学 时:4学时 知识点:LCD12864芯片介绍,读写操作时序,电路设计 重点: 读写操作时序 难点:读写操作时序 时间:2022年12月26日 9:00-11:50 总结 ...
- DSP28335驱动Lcd12864显示Ds18b20采集到的温度,并通过Sci方式传输至PC,使用Matlab制作上位机软件进行数据保存与显示
这一篇文章是我前一篇文章的续集,主要是为了弥补 CCS无法实时捕捉数据至上位机的缺陷(可能CCS有,但是我却没找到,如果有读者知道具体答案,请留言告诉我.).当然串口传输来的数据也有不足的地方,就是这 ...
- lcd12864使用c语言pic单片机,PIC单片机驱动LCD12864液晶显示闪动字体程序
/**************************************************************************** * 名 称:wr_zb() * 功 能:显示 ...
- oraoledb.oracle 12c,关于OraOLEDB.Oracle找不到驱动问题的一种可能解决方案
如果安装Oracle的时候没有把Oracle Provider for OLE DB,这个组件安装上,那么就会导致在使用程序的时候无法使用Oracle客户端驱动问题,弥补的办法就是重新下载客户端程序. ...
最新文章
- typora背景变黑
- Character流与Byte流的区别
- IEEE Spectrum调查:AI 的 6 种最坏情况
- (一)安装docker
- java: cannot execute binary file错误
- C4.5最新版本Release8与MDL的关系的详细解读
- 拉丁超立方抽样matlab代码_想要数据分析更快?超良心的笔记本/台式电脑配置推荐!...
- Outh2协议有哪四种授权模式?
- python-docx原有图片居中
- 基于FPGA的映射调制实现
- Java测试框架系列:Mockito 详解:第三部分:结果验证
- 浅谈Docker的安全性支持(上篇)
- ModuleNotFoundError: No module named ‘kombu.five‘
- linux网桥转发自身数据,linux网桥理解之一
- 翻译辅助软件(CAT)OmegaT在Windows平台上的安装与使用
- solaris系统光盘无法弹出
- 数学专业英语--导数
- 离散数学(九):集合的基本概念和运算
- 国产7nm智能座舱芯片来袭
- 项目-企业客户关系管理系统(登录+首页操作菜单)
热门文章
- python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)
- Sublime 安装和自动生成注册码
- [论文翻译]Scene text recognition from two-dimensional perspective
- 刚刚,马斯克当选美国工程院院士!智源张宏江博士入选外籍院士
- 抓取Foursquare网页信息的爬虫
- IANA Time Zone Database 和 ZONEINFO 详解
- CDR X8频繁弹出注册登陆窗口如何禁止阻断关闭?
- Quartz框架之触发器(3)
- springboot-定时任务
- YY 6.27.0.0优化版