【液晶屏12232LCD并口显示】STM32Fxx驱动DS12232

您所在的位置:网站首页 8080并口驱动lcd 【液晶屏12232LCD并口显示】STM32Fxx驱动DS12232

【液晶屏12232LCD并口显示】STM32Fxx驱动DS12232

2023-12-18 18:11| 来源: 网络整理| 查看: 265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

STM32Fxx驱动DS12232-2LCD并口显示 前言一、12232LCD基本介绍1、引脚说明2、时序图 二、屏幕接线原理图三、屏幕并口显示效果四、示例程序

前言

最近上手使用stm32fxx系列开发板驱动DS12232LCD屏来显示内容,12232LCD是比较古老的点阵显示屏,屏幕控制显示比较复杂,且网上的显示例程较少,多是c51驱动显示。在这里我是使用stm32来驱动显示,系统总结一下该类型屏幕显示的过程和实现程序。在下知识有限,有错误的地方还望纠正,闲话少说,接下来进入正题。

一、12232LCD基本介绍

12232LCD屏幕实际上是列x行为122x32像素的点阵显示屏幕,要根据产品使用手册来用,手册使用关键要看两个部分,分别是屏幕引脚说明、时序图,如下:

1、引脚说明

DS12232LCD引脚图如下: 在这里插入图片描述屏幕引脚一共有18个,这里只给出16个,16和17引脚LEDA和LEDK背光是用来调节屏幕显示亮度的,可接可不接。 接下来分别介绍一下引脚的含义: (1)1、2引脚是供电,我用的是5V驱动,故Vss、Vdd分别接GND和5V。 (2)V0引脚是用来提供屏幕显示对比度的,接GND。这里要注意的是,V0和GND要串联个B20K电位器(或滑动变阻器),通过调节阻值大小来控制屏幕实现最佳显示效果。效果如下图:在这里插入图片描述 阻值较大,电流较小,显示效果。

在这里插入图片描述阻值较小,电流较大,显示效果。 一般将V0直接接GND时,即无电阻接入,显示效果同上。

在这里插入图片描述阻值合适,能清晰显示。

(3)4~7引脚是屏幕指令控制。这里我主要说一下E1、E2引脚,其余引脚根据表图介绍,会接stm32fxx开发板GPIO口就足够了。E1是左半屏控制,像素点是0-61;E2是右半屏控制,像素是62-121。就是因为该型号屏幕分左、右屏控制,所以在程序控制时是较为复杂的,若令左右屏合并显示,那么在控制时则大大提高了效率,具体实现会在后面例程详细介绍。 (4)8引脚为复位引脚,通过接开发板GPIO口来作用。 (5)9~16引脚是8个引脚,DB0-DB7是用来传递数据的。

2、时序图

12232LCD屏幕时序图 在这里插入图片描述在这里插入图片描述 不太会看时序图的小伙伴可以在某站先小学一会,看个小视频再来这看此时序图介绍。 时序图主要从两个部分来说,分别是意义和时序图转化,如下: (1)首先,先介绍一下时序图的意义在哪。时序图实际上是告诉你,要想使屏幕显示,那么屏幕的各个引脚工作的顺序和时间是咋样的,然后你把时序逻辑告诉单片机,那个谁谁谁要想工作,你得按照什么顺序去控制。 (2)时序图转化。 左、右屏时序逻辑是一样的。 要想使屏幕显示,一定是一个数据对应一个指令,缺一不可。A0是控制屏幕发送数据或指令,A0=0发送指令,A0=1发送数据。如时序图中所示,每个引脚中高线表示1,低线表示0,那么指令和数据时序转化分别如下: 指令时序: A0=0; RW=0; E1=0;(这里以左屏为例) write DB0~DB7=1;(单片机向屏幕八个数据口写数据,高电平有效) 延迟2ms; E1=1; 延迟2ms; E1=0; 数据时序: A0=1; RW=0; E1=0;(这里以左屏为例) write DB0~DB7=1;(单片机向屏幕八个数据口写数据,高电平有效) 延迟2ms; E1=1; 延迟2ms; E1=0;

这里我是将时序图用大白话转化成了上式,具体代码实现在以下例程中详细给出。

二、屏幕接线原理图

要注意,stm32fxx开发板要用电源供电,因为仿真器(下载器)给开发板供电时电流会不稳定,影响屏幕显示效果。

stm32fxx开发板与12232LCD接线图如下: 在这里插入图片描述

引脚接线分别是: GND-Vss 5V-Vdd GND-B20K-V0 GBIOB11-E2 GBIO12-A0 GBIO13-RW GBIO14-E1 GBIO0~GBIO7分别接DB0-DB7 注意:以上是我写程序的引脚,小伙伴们可以根据实际情况自由分配接线引脚。

三、屏幕并口显示效果

在这里插入图片描述 可通过调节电位器使屏幕显示最佳的效果。

四、示例程序

实例程序如下: LCD.h

#ifndef __LCD_H #define __LCD_H #define LCD_RST(x) GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(x)) #define LCD_E1(x) GPIO_WriteBit(GPIOB, GPIO_Pin_14, (BitAction)(x)) #define LCD_E2(x) GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)(x)) #define LCD_RW(x) GPIO_WriteBit(GPIOB, GPIO_Pin_13, (BitAction)(x)) #define LCD_RS_a0(x) GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)(x)) #define DATA 0xff //数据传输8个引脚 #define DATA_PORT GPIOA //使用GPIO分组,使用PA口 void GPIO_Configuration(void); //GPIO端口初始化 void LCD_Init(void); //LCD初始化 void check_busy_L(void);//LCD左屏忙检测 void check_busy_R(void);//LCD右屏忙检测 /****** 分别给左、右屏写数据和指令 **/ void write_ld(u8 dat); void write_li(u8 cmd); void write_rd(u8 dat); void write_ri(u8 cmd); void set_page(u8 page0,u8 page1); //设置页和列 void set_addr(u8 address0,u8 address1); void display_charL(u8 ch); //左画字节 void display_charR(u8 ch); //右 void LCD_clear(void);//清屏 void ZF_disp(u8 pag,u8 col,u8 *content,u8 size); #endif

