基于STM32--LCD12864驱动程序

合集下载

基于某STM32LCD12864驱动程序

基于某STM32LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼标签:杂谈#ifndef LCD12864_H#define LCD12864_H#define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口#define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口#define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用#define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13#define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14#define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15#define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟#define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平#define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平#define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平#define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平#define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平#define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平#define LCD_RESET_0 LCD_CONTROL->BRR = LCD_RESET_Pin // 复位#define LCD_RESET_1 LCD_CONTROL->BSRR = LCD_RESET_Pin // 复位脚拉高#define DATAOUT LCD_DATAPORT->ODR &=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器#define DATAIN LCD_DATAPORT->IDR // 数据输入寄存器#define LCD_BF ((DATAIN)& 0x0080) // 忙状态void LCD_delayus(unsigned long n); //延时n(us)void LCD_delayms(unsigned long n); //延时n(ms)void LCD_WriteInitcmd(uint8_t initcmd); //写初始化命令void LCD_WaitLaisure(void); //一直等待到LCD内部操作完成,变为空闲状态void LCD_Writecmd(uint8_t cmd); //写命令到LCD12864void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864void LCD_pos(uint16_t pos); //LCD显示位置设置void LCD_Setpos(uint16_t row,uint16_t col);//设定LCD12864的显示地址,根据习惯void LCD_DispChar(char ch); //显示一个字符void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch);//在指定位置显示一个字符void LCD_DispString(char str[]); //显示一个字符串,显示位置需提前设定//在指定位置显示一个字符串void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str[]);void LCD_Dispnum(uint32_t num); //显示一个不超过8位的整数,显示位置需提前设置//在指定位置显示一个不超过8位的整数void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num);void LCD_DispDecimal(uint32_t num,uint16_t dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定//在指定位置显示一个有效位不超过8位的浮点数void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot);//显示日历,显示日期与时间void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec);void LCD_DispPicture(const unsigned char picture[]); //显示一幅图像128*64//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(void);//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void);//清屏,清除显示void LCD_Clear(void);//使光标还回原点位置void LCD_Return(void);//关显示void LCD_Close(void);//开显示void LCD_Open(void);void LCD_FlickerChar(uint16_t row,uint16_t col);//关闭字符闪烁void LCD_CloseFlicker(void);//屏幕秒闪烁一次void LCD_FlickerScreen(void);void LCD_PORT_Init(void); //LCD连接端口初始化void LCD_Init(void); //LCD配置初始化#endif#include "stm32f10x.h"#include "stm32f10x_gpio.h"#include "LCD12864.h"#include "picture.h"//延时n(us)void LCD_delayus(unsigned long n){unsigned long j;while(n--){ j=8;while(j--);}}//延时n(ms)void LCD_delayms(unsigned long n){while(n--)LCD_delayus(1100);}//写初始化命令void LCD_WriteInitcmd(uint8_t initcmd){LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= initcmd;LCD_delayus(600);LCD_EN_0;LCD_RW_1;}//一直等待到LCD内部操作完成,变为空闲状态void LCD_WaitLaisure(void){uint16_t flag=0x00;LCD_RS_0;LCD_RW_1;do{LCD_EN_0;LCD_delayus(5);LCD_EN_1;LCD_delayus(5);flag=(uint16_t)LCD_BF;}while(flag);}//写命令到LCD12864void LCD_Writecmd(uint8_t cmd){LCD_WaitLaisure();LCD_RS_0;LCD_RW_0;LCD_EN_1;DATAOUT |= cmd;LCD_delayus(600); //经过测试,取600。

stm32-12864并行驱动程序

stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。

#include "display12864.h"f/********** 以下是相关引脚定义。

**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。

#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。

*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。

STM32串行驱动12864液晶

STM32串行驱动12864液晶

STM32串⾏驱动12864液晶⾃⼰参考⼤神们的程序改写的液晶驱动,希望对有需要的⼈能有帮助#include "stm32f10x.h"static __IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(__IO uint32_t nTime);#define Line1 0x80//液晶第⼀⾏#define Line2 0x90//液晶第⼆⾏#define Line3 0x88//液晶第三⾏#define Line4 0x98//液晶第四⾏#define LCD_IO GPIOE //我⽤的是E.2 E.3 E.4 E.5 E.6#define CS GPIO_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) //将对应管脚输出⾼电平#define RESET(n) GPIO_ResetBits(GPIOE,n)//输出低电平#define CMD (uint32_t)0xf8000000 //串⾏写⼊的是命令要先写⼊0xf8 #define DATE (uint32_t)0xfa000000 // 串⾏写⼊数据要先写⼊0xfavoid LCD_IOinit_OUT() //推挽输出模式,管脚配置,不多解释,库函数有{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_IO, &GPIO_InitStructure);}void LCD_Write(uint32_t cmd,uint8_t ddata)//LCD 写函数{uint32_t temp=cmd;uint32_t i;RESET(CS); //⽚选拉低temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);SET(CS); //⽚选拉⾼,开始传输数据for(i=0;i<24;i++){if(temp&0x80000000)SET(RW); //取出最⾼位,如果是1,那么RW就写1 else RESET(RW); //如果是0 RW就写0SET(CLK);//向液晶写数据是在下降沿写⼊的Delay(2);//稍作延时RESET(CLK);//拉低产⽣下降沿,写⼊数据temp=temp<<1;//左移⼀位,写⼊下⼀位}RESET(CS); //拉低⽚选,写⼊数据完毕}void Display(uint8_t addr,uint8_t *hz){LCD_Write(CMD,addr);Delay(3);while(*hz!='\0'){LCD_Write(DA TE,*hz);hz++;Delay(3);}}void LCD_init()//液晶初始化{RESET(CS); //拉低⽚选RESET(PSB);//PSB拉低,表⽰是串⾏,拉⾼则是并⾏RESET(RST);//拉低RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);//8位数据传输Delay(40);LCD_Write(CMD,0x0c);//显⽰开,游标开Delay(40);LCD_Write(CMD,0x01);//清屏Delay(40);LCD_Write(CMD,0x06);//进⼊点设定AC+1Delay(40);}int main(){RCC_Configuration();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms⼀次LCD_IOinit_OUT();LCD_init();while(1){Display(Line1,"你妹");Display(Line2,"你妹");Display(Line3,"你妹妹");Display(Line4,"完事了,哈哈哈哈哈");}}void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); }void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/*temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);重点解释⼀下这⾥,从串⾏时序图中可以看出,发送⼀个指令需要三个字节,第⼀个是0xf8或者0xfa这个根据你要发送的是命令还是数据⽽定,然后发送下⼀个数据的⾼四位和第四位,但是数据都是在⾼四位上⾯,⽤51的话我们要分三次发送,但是32的话⼀个字节可以是32位的/所以我们⼀次就能完成,这也是为什么下⾯的i<24的原因因为最后的8位没有⽤,例如:我们发送指令0x35,则应该是这样0xf8然后0x30然后0x50,这个应该很好理解所以看⼀下上⾯的语句⾸先我们cmd的值应该为0xf8000000,这个宏定义有的,这是发送命令然后我们让cmd=temp;在把temp和后⾯的计算结果做按位或运算.⾸先看这个(uint32_t)(ddata&(uint8_t)0xf0)<<16)我们的ddtate是0x35他和0xf0按位与之后/变为0x30然后左移16位变成0x30 0000;再强制转换为32位,就把⾼位补零变为0x00 30 0000再看这句话(uint32_t) (ddata&(uint8_t)0x0f)<<12)我们的ddtate是0x35他和0x0f按位与/之后变为0x05,左移12位0x05 000 强制转换为32位⾼位补零0x000 05 000 /在和前⾯的相加就是0x00 30 0000+0x000 05 000=0x0030 5000然后在和前⾯的0xf8000000按位或变为0xf830 5000 液晶读这个数据的时候是⼋位⼋位的读取所以在液晶看来是分四次的0xf8 0x30 0x50 0x00显然后⼋位没⽤所以我们只取前⾯的24位//应该能看懂了把结合时序图还有延时⼀定要精确⼤家有看不懂的可以给我留⾔*/。

