基于某STM32LCD12864驱动程序.docx

上传人:b****5 文档编号:24837304 上传时间:2023-06-02 格式:DOCX 页数:19 大小:18.01KB
下载 相关 举报
基于某STM32LCD12864驱动程序.docx_第1页
第1页 / 共19页
基于某STM32LCD12864驱动程序.docx_第2页
第2页 / 共19页
基于某STM32LCD12864驱动程序.docx_第3页
第3页 / 共19页
基于某STM32LCD12864驱动程序.docx_第4页
第4页 / 共19页
基于某STM32LCD12864驱动程序.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于某STM32LCD12864驱动程序.docx

《基于某STM32LCD12864驱动程序.docx》由会员分享,可在线阅读,更多相关《基于某STM32LCD12864驱动程序.docx(19页珍藏版)》请在冰豆网上搜索。

基于某STM32LCD12864驱动程序.docx

基于某STM32LCD12864驱动程序

STM32LCD12864驱动程序(头文件)(2012-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->BSRR&=~LCD_RS_Pin;LCD_CONTROL->BSRR|=LCD_RS_Pin//RS置高电平

#defineLCD_RS_0LCD_CONTROL->BRR&=~LCD_RS_Pin;LCD_CONTROL->BRR|=LCD_RS_Pin//RS置低电平

#defineLCD_RW_1LCD_CONTROL->BSRR&=~LCD_RW_Pin;LCD_CONTROL->BSRR|=LCD_RW_Pin//RW置高电平

#defineLCD_RW_0LCD_CONTROL->BRR&=~LCD_RW_Pin;LCD_CONTROL->BRR|=LCD_RW_Pin//RW置低电平

#defineLCD_EN_1LCD_CONTROL->BSRR&=~LCD_EN_Pin;LCD_CONTROL->BSRR|=LCD_EN_Pin//EN置高电平

#defineLCD_EN_0LCD_CONTROL->BRR&=~LCD_EN_Pin;LCD_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&=0xff00;LCD_DATAPORT->ODR//数据输出寄存器

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

#defineLCD_BF((DATAIN)&0x0080)//忙状态

voidLCD_delayus(unsignedlongn);//延时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_tdot);//显示一个有效位不超过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_EN_1;

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_RS_1;

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&0x01)pos|=0x80;

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

str[k++]=num/q+'0';

num%=q;

}

str[k]='\0';//添加字符串结束标志

LCD_DispString(str);//显示字符串

}

voidLCD_Setpos_Dispnum(uint16_trow,uint16_tcol,uint32_tnum)

{

LCD_Setpos(row,col);

LCD_Dispnum(num);

}

voidLCD_DispDecimal(uint32_tnum,uint16_tdot)

{

uint32_ti=0,j,k=0,wei;

uint32_tq;

charstr[10];

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;

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

{q=1;

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

for(;j

str[k++]=num/q+'0';

num%=q;

}

str[k]='\0';//添加字符串结束标志

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

{if((str[i]>='0')&&(str[i]<='9'))break;

}

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

for(j=0;j

{

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)&&(day<10))//清除无效位置可能残留的显示

{

LCD_DispChar('');

LCD_DispChar('');

}

elseif(((month<10)&&(day>9))||((month>9)&&(day<10)))

LCD_DispChar('');

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)&&(min<10)&&(sec>0)&&(sec<10))

LCD_DispChar('');//用于消隐

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);

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,&LCD_port);

}

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_PC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1