LCD.c

#include "stm32f4xx.h" #include "LCD.h" u8 i,j,k,Disp_Page; void GPIO_Configuration(void) //GPIO端口初始化 { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,ENABLE); //A、B口使能 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType=GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //RST、E1、E2、RW、RS 控制 //PB0、PB11~PB14 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; GPIO_Init(GPIOB,&GPIO_InitStruct); //DB0~DB7 数据DATA //PA0~PA7 GPIO_InitStruct.GPIO_Pin=DATA; GPIO_Init(DATA_PORT,&GPIO_InitStruct); } //LCD忙检测 void check_busy_L(void) { uint8_t D; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = DATA; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init( DATA_PORT,&GPIO_InitStructure ); LCD_RS_a0(0); D = ((GPIO_ReadInputData(DATA_PORT) & 0xff00)>>8); LCD_RW(1); if((D & 0x80) == 0x80) { LCD_E1(1); LCD_E1(0); } else; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = DATA; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init (DATA_PORT,&GPIO_InitStructure); } //右屏幕忙检测 void check_busy_R(void) { uint8_t D; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = DATA; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init ( DATA_PORT, &GPIO_InitStructure ); LCD_RS_a0(0); D = ((GPIO_ReadInputData(DATA_PORT) & 0xff00)>>8); LCD_RW(1); if((D & 0x80) == 0x80) { LCD_E2(1); LCD_E2(0); } else; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = DATA; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init ( DATA_PORT, &GPIO_InitStructure ); } void write_ld(u8 dat) //写数据给左屏 { check_busy_L(); LCD_RS_a0(1); LCD_RW(0); LCD_E1(0);//初始状态下为低电平 GPIO_Write(DATA_PORT,dat); delay_ms(2); LCD_E1(1); delay_ms(2); LCD_E1(0); } void write_li(u8 cmd) //写指令给左屏 { check_busy_L(); LCD_RS_a0(0); LCD_RW(0); LCD_E1(0);//初始状态下为低电平 GPIO_Write(DATA_PORT,cmd); delay_ms(2); LCD_E1(1); delay_ms(2); LCD_E1(0); } void write_rd(u8 dat) //写数据给右屏 { check_busy_R(); LCD_RS_a0(1); LCD_RW(0); LCD_E2(0);//初始状态下为低电平 GPIO_Write(DATA_PORT,dat); delay_ms(2); LCD_E2(1); delay_ms(2); LCD_E2(0); } void write_ri(u8 cmd) { check_busy_R(); LCD_RS_a0(0); LCD_RW(0); LCD_E2(0);//初始状态下为低电平 GPIO_Write(DATA_PORT,cmd); delay_ms(2); LCD_E2(1); delay_ms(2); LCD_E2(0); } void LCD_Init(void) { LCD_RST(0); delay_ms(100); LCD_RST(1); delay_ms(100); write_li(0XE2); write_ri(0XE2);//复位 write_li(0XAE); write_ri(0XAE);//关显示指令 write_li(0XA4); write_ri(0XA4);//正常工作状态设置 write_li(0XA9); write_ri(0XA9);//1/32占空比 write_li(0XA0); write_ri(0XA0);//时钟线输出 write_li(0XEE); write_ri(0XEE);//写模式 write_li(0XC0); write_ri(0XC0); //设置起始行 LCD_clear(); write_li(0XAF); write_ri(0XAF); //开显示指令 } void set_page(u8 page0,u8 page1) //同时设置主从显示页为0-3页 { write_li(0xB8|page1); write_ri(0xB8|page0); } void set_addr(u8 address0,u8 address1) //同时设置主从列地址为0-121 { write_li(address1); write_ri(address0); } void display_charL(u8 ch) //在左页当前地址画一个字节8个点 { write_ld(ch); } void display_charR(u8 ch) //在右页画一个字节 { write_rd(ch); } void LCD_clear(void) //清除函数 { u8 i,page; for (page=0;page display_charR(0); display_charL(0); } } } //屏幕显示函数 void ZF_disp(u8 pag,u8 col,u8 *content,u8 size) { u8 col1; u16 zf_cnt=0; if(size>8&&size if(col>=0&&col for(j=0;j for(j=0;j col1=col-62; Disp_Page=i|0xb8; write_ri(Disp_Page); write_ri(col1); if(size==12) { for(j=0;j for(j=0;j for(i=pag;i Disp_Page=i|0xb8; write_li(Disp_Page); write_li(col); if(size==8) { for(j=0;j col1=col-62; Disp_Page=i|0xb8; write_ri(Disp_Page); write_ri(col1); if(size==8) { for(j=0;j {0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},/*"H",0*/ {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00},/*"e",1*/ {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",2*/ {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"o",3*/ }; #endif

main.c

#include "stm32f4xx.h" #include "usart.h" #include "delay.h" #include "LCD.h" #include "LCDFont.h" int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2 delay_init(168); //初始化延时函数 GPIO_Configuration(); LCD_Init(); LCD_clear(); while(1) { ZF_disp(2,0,ASII_16081[0],16); ZF_disp(2,8,ASII_16081[1],16); ZF_disp(2,16,ASII_16081[2],16); ZF_disp(2,24,ASII_16081[2],16); ZF_disp(2,32,ASII_16081[3],16); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3