stm32驱动lcd12864程序

stm32驱动lcd12864程序

stm32驱动lcd12864程序预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制#include "12864.h"#include "sys.h"#include "delay.h"#include "usart.h"void p_out(void) //把PB命令端口配置成输出{rs();wr();en();psb();}void wr_outite_cmd(u8 cmd) //写命令{p_out();data_out(); //把PB数据端口配置成输出rs_out=0;wr_out=0;en_out=0;GPIOB->ODR=((GPIOB->ODR&0X00FF)|(cmd<<8));delay_ms(10);en_out=1;delay_ms(10);en_out=0;}void wr_outite_data(u8 dat) //写数据{p_out();data_out();rs_out=1;wr_out=0;en_out=0;GPIOB->ODR=((GPIOB->ODR&0X00FF)|(dat<<8)); //把dat 给PB高八位delay_ms(10);en_out=1;delay_ms(10);en_out=0;}void LCDClear(void){wr_outite_cmd(0x01); //显示清屏delay_ms(5);wr_outite_cmd(0x34); // 显示光标移动设置delay_ms(5);wr_outite_cmd(0x30); // 显示开及光标设置delay_ms(5);}void locate_x_y(u8 x,u8 y)//指定显示坐标{u8 x2=0;x2=x;if(y<1) y=1;if(y>4) y=4;x&=0x0f;switch(y){case 1:x2|=0x80;break;case 2:x2|=0x90;break;case 3:x2|=0x88;break;case 4:x2|=0x98;break;}wr_outite_cmd(x2);delay_ms(10);}void lcd_init(void){wr_outite_cmd(0x30);delay_ms(10);wr_outite_cmd(0x01);delay_ms(10);wr_outite_cmd(0x06);delay_ms(10);wr_outite_cmd(0x0c);delay_ms(10);}void DisInt(u8 x,u8 y,int fnum) //显示整型变量的函数,最多显示16位的整数。

使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864

使用stm32 SPI总线控制LCD12864一、SPI初始化/****************************************************************************** ** Function Name : SPI1_Init* Description : Initializes the peripherals used by the SPI FLASH driver.* Input : None* Output : None* Return : None******************************************************************************* /void SPI1_Init(void){SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable SPI1 and GPIO clocks *//*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIOand SPI_FLASH_SPI_SCK_GPIO Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);/*!< SPI_FLASH_SPI Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/*!< Configure SPI_FLASH_SPI pins: SCK */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI pins: MISO */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI pins: MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOA, &GPIO_InitStructure);/*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/* SPI1 configuration */// Data on the DO and DIO pins are clocked out on the falling edge of CLK.SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1 */SPI_Cmd(SPI1, ENABLE);}二、LCD12864头文件#ifndef __LCD12864_H__#define __LCD12864_H__#include "stm32f10x.h"#define DisIO GPIOA#define DisClk RCC_APB2Periph_GPIOA#define IOData GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7#define CS_H GPIO_SetBits(GPIOA,GPIO_Pin_4) //CS=1 PIN4#define CS_L GPIO_ResetBits(GPIOA,GPIO_Pin_4) //CS=0#define SID_H GPIO_SetBits(GPIOA,GPIO_Pin_7) //SID=1 PIN5#define SID_L GPIO_ResetBits(GPIOA,GPIO_Pin_7); //SID = 0#define CLK_H GPIO_SetBits(GPIOA,GPIO_Pin_5); //CLK = 1.PIN6#define CLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_5); //CLK = 0void LCD_Init(void); //液晶初始化void LCD_Wdata(u8 data); //液晶写入数据void LCD_Wcmd(u8 cmd); //液晶写入指令void LCD_Clr(void); //清屏void DisNum(u8 x_add,u8 y_add,u8 num); //指定位置写入数字void display(unsigned char x_add,unsigned char *ptr); //指定位置写入字符串void DisStr(u8 x_add,u8 y_add,u8 *ptr); //指定位置写入字符串三、u8 SPI_SendByte(u16 data){while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI1->DR=data; //送数据return 0;}void LCD_Write(u8 data){SPI_SendByte(data&0xf0); //发送高四位SPI_SendByte((data<<4)&0xf0); //发送低四位}void LCD_Wcmd(u8 cmd){CS_H;SPI_SendByte(0xf8); //表示要发送的是指令LCD_Write(cmd);CS_L;}void LCD_Clr(){LCD_Wcmd(0x01);}void LCD_Wdata(u8 data){CS_H;SPI_SendByte(0xfa); //表示要发送的是数据LCD_Write(data);CS_L;}void DisNum(u8 x_add,u8 y_add,u8 num){u8 temp,i=0;temp=num;temp/=10;while(temp){i++;temp /= 10;}if(y_add==1) //第一行{LCD_Wcmd(x_add+0x80);}else if(y_add==2) //第二行{LCD_Wcmd(x_add+0x90);}else if(y_add==3) //第三行{LCD_Wcmd(x_add+0x80+0x08);}else //第四行LCD_Wcmd(x_add+0x90+0x08);if(i==1 || num==0)LCD_Wdata(num+0x30);else if(i==2){LCD_Wdata(num/10+0x30);LCD_Wdata(num%10+0x30);}else{LCD_Wdata(num/100+0x30);LCD_Wdata(num%100/10+0x30);LCD_Wdata(num%10+0x30);}}void display(unsigned char x_add,unsigned char *ptr){LCD_Wcmd(x_add);while(*ptr != '\0'){LCD_Wdata(*ptr);++ptr;}}void DisStr(u8 x_add,u8 y_add,u8 *ptr){if(y_add==1) //第一行{LCD_Wcmd(x_add+0x80);else if(y_add==2) //第二行{LCD_Wcmd(x_add+0x90);}else if(y_add==3) //第三行{LCD_Wcmd(x_add+0x80+0x08);}else //第四行LCD_Wcmd(x_add+0x90+0x08);while(*ptr != '\0'){LCD_Wdata(*ptr);++ptr;}}void LCD_Init(void){CS_L;SPI1_Init();Delay_us(2000);LCD_Wcmd(0x30);//基本指令集LCD_Wcmd(0x0c);LCD_Wcmd(0x01);LCD_Wcmd(0x02);LCD_Wcmd(0x80);}。

