基于STM32-LCD12864驱动程序_第1页
基于STM32-LCD12864驱动程序_第2页
基于STM32-LCD12864驱动程序_第3页
基于STM32-LCD12864驱动程序_第4页
基于STM32-LCD12864驱动程序_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

千里之行,始于足下让知识带有温度。第第2页/共2页精品文档推荐基于STM32--LCD12864驱动程序基于STM32--LCD12864驱动程序

STM32LCD12864驱动程序(头文件)(2022-05-2921:25:08)转载▼

标签:杂谈

#ifndefLCD12864_H

#defineLCD12864_H

#defineLCD_CONTROLGPIOD//默认LCD12864的控制口在PD口

#defineLCD_DATAPORTGPIOD//默认LCD12864的数据口在PD口

#defineLCD_RESET_PinGPIO_Pin_12//默认LCD12864的复位引脚衔接到PD.12也可不用

#defineLCD_RS_PinGPIO_Pin_13//默认LCD12864RS--PD.13

#defineLCD_RW_PinGPIO_Pin_14//默认LCD12864RW--PD.14

#defineLCD_EN_PinGPIO_Pin_15//默认LCD12864E--PD.15

#defineLCD_CONTROL_CLOCKRCC_APB2Periph_GPIOD//默认LCD12864的控制口时钟

#defineLCD_DATAPORT_CLOCKRCC_APB2Periph_GPIOD//默认LCD12864的数据口时钟

#defineLCD_RS_1LCD_CONTROL->BSRRLCD_CONTROL->BSRR

|=LCD_RS_Pin//RS置高电平

#defineLCD_RS_0LCD_CONTROL->BRRLCD_CONTROL->BRR

|=LCD_RS_Pin//RS置低电平

#defineLCD_RW_1LCD_CONTROL->BSRRLCD_CONTROL->BSRR

|=LCD_RW_Pin//RW置高电平

#defineLCD_RW_0LCD_CONTROL->BRRLCD_CONTROL->BRR

|=LCD_RW_Pin//RW置低电平

#defineLCD_EN_1LCD_CONTROL->BSRRLCD_CONTROL->BSRR

|=LCD_EN_Pin//EN置高电平

#defineLCD_EN_0LCD_CONTROL->BRRLCD_CONTROL->BRR

|=LCD_EN_Pin//EN置低电平

#defineLCD_RESET_0LCD_CONTROL->BRR=

LCD_RESET_Pin//复位

#defineLCD_RESET_1LCD_CONTROL->BSRR=

LCD_RESET_Pin//复位脚拉高

#defineDATAOUTLCD_DATAPORT->ODR

LCD_DATAPORT->ODR//数据输出寄

存器

#defineDATAINLCD_DATAPORT->IDR//数据输入寄存器

#defineLCD_BF((DATAIN)//延时

n(us)

voidLCD_delayms(unsignedlongn);//延时

n(ms)

voidLCD_WriteInitcmd(uint8_tinitcmd);//

写初始化命令

voidLCD_WaitLaisure(void);//向来等

待到LCD内部操作完成,变为空闲状态

voidLCD_Writecmd(uint8_tcmd);//写命

令到LCD12864

voidLCD_WriteByte(uint8_tbyte);//写一字节数据到LCD12864

voidLCD_pos(uint16_tpos);//LCD显示位置设置

voidLCD_Setpos(uint16_trow,uint16_tcol);//设定LCD12864的显示地址,按照习惯voidLCD_DispChar(charch);//显示一个字符

voidLCD_Setpos_DispChar(uint16_trow,uint16_tcol,charch);//在指定位置显示一个字符

voidLCD_DispString(charstr[]);//显示一个字符串,显示位置需提前设定

//在指定位置显示一个字符串

voidLCD_Setpos_DispString(uint16_trow,uint16_tcol,charstr[]);

voidLCD_Dispnum(uint32_tnum);//显示一个不超过8位的整数,显示位置需提前设置

//在指定位置显示一个不超过8位的整数

voidLCD_Setpos_Dispnum(uint16_trow,uint16_tcol,uint32_tnum);

