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