STM32驱动12864液晶屏

STM32驱动12864液晶屏

STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00 ,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till pll used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。

基于STM32的12864的串行程序

基于STM32的12864的串行程序
#include"stm32f10x_gpio.h"
#include"stm32f10x_rcc.h"
#include"12864header.h"
GPIO_InitTypeDef GPIO_InitStructure;
#define DELAY_2N 0
void Init_lcd(void)
{
//***************液晶接口初始化***********//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
void SendEData(unsigned char Data)
{
unsigned char q,w,i;
w=Data;
q=2;
set_cs() ;
while(q--)
{
for(i=0;i<4;i++)
{
w="Data"&0x80;
set_clk();
set_sid();
clr_clk();
set_clk();
clr_sid();
clr_clk();
set_clk();
SendEData(*h);
}
}//send hanzi
/*--------------------------------------------------
函数说明:写字符

stm32-12864并行驱动程序

stm32-12864并行驱动程序

//////////////////////////////////////////////////////////////////////////////////stm32-12864并行驱动程序////////////////////////////////////////////////////#include "delay.h" //必须配合delay.c 和delay.h 文件使用,所以要包含delay.h。

#include "display12864.h"f/********** 以下是相关引脚定义。

**************/// A 口的#define DisIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClk RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define DataGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7//定义12864 使用的数据引脚。

#define EN GPIO_Pin_10 //定义使能端使用的引脚/*********************************************/#define DisIOIO GPIOE //定义12864 要使用的I/O 端口。

#define DisClkIO RCC_APB2Periph_GPIOE //定义12864 要使用的I/O 端口的时钟。

#define RS #define RW GPIO_Pin_9GPIO_Pin_8/*光标定位函数定义结束。

*/#define x1 0x80#define x2 0x88#define y 0x80GPIO_InitTypeDef GPIOStru; //定义用于定义所以引脚为输出的变量。

基于STM32系列的12864显示

基于STM32系列的12864显示

基于STM32系列的12864显示/*-----------------------------------------------LCD初始化------------------------------------------------*/void CS_Set_H( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_13);}void CS_Set_L( ) //RS{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_13);}void SCLK_Set_H( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SCLK_Set_L( ) //E{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_1);}void SID_Set_H( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void SID_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_0);}void PSB_Set_L( ){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_2);}/*--------------------------------按照液晶的串口通信协议,发送数据----------------------------------*/void LCD_SendByte(unsigned byte){unsigned i;for(i=0;i<8;i++){SCLK_Set_L();if(byte&0x80){SID_Set_H();}else{SID_Set_L();}LCD_Delay(1);SCLK_Set_H();byte<<=1;LCD_Delay(1);}}/*--------------------------------写串口命令,分三个字节完成----------------------------------*/void LCD_WriteCom(unsigned com){CS_Set_H(); //打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(com&0xf0);//第二字节LCD_SendByte((com<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------写数据,分三个字节完成----------------------------------*/void LCD_WriteData(unsigned date){CS_Set_H();//打开片选,高电平有效LCD_Delay(5); //检测忙LCD_SendByte(0xf8);//第一字节LCD_SendByte(date&0xf0);//第二字节LCD_SendByte((date<<4)&0xf0);//第三字节CS_Set_L();}/*--------------------------------LCD初始化----------------------------------*/void LCD_Init(){LCD_Delay(50);PSB_Set_L(); //选择串口通信模式(该端口未定义)LCD_Delay(50);LCD_WriteCom(0x30);//基本指令集动作, 绘图不显示LCD_Delay(50);LCD_WriteCom(0x0c);//开显示,不显示游标和游标位置LCD_Delay(50);LCD_WriteCom(0x01);//清屏LCD_Delay(50);}/*--------------------------------清屏----------------------------------*/void LCD_Clear(){LCD_WriteCom(0x01);//清屏}/*--------------------------------设定显示位置----------------------------------*/void LCD_SetPos(unsigned x,unsigned y){unsigned pos;if(x == 0)x = 0x80;else if(x == 1)x = 0x90;else if(x == 2)x = 0x88;else if(x == 3)x = 0x98;pos = x + y;LCD_WriteCom(pos);//显示地址}/*-----------------------------------------------显示函数------------------------------------------------*/Display(unsigned x,unsigned y,unsigned date) {unsigned a;unsigned b;unsigned dat;a=x;b=y;dat=date;LCD_SetPos(a,b); LCD_WriteData(dat); }。

LCD12864驱动程序(STM32F103RCT6)

LCD12864驱动程序(STM32F103RCT6)
u8 i = 0;
CS_LOW; RS_DATA; for(i=0;i<8;i++) {
SCLK_LOW; if(data&0x80) {
SDA_HI; } else {
SDA_LOW; } SCLK_HI; data <<= 1; } } /************************************************************************ 函 数 名:void JLX12864_Init(void) 功 能:12864 初始化 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
************************************************************************/ void JLX12864_Init(void) {
GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);
/************************************************************************ 函 数 名:JLX12864_ClearScreen(void) 功 能:清屏 入口参数:无 返 回 值:无 说 明: 作 者:Joe 日 期:2015/1/13 16:33:38 修 改:XX 修改说明:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ************************************************************************/ void JLX12864_ClearScreen(void) {

STM3212864显示驱动程序,,寄存器版

STM3212864显示驱动程序,,寄存器版

头文件#ifndef __12864_H_#define __12864_H_#include"sys.h"//管脚定义,移植修改区//***************************************************************************** *********************************************//#define LCD12864_GPIO GPIOB//#define GPIOCLK RCC_APB2Periph_GPIOB#define RS PBout(0)#define RW PBout(1)#define EN PBout(2)//#define PSB GPIO_Pin_4//#define RST GPIO_Pin_5//#define Busy GPIO_Pin_15//#define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15//#define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5//#define LCD_RS(x) x ? GPIO_SetBits(LCD12864_GPIO,RS): GPIO_ResetBits(LCD12864_GPIO,RS)//#define LCD_RW(x) x ? GPIO_SetBits(LCD12864_GPIO,RW): GPIO_ResetBits(LCD12864_GPIO,RW)//#define LCD_EN(x) x ? GPIO_SetBits(LCD12864_GPIO,EN): GPIO_ResetBits(LCD12864_GPIO,EN)//#define LCD_PSB(x) x ? GPIO_SetBits(LCD12864_GPIO,PSB): GPIO_ResetBits(LCD12864_GPIO,PSB)//#define LCD_RST(x) x ? GPIO_SetBits(LCD12864_GPIO,RST): GPIO_ResetBits(LCD12864_GPIO,RST)//#define Text_Busy GPIO_ReadInputDataBit(LCD12864_GPIO ,Busy) //PBin(7)#define LCD_WriteData(x) {GPIOC->BSRR = x & 0x00ff;GPIOC->BRR = ((~x)) & 0x00ff;} //高8位的数据//#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据void LCD12864_Init(void); //硬件端口初始化void LCD12864_InitPort(void); //硬件端口初始化void NOP(void); //延时函数u8 LCD12864_busy(void); //检测忙状态void LCD12684_Wcmd(u8 dat); //写指令void LCD12684_Wdat(u8 dat); //写数据void LCD12864_Init(void); //液晶初始化void LCD12864_Clr(void); // 清屏void LCD12864_Pos(u8 x,u8 y); //设置显示位置void LCD12864_PhotoDis(u8 *bmp); // 显示图片void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串void LCD_Shownum(u8 x,u8 y,u8 num);void LCD_Shownum1(u8 num);//***************************************************************************** *****************************************#endif//#include "stm32f10x.h"#include"12864.h"#include"delay.h"/****************************************************************************** ******************//FILE:液晶12864驱动程序//VERS:1.0//AUTHOR:福建师范大学林木泉//DATE:2012/07/11******************************************************************************* *****************//****************************************************************************** ******************@f_name: void LCD12864_InitPort(void)@brief: 初始化硬件端口配置@param: None@return: None******************************************************************************* *****************//*void LCD12864_InitPort(void){GPIO_InitTypeDef GPIO_InitStructure; //定义结构体RCC_APB2PeriphClockCmd(GPIOCLK|RCC_APB2Periph_AFIO, ENABLE); //使能功能复用IO时钟,不开启复用时钟不能显示GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把调试设置普通IO 口GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //IO口初始化函数(使能上述配置)GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure);//GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //初始化IO口配置GPIO_Write(LCD12864_GPIO ,0xffff);} *//****************************************************************************** *************///数据口:PB8~PB15; 命令口:PB0~PB2void LCD12864_InitPort(void){RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟RCC->APB2ENR|=1<<0; //开启辅助时钟GPIOC->CRL&=0X00000000;GPIOC->CRL|=0X33333333;GPIOB->CRL&=0XFFFFF000;GPIOB->CRL|=0X00000333;GPIOB->ODR|=0XFF07;}C文件/****************************************************************************** ******************@f_name: void NOP(void)@brief: 延时函数@param: None@return: None******************************************************************************* *****************/void NOP(void){ u8 i; for(i=0; i<100; i++); }/****************************************************************************** ******************@f_name: u8 LCD12864_busy(void)@brief: 检测忙状态@param: None@return: None******************************************************************************* *****************///u8 LCD12864_busy(void)//{// u8 x;// RS=0;// RW=1;// EN=1;// NOP();// NOP();// x=Text_Busy;// EN=1;// return x;//}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写指令@param: u8 dat 输入指令@return: None******************************************************************************* *****************/void LCD12684_Wcmd(u8 dat){//while(LCD12864_busy()); //忙检测RS=0;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;NOP();NOP();}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写数据@param: u8 dat 输入数据@return: None******************************************************************************* *****************/void LCD12684_Wdat(u8 dat){//while(LCD12864_busy()); //忙检测RS=1;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;}/****************************************************************************** ******************@f_name: void LCD12864_Init(void)@brief: 液晶初始化@param: None@return: None******************************************************************************* *****************/void LCD12864_Init(void){//LCD_PSB(1); //并口方式//LCD_RST(0); //液晶复位低电平有效//delay_ms(3);// LCD_RST(1); //置高电平等待复位//delay_ms(3);LCD12864_InitPort();LCD12684_Wcmd(0x34); //扩充指令操作delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x0c); //显示开,关光标delay_ms(5);LCD12684_Wcmd(0x01); //清除LCD的显示内容delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Clr(void)@brief: 清屏@param: None@return: None******************************************************************************* *****************/void LCD12864_Clr(void){LCD12684_Wcmd(0x34); //扩充指令操作“绘图”delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x01); //清屏delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Pos(u8 x,u8 y)@brief: 设置显示位置@param: u8 x:X轴u8 y:Y轴@return: None******************************************************************************* *****************/void LCD12864_Pos(u8 x,u8 y){u8 pos;if (x==0) {x=0x80;}else if (x==1) {x=0x90;}else if (x==2) {x=0x88;}else if (x==3) {x=0x98;}else x=0x80;pos = x+y ;LCD12684_Wcmd(pos); //显示地址}/****************************************************************************** ******************@f_name: void LCD12864_PhotoDis(u8 *bmp)@brief: 显示图形@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD12864_PhotoDis(u8 *bmp){u8 i,j;LCD12684_Wcmd(0x34); //关闭图形显示for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i); //先写入水平坐标值LCD12684_Wcmd(0x80); //写入垂直坐标值for(j=0;j<16;j++) //再写入两个8位元的数据LCD12684_Wdat(*bmp++);delay_ms(1);}for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i);LCD12684_Wcmd(0x88);for(j=0;j<16;j++)LCD12684_Wdat(*bmp++);delay_ms(1);}LCD12684_Wcmd(0x36); //写完数据,开图形显示}/****************************************************************************** ******************@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)@brief: 显示字符串@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD_ShowString(u8 x,u8 y,const u8 *p){u8 temp;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);temp=*p;while(temp!='\0'){LCD12684_Wdat(temp);temp=*(++p);}}void LCD_Shownum(u8 x,u8 y,u8 num){ u8 number;u8 shi;u8 ge;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}void LCD_Shownum1(u8 num){ u8 number;u8 shi;u8 ge;number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}。

stm32 驱动12864 串行

stm32 驱动12864 串行

// 12864.h#ifndef __LCD12864_H#define __LCD12864_H#include "stm32f10x.h"void Lcd_GPIO_Config(void);void Delaynms(u16 di);void Lcd_Init(void);void Write_Char(u8 start, u8 ddata);void Send_Byte(u8 bbyte);void Clr_Scr(void);void LCD_Set_XY( u8 X, u8 Y );void LCD_Write_String(u8 X,u8 Y,uc8 *s);void LCD_Write_Number(u8 s);void Display_Img(u8 const *img);void Delay_Lcd(u16 us);void Lcd_Global_Config(void);#endif /* __LCD12864_H *///12864.c/****************************************************************************** ************* 文件名称:12864.c* 版权:* 模块名称:st7920驱动的12864液晶的串行工作方式驱动程序* cpu : stm32f103rct6 主频:72M* 作者:* 创建日期:2009-10-15* 功能概要:******************************************************************************* ***********/#include "stm32f10x.h"#include "LCD12864.h"#include "stdio.h"#define SID_H GPIOC->BSRR=GPIO_Pin_11#define SID_L GPIOC->BRR=GPIO_Pin_11#define CS_H GPIOC->BSRR=GPIO_Pin_12#define CS_L GPIOC->BRR=GPIO_Pin_12#define SCLK_H GPIOC->BSRR=GPIO_Pin_10#define SCLK_L GPIOC->BRR=GPIO_Pin_10#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat 1u8 const num_lcd[]={"0123456789 :.-"};void Lcd_Global_Config(void){Lcd_GPIO_Config();Lcd_Init();Clr_Scr();LCD_Set_XY(0,0);}/****************************************************************************** ************* 函数名称:Lcd_init* 功能描述:初始化LCD* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Lcd_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// GPIO_SetBits(GPIOC, GPIO_Pin_12);//预置为高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);}/****************************************************************************** ************* 函数名称:Delaynms* 功能描述:延时* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Delaynms(u16 di){u16 da,db;for(da=0;da<di;da++)for(db=0;db<1500;db++);}/****************************************************************************** ************* 函数名称:Lcd_init* 功能描述:初始化LCD* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Lcd_Init(void){Delaynms(50); //启动等待,等LCM讲入工作状态CS_H;Write_Char(0,0x30); //8 位介面,基本指令集Write_Char(0,0x0c); //显示打开,光标关,反白关Write_Char(0,0x01); //清屏,将DDRAM的地址计数器归零}/****************************************************************************** ************* 函数名称:Write_char* 功能描述:写指令或数据* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Write_Char(u8 start, u8 ddata){u8 start_data,Hdata,Ldata;if(start==0)start_data=0xf8; //写指令elsestart_data=0xfa; //写数据Hdata=ddata&0xf0; //取高四位Ldata=(ddata<<4)&0xf0; //取低四位Send_Byte(start_data); //发送起始信号Delaynms(10); //延时是必须的Send_Byte(Hdata); //发送高四位Delaynms(5); //延时是必须的Send_Byte(Ldata); //发送低四位Delaynms(5); //延时是必须的}/****************************************************************************** ************* 函数名称:Send_byte* 功能描述:发送一个字节* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Send_Byte(u8 bbyte){u8 i,t;for(i=0;i<8;i++){if((bbyte)&0x80)SID_H; //取出最高位elseSID_L;SCLK_H;t = 0x10;while(t--); //延时lcd读取数据SCLK_L;bbyte <<= 1; //左移}}/****************************************************************************** ************* 函数名称:Clr_Scr* 功能描述:清屏函数* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************************/void Clr_Scr(void)//清屏函数{Write_Char(0,0x01);}/****************************************************************************** ************* 函数名称:LCD_set_xy* 功能描述:设置LCD显示的起始位置,X为行,Y为列* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void LCD_Set_XY( u8 X, u8 Y ){u8 address;switch(X){case 0:address = 0x80 + Y;break;case 1:address = 0x80 + Y;break;case 2:address = 0x90 + Y;break;case 3:address = 0x88 + Y;break;case 4:address = 0x98 + Y;break;default:address = 0x80 + Y;break;}Write_Char(0, address);}/****************************************************************************** ************* 函数名称:LCD_Write_string* 功能描述:中英文字符串显示函数* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void LCD_Write_String(u8 X,u8 Y,uc8 *s){LCD_Set_XY( X, Y );while (*s){Write_Char( 1, *s );s ++;Delaynms(1);}}/****************************************************************************** ************* 函数名称:LCD_Write_number* 功能描述:数字显示函数* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void LCD_Write_Number(u8 s)// 数字显示函数{Write_Char(1,num_lcd[s]);Delaynms(1);}/****************************************************************************** ************* 函数名称:img_disp* 功能描述:显示图形* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Display_Img(u8 const *img){u8 i,j;for(j=0;j<32;j++){for(i=0;i<8;i++){Write_Char(comm,0x34); Delaynms(10);Write_Char(comm,y+j); Delaynms(10);Write_Char(comm,x1+i); Delaynms(10);Write_Char(comm,0x30); Delaynms(10);Write_Char(dat,img[j*16+i*2]); Delaynms(10);Write_Char(dat,img[j*16+i*2+1]); Delaynms(10);}}for(j=32;j<64;j++){for(i=0;i<8;i++){Write_Char(comm,0x34); Delaynms(10);Write_Char(comm,y+j-32); Delaynms(10);Write_Char(comm,x2+i); Delaynms(10);Write_Char(comm,0x30); Delaynms(10);Write_Char(dat,img[j*16+i*2]); Delaynms(10);Write_Char(dat,img[j*16+i*2+1]); Delaynms(10);}}Delaynms(10);Write_Char(comm,0x36);}/****************************************************************************** ************* 函数名称:Delay_Lcd* 功能描述:* 参数:参数名称:输入/输出?类型描述** 返回值:******************************************************************************* ***********/void Delay_Lcd(u16 us) //delay time{while(us--);}/*--使用printf----------------------------------------*/int fputc(int ch, FILE *f){Write_Char(1,(u8)ch);return ch;}int fgetc(FILE *f){/* Loop until received a char */while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET));/* Read a character from the USART and RETURN */return (USART_ReceiveData(USART1));}。

基于stm32的LCD12864显示+16个矩阵键盘程序

基于stm32的LCD12864显示+16个矩阵键盘程序
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_9);
for (ii=0;ii<4;ii++)
{
GPIO_ResetBits(GPIOB,heng[ii]);
for(jj=0;jj<4;jj++)
{
delay(50000);
delay(50000);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
}
void GPIO_Cofiguration_12864(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
//delay(50000);
if(GPIO_ReadInputDataBit(GPIOB,ling[jj])==0)
{

基于STM32F103VB下12864LCD驱动

基于STM32F103VB下12864LCD驱动

初学STM32,写一个简单的128*64LCD驱动程序/**************************************************************************** 【功能说明】I/O端口功能、方向设定****************************************************************************/ voidLCD_Port_OutConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|\GPIO_Pin_13|GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}voidLCD_Port_InConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}/**************************************************************************** 【功能说明】LCD 写字节函数入口参数data:" 命令/数据标志(data:写显示数据)****************************************************************************/LCD_WriteData(u16 data){u16 ReadValue;LCD_Port_InConfig();do{LCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));LCD_Port_OutConfig();LCD_D();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);data=0xff00&ReadValue|data;GPIO_Write(GPIO_LCD,data);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/**************************************************************************** 【功能说明】LCD 写指令函数入口参数inst="cmd" 命令(cmd:写控制指令)****************************************************************************/ voidLCD_WriteCmd(u16 cmd){u16 ReadValue;LCD_Port_InConfig();doLCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));//读忙标志LCD_Port_OutConfig();LCD_I();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);cmd=0xff00&ReadValue|cmd;GPIO_Write(GPIO_LCD,cmd);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/************************************************************************** 【功能说明】读Lcd 显示数据**************************************************************************/ u16LCD_ReadData(void){u16 ReadValue;LCD_Port_InConfig();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);LCD_E_1();LCD_D();LCD_R();ReadValue = GPIO_ReadInputData(GPIO_LCD);ReadValue = ReadValue&0x00ff;return ReadValue;}/*****************************************************************************清屏*********************************************************************/voidLCD_Clear(void){u8 i,k;LCD_CS1_H();LCD_CS2_H();for(i=0;i<8;i++){LCD_WriteCmd(0xb8+i);LCD_WriteCmd(0xc0);for(k=0;k<64;k++){LCD_WriteCmd(0x40+k);LCD_WriteData(0x00);LCD_WriteCmd(0x3f);}}}/**************************************************************************** 【功能说明】复位LCD子程序****************************************************************************/ voidLCD_Rest(void){LCD_RET_0();Delay_ms(20);LCD_RET_1();}/*--------------写屏点阵------------------*/voidlat_disp (u8 data1,u8 data2){u8 i,j;LCD_CS1_H();LCD_CS2_H();for(j=0;j<8;j++){LCD_WriteCmd(0xb8+j);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40);for(i=0;i<32;i++){LCD_WriteData(data1);LCD_WriteCmd(0x3f);LCD_WriteData(data2);LCD_WriteCmd(0x3f);//Delay_us(4);}}}/*******************************************************x:显示字体高度(1~8)y:字显示在第y列(点阵16*16,0~3,8*8,0~7)****x1:显示第x1个字y1:字体宽度,宽为y1的点阵row_x显示字体起始行0~7 ****row_y:显示字体高度定义一个字为y1*row_y的点阵***************************************************/voidLCD_disp(u8 x,u8 y,u8 x1,u8 row_x,u8 y1,u8 row_y,u8 *data){u8 i,j;for(j=0;j<x;j++){LCD_WriteCmd(0xb8+j+row_x);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40+y*y1);for(i=0;i<y1;i++){LCD_WriteData(data[i+(x1*row_y+j)*y1]);//Delay_us(4);LCD_WriteCmd(0x3f);}}}。

