【液晶屏12232LCD并口显示】STM32Fxx驱动DS12232 |
您所在的位置:网站首页 › 8080并口驱动lcd › 【液晶屏12232LCD并口显示】STM32Fxx驱动DS12232 |
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32Fxx驱动DS12232-2LCD并口显示 前言一、12232LCD基本介绍1、引脚说明2、时序图 二、屏幕接线原理图三、屏幕并口显示效果四、示例程序 前言最近上手使用stm32fxx系列开发板驱动DS12232LCD屏来显示内容,12232LCD是比较古老的点阵显示屏,屏幕控制显示比较复杂,且网上的显示例程较少,多是c51驱动显示。在这里我是使用stm32来驱动显示,系统总结一下该类型屏幕显示的过程和实现程序。在下知识有限,有错误的地方还望纠正,闲话少说,接下来进入正题。 一、12232LCD基本介绍12232LCD屏幕实际上是列x行为122x32像素的点阵显示屏幕,要根据产品使用手册来用,手册使用关键要看两个部分,分别是屏幕引脚说明、时序图,如下: 1、引脚说明DS12232LCD引脚图如下:
(3)4~7引脚是屏幕指令控制。这里我主要说一下E1、E2引脚,其余引脚根据表图介绍,会接stm32fxx开发板GPIO口就足够了。E1是左半屏控制,像素点是0-61;E2是右半屏控制,像素是62-121。就是因为该型号屏幕分左、右屏控制,所以在程序控制时是较为复杂的,若令左右屏合并显示,那么在控制时则大大提高了效率,具体实现会在后面例程详细介绍。 (4)8引脚为复位引脚,通过接开发板GPIO口来作用。 (5)9~16引脚是8个引脚,DB0-DB7是用来传递数据的。 2、时序图12232LCD屏幕时序图 这里我是将时序图用大白话转化成了上式,具体代码实现在以下例程中详细给出。 二、屏幕接线原理图要注意,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); #endifLCD.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*/ }; #endifmain.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 |