程序

  1. 代码的移植时参见CSDN中的常见代码,网上几乎都一致。改动较小,常见为该管脚,因此需要注意。
  2. 改变管脚时要注意stm32中A、B管脚中有一部分管脚与烧录有关(例如B04),因此常要在启动前加入代码(一般建议不要用这几号管脚),我选择避开这些管脚。使用B08-B15
  3. 当发现无法显示时,使用硬件仿真发现程序死在检测忙时状态(即检查DB7),网上摘录的程序是并行数据口DB0-DB7使用的是推挽输出,但因为使用并行方式,需要读取也需要写入,因此最合适的应该是开漏输出(具体介绍自查)。
  4. 在字体能成功输出,但是字体却与输入的字体对不上时,先别怀疑自己,这已经离成功非常接近了。可以通过硬件仿真跟踪每一步的过程,看输入的字符是否转换的字码是否正确,运行到显示输出时,观察屏幕输出的字码是否与你输入的一样(这时你可能会问为什么直接运行时不一样,但是仿真时却是一样呢?),这时,你就要关注时序表了(我是对比两个不同的程序码发现),我的LCD_Write_Cmd与LCD_Write_Dat没有在适当的位置延时
    ,查资料可得每条指令发送的时间不能少于73微秒。我怀疑时32发送得太快,而lcd没反应过来。事实证明加入延时delay_ms(2)后字体显示正常

硬件

  1. 以前一般很少关注硬件问题,但这次让我栽了大跟头
  2. http://www.elecfans.com/xianshi/20180411660204.html在上面有一张接线图以及接线的提示
  3. 注意单片机时3.3V(但是我给它接入5V似乎并没有问题),在输出高电平时也是3V以上,低电平也符合。(至于好像说32有一些特殊引脚才能输出5V,但是这次没有用到我就先不说了)就是说单片机输出的电平是与屏幕是对应的,不会出现我自认为输出高电平而屏幕识别为低电平的情况(这一点就当写给自己看吧,我不知道3.3V单片机驱动5V的屏幕会不会出现高低电平不匹配而导致错误的问题,当然,用电表在硬件仿真时对应命令一步一步测就好了,真想有个逻辑分析仪)
  4. 在用电表和硬件仿真一步一步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遇到的问题及其解决方案相关推荐

  1. STM32单片机驱动LCD12864(型号:OCM J4X8C)

    0.内容简介 软件:Keil uVision5.Image2LCD 2.9 硬件:STM32F103C8T6.LCD12864(金鹏OCM J4X8C,控制芯片ST7920) 描述:STM32F103 ...

  2. Arduino UNO通过SPI串行方式驱动LCD12864液晶屏

    LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字.英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低.显示内容丰富等特点而应用广 ...

  3. STM32F4_LCD12864并行驱动

    头文件: #ifndef __12864LCD_H__ #define __12864LCD_H__#include "stm32f4xx.h" #include "st ...

  4. stm32驱动LCD12864液晶屏驱动程序,亲测可行,复制直接能用!

    废话不多说,直接贴程序,你自己复制过去即可,免得我通过把工程上传的方式,你下载还得需要c币,这个现在很贵呀!!! 就两个文件,LCD12864.h和LCD12864.c,自己复制过去后,改一下引脚即可 ...

  5. STM32驱动LCD12864(串行模式)

    效果呈现 引脚定义:(VCC接入先询问厂家供电) PIN1--GND PIN2--5V PIN3--不接 PIN4--RS(CS) PIN5--R/W(SID) PIN6--E(SCK) PIN7-- ...

  6. STM32/51单片机实训day6(一)——Proteus8.6版本+STM32F103驱动LCD12864显示|Keil5单片机程序设计

    内  容:实现LCD显示 学  时:4学时 知识点:LCD12864芯片介绍,读写操作时序,电路设计 重点: 读写操作时序 难点:读写操作时序 时间:2022年12月26日 9:00-11:50 总结 ...

  7. DSP28335驱动Lcd12864显示Ds18b20采集到的温度,并通过Sci方式传输至PC,使用Matlab制作上位机软件进行数据保存与显示

    这一篇文章是我前一篇文章的续集,主要是为了弥补 CCS无法实时捕捉数据至上位机的缺陷(可能CCS有,但是我却没找到,如果有读者知道具体答案,请留言告诉我.).当然串口传输来的数据也有不足的地方,就是这 ...

  8. lcd12864使用c语言pic单片机,PIC单片机驱动LCD12864液晶显示闪动字体程序

    /**************************************************************************** * 名 称:wr_zb() * 功 能:显示 ...

  9. oraoledb.oracle 12c,关于OraOLEDB.Oracle找不到驱动问题的一种可能解决方案

    如果安装Oracle的时候没有把Oracle Provider for OLE DB,这个组件安装上,那么就会导致在使用程序的时候无法使用Oracle客户端驱动问题,弥补的办法就是重新下载客户端程序. ...

最新文章

  1. typora背景变黑
  2. Character流与Byte流的区别
  3. IEEE Spectrum调查:AI 的 6 种最坏情况
  4. (一)安装docker
  5. java: cannot execute binary file错误
  6. C4.5最新版本Release8与MDL的关系的详细解读
  7. 拉丁超立方抽样matlab代码_想要数据分析更快?超良心的笔记本/台式电脑配置推荐!...
  8. Outh2协议有哪四种授权模式?
  9. python-docx原有图片居中
  10. 基于FPGA的映射调制实现
  11. Java测试框架系列:Mockito 详解:第三部分:结果验证
  12. 浅谈Docker的安全性支持(上篇)
  13. ModuleNotFoundError: No module named ‘kombu.five‘
  14. linux网桥转发自身数据,linux网桥理解之一
  15. 翻译辅助软件(CAT)OmegaT在Windows平台上的安装与使用
  16. solaris系统光盘无法弹出
  17. 数学专业英语--导数
  18. 离散数学(九):集合的基本概念和运算
  19. 国产7nm智能座舱芯片来袭
  20. 项目-企业客户关系管理系统(登录+首页操作菜单)

热门文章

  1. python将字符串逆序_为什么说Python是一门伟大的入门语言?(附免费教程)
  2. Sublime 安装和自动生成注册码
  3. [论文翻译]Scene text recognition from two-dimensional perspective
  4. 刚刚,马斯克当选美国工程院院士!智源张宏江博士入选外籍院士
  5. 抓取Foursquare网页信息的爬虫
  6. IANA Time Zone Database 和 ZONEINFO 详解
  7. CDR X8频繁弹出注册登陆窗口如何禁止阻断关闭?
  8. Quartz框架之触发器(3)
  9. springboot-定时任务
  10. YY 6.27.0.0优化版