STM32|基于SPI单向发送的12864驱动程序

STM32|基于SPI单向发送的12864驱动程序

STM32|基于SPI单向发送的12864驱动程序不管是做单片机还是做嵌入式的,要对一块陌生芯片编程是不可避免的工作,那首先要做的第一步必然是阅读其datasheet,然而时序对于我们是最常见的了,只有针对时序编程,才有可能确实某些硬件工作。

今天我们就来讲讲怎么来编写一个特定的时序来驱动硬件,我们就以STM32的载体了。

这里我们选用了一款基于 ST7567 驱动芯片的 128*64 像素 FSTN (格式化超扭曲向列型)液晶,当中不集成任何字库,集成了可独立控制的琥珀色背光板。

之所以选择这样的液晶,是因为其与目前可穿戴设备广泛使用的OLED(有机发光二极管)具有相似的控制原理,并且价格还比 OLED 便宜很多。

我们的引脚控制对应关系是:•PB2:背光开关•PB3:复位•PB4: A0,数据或者命令选择,“1” :写数据,“0” :写命令•PA5: SCL(时钟端)•PA7: SDA(数据端)SPI 可以有效地减少数据端口的连接,便于布板和节约端口资源,因此我们优先推荐。

接下来我们研究一下 LCD 的驱动程序时序图要研究 LCD 的驱动程序,首先必须了解其控制芯片的时序每次需要发出的时候,先要拉低 CS,然后 SDA 发出字节中的最高位的bit,接着 SCLK 进行一次上升沿的变化,然后按照上述内容依次发送其余各位。