voidLCD_DispDecimal(uint32_tnum,uint16_t

dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定

//在指定位置显示一个有效位不超过8位的浮点数

voidLCD_Setpos_DispDecimal(uint16_trow,uint16_tcol,uint32_tnum,uint16_tdot);

//显示日历,显示日期与时光

voidLCD_DispDateTime(uint32_tyear,uint16_tmonth,uint16_tday,uint16_thour,uint16_tmin,uint16_tsec);

voidLCD_DispPicture(constunsignedcharpicture[]);//显示一幅图像128*64

//屏幕整体左移一格,用于滚动显示

voidLCD_ShiftLeft(void);

//屏幕整体右移一格,用于滚动显示

voidLCD_ShiftRight(void);

//清屏,清除显示

voidLCD_Clear(void);

//使光标还回原点位置

voidLCD_Return(void);

//关显示

voidLCD_Close(void);

//开显示

voidLCD_Open(void);

voidLCD_FlickerChar(uint16_trow,uint16_tcol);

//关闭字符闪耀

voidLCD_CloseFlicker(void);

//屏幕秒闪耀一次

voidLCD_FlickerScreen(void);

voidLCD_PORT_Init(void);//LCD衔接端口初始化

voidLCD_Init(void);//LCD配置初始化

#endif

#include"stm32f10x.h"

#include"stm32f10x_gpio.h"

#include"LCD12864.h"

#include"picture.h"

//延时n(us)

voidLCD_delayus(unsignedlongn){

unsignedlongj;

while(n--)

{j=8;

while(j--);

}

}

//延时n(ms)

voidLCD_delayms(unsignedlongn){

while(n--)

LCD_delayus(1100);

//写初始化命令

voidLCD_WriteInitcmd(uint8_tinitcmd){

LCD_RS_0;

LCD_RW_0;

LCD_EN_1;

DATAOUT|=initcmd;

LCD_delayus(600);

LCD_EN_0;

LCD_RW_1;

}

//向来等待到LCD内部操作完成,变为空闲状态voidLCD_WaitLaisure(void)

{

uint16_tflag=0x00;

LCD_RS_0;

LCD_RW_1;

do

{

LCD_EN_0;

LCD_delayus(5);

LCD_delayus(5);

flag=(uint16_t)LCD_BF;

}while(flag);

}

//写命令到LCD12864

voidLCD_Writecmd(uint8_tcmd)

{

LCD_WaitLaisure();

LCD_RS_0;

LCD_RW_0;

LCD_EN_1;

DATAOUT|=cmd;

LCD_delayus(600);//经过测试,取600。550都不行以

LCD_EN_0;

LCD_RW_1;

}

//写一字节数据到LCD12864

voidLCD_WriteByte(uint8_tbyte)

{

LCD_WaitLaisure();

LCD_RW_0;

LCD_EN_1;

DATAOUT|=byte;

LCD_delayus(600);

LCD_EN_0;

LCD_RW_1;

}

voidLCD_pos(uint16_tpos)

{

LCD_Writecmd(pos);

}

voidLCD_Setpos(uint16_trow,uint16_tcol){

uint16_tpos=0x00;

if(row+1>3)pos=0x08;

if(row

elsepos|=0x90;

pos+=col-1;

LCD_Writecmd(pos);

voidLCD_DispChar(charch)

{

LCD_WriteByte(ch);

}

voidLCD_Setpos_DispChar(uint16_trow,uint16_tcol,charch)

{

LCD_Setpos(row,col);

LCD_WriteByte(ch);

}

voidLCD_DispString(charstr[])

{

uint16_ti;

for(i=0;str[i]!='\0';i++)

{

LCD_WriteByte(str[i]);

}

}

voidLCD_Setpos_DispString(uint16_trow,uint16_tcol,charstr[])

{

LCD_Setpos(row,col);

LCD_DispString(str);

}

voidLCD_Dispnum(uint32_tnum)

{

charstr[12];

uint32_tq;

uint16_twei,i,j,k;

if(num>=10000000)wei=8;

elseif(num>=1000000)wei=7;

elseif(num>=100000)wei=6;

elseif(num>=10000)wei=5;

elseif(num>=1000)wei=4;

elseif(num>=100)wei=3;

elseif(num>=10)wei=2;

elsewei=1;

k=0;

for(i=wei;i>0;i--)

{q=1;

j=1;//i=1时,q=1,得到个位

for(;j=10000000)wei=8;

elseif(num>=1000000)wei=7;

elseif(num>=100000)wei=6;

elseif(num>=10000)wei=5;

elseif(num>=1000)wei=4;

elseif(num>=100)wei=3;

elseif(num>=10)wei=2;

elsewei=1;

for(i=wei;i>0;i--)

{q=1;

j=1;//i=1时,q=1,得到个位

for(;j0;i--)

{if((str[i]>='0')

}

str[i+2]='\0';//添加字符串结束符

for(j=0;j<dot;j++,i--)//小数点后各位依次右移,预备插入

{

str[i+1]=str[i];

}

str[i+1]='.';//插入小数点

LCD_DispString(str);//显示浮点小数

}

voidLCD_Setpos_DispDecimal(uint16_trow,uint16_tcol,uint32_tnum,uint16_tdot)

{

LCD_Setpos(row,col);

LCD_DispDecimal(num,dot);

}

voidLCD_DispDateTime(uint32_tyear,uint16_tmonth,uint16_tday,uint16_thour,uint16_tmin,uint16_tsec)

{

//externuint16_tenableclock;

LCD_Setpos(1,0);

LCD_DispString("Date:");

LCD_Dispnum((uint32_t)year);

LCD_DispChar('-');

LCD_Dispnum((uint32_t)month);

LCD_DispChar('-');

LCD_Dispnum((uint32_t)day);

if((month<10)

LCD_DispChar('');

}

else

if(((month<10)

LCD_Setpos(1,15);

//if(enableclock)//假如开启闹铃,显示闹铃标志

//LCD_DispChar('@');

//else

LCD_DispChar('*');//第一行结束符显示LCD_Setpos(2,0);

LCD_DispString("Time:");

LCD_Dispnum((uint32_t)hour);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)min);

LCD_DispChar(':');

LCD_Dispnum((uint32_t)sec);

if(sec==0)LCD_DispChar('0');

LCD_DispChar('');

LCD_DispChar('');

if((hour<10)//用于消隐

LCD_Setpos(2,15);

//if(enableclock)

//LCD_DispChar('@');

//else

LCD_DispChar('*');//其次行结束符显示}

voidLCD_DispPicture(constunsignedcharpicture[])

{

uint16_ti,j;

LCD_Writecmd(0x34);//写数据时,关闭图形显示

LCD_delayms(20);

for(i=0;i<32;i++)//32行

{

LCD_Writecmd(0x80+i);

LCD_delayus(150);

LCD_Writecmd(0x80);

LCD_delayus(150);

for(j=0;j<16;j++)//一行,16个字节

{

LCD_WriteByte(picture[j]);

LCD_delayus(150);

}

LCD_delayus(150);

}

for(i=0;i<32;i++)//32行

{

LCD_Writecmd(0x80+i);

LCD_delayus(150);

LCD_Writecmd(0x80);

LCD_delayus(150);

for(j=0;j<16;j++)//一行,16个字节

{

LCD_WriteByte(picture[j]);

LCD_delayus(150);

}

LCD_delayus(150);

}

LCD_Writecmd(0x36);//写完数据,开图形显示

LCD_delayms(50);

}

//屏幕整体左移一格,用于滚动显示

voidLCD_ShiftLeft()

{

LCD_Writecmd(0x18);

}

//屏幕整体右移一格,用于滚动显示voidLCD_ShiftRight(void)

{

LCD_Writecmd(0x1C);

}

//清屏,清除显示

voidLCD_Clear(void)

{

LCD_Writecmd(0x01);

}

//使光标还回原点位置

voidLCD_Return(void)

{

LCD_Writecmd(0x02);

}

//关显示

voidLCD_Close(void)

{

LCD_Writecmd(0x08);

}

//开显示

voidLCD_Open(void)

{

LCD_Writecmd(0x0C);

}

voidLCD_FlickerChar(uint16_trow,uint16_tcol)

{

LCD_Writecmd(0x0D);

LCD_Setpos(row,col);

}

//关闭字符闪耀

voidLCD_CloseFlicker(void)

{

LCD_Writecmd(0x0C);

}

//屏幕秒闪耀一次

voidLCD_FlickerScreen(void)

{

LCD_Writecmd(0x08);//关显示

LCD_delayms(500);

LCD_Writecmd(0x0C);//开显示

LCD_delayms(500);

}

//LCD衔接端口初始化

voidLCD_PORT_Init(void)

{

GPIO_InitTypeDefLCD_port;

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

//fPCLK1=36MHz

RCC_APB2PeriphClockCmd(LCD_CONTROL_CLOCK,ENABLE);//时钟使能

RCC_APB2PeriphClockCmd(LCD_DATAPORT_CLOCK,ENABLE);

LCD_port.GPIO_Pin=(uint16_t)0x00ff;LCD_port.GPIO_Speed=GPIO_Speed_50MHz;LCD_port.GPIO_Mode=GPIO_Mode_Out_OD;//OD开路输出,外接上拉电阻到5V

GPIO_Init(LCD_DATAPORT,

LCD_port.GPIO_Pin=LCD_RESET_Pin|LCD_RS_Pin|LCD_RW_Pin|LCD_EN_Pin;

LCD_port.GPIO_Speed=GPIO_Speed_50MHz;LCD_port.GPIO_Mode=GPIO_Mode_Out_OD;//OD开路输出

GPIO_Init(LCD_CONTROL,

}

voidLCD_Init(void)

{

LCD_RESET_0;

LCD_delayms(300);//复位LCD12864

LCD_RESET_1;

LCD_delayms(300);

LCD_Writecmd(0x34);//写数据时,关闭图形显示

LCD_delayus(400);

LCD_WriteInitcmd(0x38);//并行,8位,基本指令操作

LCD_delayus(200);//150

LCD_WriteInitcmd(0x38);

LCD_delayus(100);

LCD_WriteInitcmd(0x0C);//开显示,显示光标,用于测试

LCD_delayus(150);

LCD_WriteInitcmd(0x01);//清屏

LCD_delayms(12);

LCD_Writecmd(0x06);//地址自动增强LCD_delayus(150);

}

#include"stm32f10x.h"

#include"LCD12864.h"

externconstunsignedcharpicture1[];externconstunsignedcharpicture2[];

voidGPIO_Configuration(void);

//延时nus

voiddelay_nus(unsignedlongn)

{

unsignedlongj;

while(n--)

{j=8;

while(j--);

}

}

//延时nms

voiddelay_nms(unsignedlongn)

{

while(n--)

delay_nus(1100);

}

//时钟配置函数72MHz端口配置

voidRCC_Configuration()

{

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

//fPCLK1=36MHz

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|\

//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论