ARM STM32F103VCT6驱动LCD屏12864实例

xiaoxiao2021-02-28  94

条件:ARM STM32F103VCT6芯片,开发平台keil5.20,ARM固件版本V3.50, LCD12864(ks0108) 并行通信。 第一步:端口初始化设置

/******************** *************************** *文件名:lcd.c * 描述:lcd 应用函数库 * 硬件连接:--------------------------------------------- * | PC4 - LCMRS PC5 - LCMRW | * | PD9 - LCMCS1 PD10 - LCMCS2 PD11 - lCDK | * | PE7 - LCME PD8 - LCMRESET | * | PE8-PE15---data | * ---------------------------------------------- * 库版本:ST3.5.0 *************************************************/ void GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOC的外设时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); /*选择要控制的GPIOC引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOC*/ GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE); /*选择要控制的GPIOD引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE); /*选择要控制的GPIOD引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; /*设置引脚模式为浮空输入*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); /*选择要控制的GPIOE引脚*/ GPIO_InitStructure.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_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); /*选择要控制的GPIOE引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); } /******************** *************************** *文件名:lcd.h * 描述:lcd 头文件 * 引脚定义 * 库版本:ST3.5.0 *************************************************/ #ifndef __LED_H #define __LED_H #define ON 1 #define OFF 0 #define LCMCS1(a) if (a) \ GPIO_SetBits(GPIOD,GPIO_Pin_9);\ else \ GPIO_ResetBits(GPIOD,GPIO_Pin_9) #define LCMCS2(a) if (a) \ GPIO_SetBits(GPIOD,GPIO_Pin_10);\ else \ GPIO_ResetBits(GPIOD,GPIO_Pin_10) #define LCMRS(a) if (a) \ GPIO_SetBits(GPIOC,GPIO_Pin_4);\ else \ GPIO_ResetBits(GPIOC,GPIO_Pin_4) #define LCMRW(a) if (a) \ GPIO_SetBits(GPIOC,GPIO_Pin_5);\ else \ GPIO_ResetBits(GPIOC,GPIO_Pin_5) #define LCME(a) if (a) \ GPIO_SetBits(GPIOE,GPIO_Pin_7);\ else \ GPIO_ResetBits(GPIOE,GPIO_Pin_7) #define BACKLINGT(a) if (a) \ GPIO_SetBits(GPIOD, GPIO_Pin_11); \ else \ GPIO_ResetBits(GPIOD, GPIO_Pin_11) void GPIO_Config(void);//GPIO初始化 #endif

第二步:LCD初始化

void lcd_init(void) { GPIO_ResetBits(GPIOD, GPIO_Pin_8); //LCD不复位 LCMRESET=0 delay_ms(2); GPIO_SetBits(GPIOD, GPIO_Pin_8); //LCD复位 LCMRESET=1 lcd_write_cmd(LCD_L,0x3e);//关显示 lcd_write_cmd(LCD_L,0x3f);//开显示 lcd_write_cmd(LCD_L,0xc0);//起始行 0-63 lcd_write_cmd(LCD_R,0x3e);//关显示 lcd_write_cmd(LCD_R,0x3f);//开显示 lcd_write_cmd(LCD_R,0xc0);//起始行 0-63 lcdclear(); //Clear Screen lcd_set_xy(0,0);// }

第三步:LCD写命令

void lcd_write_cmd(unsigned char page,int data) { if(page==0) { LCMCS1( OFF ); //左半屏 LCMCS2( ON );//右半屏 } else { LCMCS1(ON); //左半屏 LCMCS2(OFF);//右半屏 } while(check_lcd_busy()); LCMRS( OFF ); LCMRW( OFF ); data=data<<8; GPIOE->ODR=((GPIOE->ODR & 0x00FF)|(data&0xFF00));//PE15-8是数据位,PE0-7是控制位,控制位的数据不能变。 LCME( OFF ); Delay(0x01); LCME( ON ); //E信号下降沿锁存D7-D0数据 Delay(0x01); LCME( OFF ); Delay(0x01); }

第四步:查忙状态

int check_lcd_busy(void) { int data; LCD_DATA_INPUT(); LCMRS( OFF ); LCMRW( ON ); LCME( OFF ); Delay(0x01); LCME( ON ); Delay(0x01); data=GPIOE->IDR; LCME( OFF ); Delay(0x01); data=data&0x8000; LCD_DATA_OUT(); return data; }

第五步:写数据

void lcd_write_data(int data) { if(FLAG_ME==7) { FLAG_ME=0; ColY=ColY-6; PageX=PageX+1; } if(FLAG_ME2==13) { FLAG_ME2=0; ColY=ColY-12; PageX=PageX+1; } lcd_set_xy(PageX,ColY); while(check_lcd_busy()) {;} LCMRS( ON ); LCMRW( OFF ); data=data<<8; GPIOE->ODR=((GPIOE->ODR & 0x00FF)|(data&0xFF00));//PE15-8是数据位,PE0-7是控制位,控制位的数据不能变。 LCME( OFF ); Delay(0x01); LCME( ON ); //E信号下降沿锁存D7-D0数据 Delay(0x01); LCME( OFF ); Delay(0x01); ColY++; //Y地址+1; }

第六步:开始显示

void start_screen(void) { lcd_string_xy_asc(3,4*12,"LCD TEST"); // 显示:LCD TEST delay_ms(2000); }
转载请注明原文地址: https://www.6miu.com/read-24682.html

最新回复(0)