在最后全部发送完成数据后,A0 需要根据当前发送的是命令还是数据,进行变化。

发送完成之后, CS 需要拉高,准备下一次字节的发送。

程序实现步骤•初始化相应的 GPIO•写 LCD 的 SPI 写数据程序•写 LCD 的 SPI 写命令程序•初始化 LCD程序的具体实施•初始化相应的GPIO。

在这里,由于我们仅仅用了单向的通讯,即控制信号永远从 MCU 到 LCD,因此只需要配置上面 5 个控制引脚为推挽式输出模式“GPIO_Mode_Out_PP”在定义了以上的初始化程序之后,为了便于后续的操作方便,我们可以采用宏定义的方式来定义每个引脚的高低电平输入输出•编写LCD 的写数据程序。

STM32+lcd12864串行驱动

STM32+lcd12864串行驱动

/****************************************************************************** ****************名称:LCD12864-15B串行显示程序版本:V1.0功能:在显示屏任意位置显示内容软件协议:硬件环境: 主控STM32F103R8T6PB0->ENPB1->RWVCC->RS编写日期:20170812编写人员:NO WAY******************************************************************************* ********************更改日:更内容:更改人员:其它说明:******************************************************************************* ******************/#include "stm32f10x.h"#include "string.h"#include "delay.h"#include "lcd12864.h"int main(void){Delay_int();delay_ms(200);GPIO_Config2();Lcdint();while(1){LCD_Display(0,0,"什么问题导致!");LCD_Display(1,0,"时序不对!");LCD_Display(2,0,"少与了低四位");LCD_Display(3,0,"问题解决了!哈哈");//highlight(1,8,16,60);}}#include "lcd12864.h"char b;/*****LCD屏显示地址*****/uchar addr_tab[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行};/****************************************************************************** ** 函数名:GPIO_Config* 描述: IO配置* 输入:* 输出:* 返回:* 其它:******************************************************************************* /void GPIO_Config2(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=RS|RW|EN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}/****************************************************************************** ** 函数名:Writebyte* 描述:写一个字节函数* 输入:* 输出:* 返回:* 其它:******************************************************************************* /void Writebyte(u8 byte){int i;EN_L;for(i=0;i<8;i++){if(byte&0x80){RW_H;}else{RW_L;}byte=byte<<1;EN_L;EN_H;delay_us(700);}}/****************************************************************************** ** 函数名:Writebyte* 描述:写一个字节函数* 输入:* 输出:* 返回:* 其它:******************************************************************************* /void Writ(u8 cmd ,u8 data){char start_cmd=0,Hdata=0,Ldata=0;if(cmd==0){start_cmd=0xf8;}else{start_cmd=0xfa;}Hdata=data&0xf0;Ldata=(data<<4)&0xf0;Writebyte(start_cmd);Writebyte(Hdata);Writebyte(Ldata);}/****************************************************************************** ** 函数名:Lcdint* 描述:12864初始化程序* 输入:* 输出:* 返回:* 其它:******************************************************************************* /void Lcdint(void){delay_ms(2);Writ(0,0x30);Writ(0,0x0c);Writ(0,0x01);Writ(0,0x06);Writ(0,0x80);}/****************************************************************************** ** 函数名:LCD_Display* 描述:12864(带字库)显示函数* 输入: x,y,*s* 输出:* 返回:* 其它:******************************************************************************* /void LCD_Display(uchar x,uchar y,uchar *s){Writ(0,addr_tab[8*x+y]);while(*s>0){Writ(1,*s);s++;}}void highlight(char x,char y,char width,char mode ) {char i,j,flag=0x00;if(y>1){flag=0x08;y=y-2;}Writ(0,0x34);for(i=0;i<16;i++){Writ(0,0x80+(y<<4)+i);Writ(0,0x80+flag+x);for(j=0;j<width;j++){Writ(1,mode);}}Writ(0,0x36);Writ(0,0x30);}#ifndef _LCD12864_H#define _LCD12864_H#include "stm32f10x.h"#include "delay.h"#include "string.h"#define uint unsigned int#define uchar unsigned char#define RS GPIO_Pin_11#define RW GPIO_Pin_1#define EN GPIO_Pin_0#define RS_H GPIO_SetBits(GPIOB,RS)#define RS_L GPIO_ResetBits(GPIOB,RS)#define RW_H GPIO_SetBits(GPIOB,RW)#define RW_L GPIO_ResetBits(GPIOB,RW)#define EN_H GPIO_SetBits(GPIOB,EN)#define EN_L GPIO_ResetBits(GPIOB,EN)void GPIO_Config2(void);void Writebyte(u8 cmd);void Writ(u8 cmd ,u8 data);void Lcdint(void);void LCD_Display(uchar x,uchar y,uchar *s);void highlight(char x,char y,char width,char mode); #endif。

