基于某STM32LCD12864驱动程序.docx
- 文档编号:11491308
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:19
- 大小:18.01KB
基于某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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32LCD12864 驱动程序