STM32F4_LCD12864串行并行驱动程序合集

STM32F4_LCD12864串行并行驱动程序合集
u8 CGROM_Code[] = {
//电量100Percent(add_h=0,add_l=0)
0x00,0x00,0x00,0x00,0xFF,0xFE,0x80,0x02,0xB6,0xDA,0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,
0xB6,0xDB,0xB6,0xDB,0xB6,0xDB,0xB6,0xDA,0x80,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00,
//CD图形
//0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0x07,0xc9,0xb3,0x9d,0xb9,0x9f,0xb9,0x9f,0xb9,
//0x9f,0xb9,0x9f,0xb9,0x9d,0xb9,0xc9,0xb3,0xe3,0x07,0xff,0xff,0xff,0xff,0xff,0xff,
* @ File name -> lcd12864.c
* @ Version -> V1.1
* @ Date -> 07-15-2017
* @ Brief -> LCD12864驱动函数
*适用于ST7920驱动芯片
V1.0
* @ Revise -> A、修正操作命令宏定义。
* @ -> B、显示字符串函数增加显示长度选择,即显示多少个ASCII可显示字符,汉字x2即可
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*"2",2*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*"3",3*/

12864 LCD驱动程序

12864 LCD驱动程序

/*LCD.C128×64 LCD驱动程序*/#include <INTRINS.H>#include <ABSACC.H>#include "LCD.H"//定义屏幕光标(取值0~63,光标本身不可见)unsigned char LcdCursor;/*函数:LcdLightOn()功能:点亮背光灯*/void LcdLightOn(){LCD_BL = 1;}/*函数:LcdLightOff()功能:熄灭背光灯*/void LcdLightOff(){LCD_BL = 0;}/*函数:LcdGetBF()功能:读出状态位BF返回:BF=1,表示忙,不可进行任何操作BF=0,表示不忙,可以进行正常操作*/bit LcdGetBF(){unsigned char dat;dat = XBYTE[0xD002]; //XBYTE的定义见<ABSACC.H>return (bit)(dat & 0x80);}/*函数:LcdWriteCmd()功能:向LCD发送命令参数:cmd:命令字,详见器件的数据手册*/void LcdWriteCmd(unsigned char cmd){while ( LcdGetBF() );XBYTE[0xD000] = cmd;}/*函数:LcdWriteDat()功能:向LCD写入数据参数:dat,要写入的数据说明:目标地址由地址计数器AC隐含指定,写完后AC自动加1*/void LcdWriteDat(unsigned char dat){while ( LcdGetBF() );XBYTE[0xD001] = dat;}/*函数:LcdReadDat()功能:从LCD读出数据返回:读出的数据*//*unsigned char LcdReadDat(){volatile unsigned char dat;while ( LcdGetBF() );dat = XBYTE[0xD003];dat = XBYTE[0xD003]; //需要连续执行两次才能够读出真正的数据return dat;}*//*函数:LcdSetAC()功能:设置DDRAM(显示数据RAM)的AC(地址计数器)值参数:ac:地址计数器值,范围0~63*/void LcdSetAC(unsigned char ac){ac &= 0x3F;ac |= 0x80;LcdWriteCmd(ac);}/*函数:LcdClear()功能:LCD清屏,并使光标回到0*/void LcdClear(){LcdWriteCmd(0x01); //清屏命令LcdCursor = 0;}/*函数:LcdDelay()功能:延时(t*100)个机器周期*/void LcdDelay(unsigned char t){unsigned char n;do{n = 49;while ( --n != 0 );} while ( --t != 0 );}/*函数:LcdInit()功能:LCD初始化*/void LcdInit(){LcdWriteCmd(0x30); //设置基本指令集LcdDelay(3);LcdWriteCmd(0x30); //设置基本指令集(需要再执行一次)LcdDelay(1);LcdWriteCmd(0x0C); //开启显示LcdDelay(3);LcdClear(); //清屏LcdDelay(250);LcdWriteCmd(0x06); //设置进入点LcdDelay(10);}/*函数:LcdCheckAC()功能:根据光标位置调整AC*/void LcdCheckAC(){switch ( LcdCursor ){case 16:LcdSetAC(16);break;case 32:LcdSetAC(8);break;case 48:LcdSetAC(24);break;case 64:LcdCursor = 0;LcdSetAC(0);break;default:break;}/*函数:LcdPutChar()功能:显示ASCII码参数:c为可显示的ASCII码(0x20~0x7F)*/void LcdPutChar(unsigned char c){LcdWriteDat(c);LcdCursor++;LcdCheckAC();}/*函数:LcdPutHZ()功能:显示汉字参数:ch,cl:汉字编码*/void LcdPutHZ(unsigned char ch, unsigned char cl){if ( LcdCursor & 0x01 ){//显示汉字时,必须偶地址对准,即光标位置不能是奇数LcdPutChar(' '); //额外输出一个空格}LcdWriteDat(ch);LcdWriteDat(cl);LcdCursor += 2;LcdCheckAC();}/*函数:LcdPuts()功能:显示字符串参数:*s:要显示的字符串(可同时包含ASCII码和汉字)*/void LcdPuts(unsigned char *s){unsigned char ch, cl;for (;;){ch = *s++;if ( ch == '\0' ) break;if ( ch < 0x80 ){LcdPutChar(ch);}else{cl = *s++;LcdPutHZ(ch,cl);}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平
#define LCD_RESET_0 LCD_CONTROL->BRR = LCD_RESET_Pin // 复位
#define LCD_RESET_1 LCD_CONTROL->BSRR = LCD_RESET_Pin // 复位脚拉高
#define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14
#define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15
#define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟
void LCD_DispChar(char ch); //显示一个字符
void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch);//在指定位置显示一个字符
void LCD_DispString(char str[]); //显示一个字符串,显示位置需提前设定
//在指定位置显示一个字符串
void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str[]);
void LCD_Dispnum(uint32_t num); //显示一个不超过8位的整数,显示位置需提前设置
//在指定位置显示一个不超过8位的整数
#define DATAOUT LCD_DATAPORT->ODR &=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器
#define DATAIN LCD_DATAPORT->IDR // 数据输入寄存器
#define LCD_BF ((DATAIN)& 0x0080) // 忙状态
void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num);
void LCD_DispDecimal(uint32_t num,uint16_t dot);//显示一个有效位不超过8位的浮点数,显示位置需要数
void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot);
//显示日历,显示日期与时间
void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec);
void LCD_DispPicture(const unsigned char picture[]); //显示一幅图像 128*64
//屏幕整体左移一格,用于滚动显示
#define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平
#define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平
#define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口
#define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用
#define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13
基于STM32--LCD12864驱动程序
STM32 LCD12864驱动程序(头文件) (2012-05-29 21:25:08)转载▼
标签: 杂谈
#ifndef LCD12864_H
#define LCD12864_H
#define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口
#define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平
#define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平
#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟
#define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平
void LCD_delayus(unsigned long n); //延时 n(us)
void LCD_delayms(unsigned long n); //延时 n(ms)
void LCD_WriteInitcmd(uint8_t initcmd); //写初始化命令
void LCD_WaitLaisure(void); //一直等待到LCD内部操作完成,变为空闲状态
void LCD_Writecmd(uint8_t cmd); //写命令到LCD12864
void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864
void LCD_pos(uint16_t pos); //LCD显示位置设置
void LCD_Setpos(uint16_t row,uint16_t col);//设定LCD12864的显示地址,根据习惯
相关文档
最新文档