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

下载本文档

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

文档简介

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。550都不可以 LCD_EN_0; LCD_RW_1;/写一字节数据到LCD12864void LCD_WriteByte(uint8_t byte) LCD_WaitLaisure(); LCD_RS_1; LCD_RW_0; LCD_EN_1; DATAOUT |= byte; LCD_delayus(600); LCD_EN_0; LCD_RW_1;void LCD_pos(uint16_t pos) LCD_Writecmd(pos);void LCD_Setpos(uint16_t row,uint16_t col) uint16_t pos=0x00; if(row+13) pos=0x08; if(row & 0x01) pos |= 0x80; else pos |= 0x90; pos += col-1; LCD_Writecmd(pos);void LCD_DispChar(char ch) LCD_WriteByte(ch);void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch) LCD_Setpos(row,col); LCD_WriteByte(ch);void LCD_DispString(char str) uint16_t i; for(i=0;stri!=0;i+) LCD_WriteByte(stri); void LCD_Setpos_DispString(uint16_t row,uint16_t col,char str) LCD_Setpos(row,col); LCD_DispString(str);void LCD_Dispnum(uint32_t num) char str12; uint32_t q; uint16_t wei,i,j,k; if(num=10000000)wei=8; else if(num=1000000)wei=7; else if(num=100000)wei=6; else if(num=10000)wei=5; else if(num=1000) wei=4; else if(num=100)wei=3; else if(num=10) wei=2; else wei=1; k=0; for(i=wei;i0;i-) q=1; j=1; /i=1时,q=1,得到个位 for(;j=10000000)wei=8; else if(num=1000000)wei=7; else if(num=100000)wei=6; else if(num=10000)wei=5; else if(num=1000) wei=4; else if(num=100)wei=3; else if(num=10) wei=2; else wei=1; for(i=wei;i0;i-) q=1; j=1; /i=1时,q=1,得到个位 for(;j0;i-) if(stri=0)&(stri=9) break; stri+2=0; /添加字符串结束符 for(j=0;jdot;j+,i-)/小数点后各位依次右移,准备插入 stri+1=stri; stri+1=.; /插入小数点 LCD_DispString(str);/显示浮点小数void LCD_Setpos_DispDecimal(uint16_t row,uint16_t col,uint32_t num,uint16_t dot) LCD_Setpos(row,col); LCD_DispDecimal(num,dot);void LCD_DispDateTime(uint32_t year,uint16_t month,uint16_t day,uint16_t hour,uint16_t min,uint16_t sec) /extern uint16_t enableclock; 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(month10)&(day10) /清除无效位置可能残留的显示 LCD_DispChar( ); LCD_DispChar( ); else if(month9)|(month9)&(day10) 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(hour10)&(min0)&(sec10) LCD_DispChar( ); /用于消隐 LCD_Setpos(2,15); /if(enableclock) / LCD_DispChar(); /else LCD_DispChar(*);/第二行结束符显示void LCD_DispPicture(const unsigned char picture) uint16_t i,j; LCD_Writecmd(0x34); /写数据时,关闭图形显示 LCD_delayms(20); for(i=0;i32;i+) /32行 LCD_Writecmd(0x80+i); LCD_delayus(150); LCD_Writecmd(0x80); LCD_delayus(150); for(j=0;j16;j+) /一行,16个字节 LCD_WriteByte(picturej); LCD_delayus(150); LCD_delayus(150); for(i=0;i32;i+) /32行 LCD_Writecmd(0x80+i); LCD_delayus(150); LCD_Writecmd(0x80); LCD_delayus(150); for(j=0;j16;j+) /一行,16个字节 LCD_WriteByte(picturej); LCD_delayus(150); LCD_delayus(150); LCD_Writecmd(0x36); /写完数据,开图形显示 LCD_delayms(50);/屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft() LCD_Writecmd(0x18);/屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void) LCD_Writecmd(0x1C);/清屏,清除显示void LCD_Clear(void) LCD_Writecmd(0x01);/使光标还回原点位置void LCD_Return(void) LCD_Writecmd(0x02);/关显示void LCD_Close(void) LCD_Writecmd(0x08);/开显示void LCD_Open(void) LCD_Writecmd(0x0C);void LCD_FlickerChar(uint16_t row,uint16_t col) LCD_Writecmd(0x0D); LCD_Setpos(row,col);/关闭字符闪烁void LCD_CloseFlicker(void) LCD_Writecmd(0x0C);/屏幕秒闪烁一次void LCD_FlickerScreen(void) LCD_Writecmd(0x08);/关显示 LCD_delayms(500); LCD_Writecmd(0x0C);/开显示 LCD_delayms(500);/LCD连接端口初始化void LCD_PORT_Init(void) GPIO_InitTypeDef LCD_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);void LCD_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.hextern const unsigned char picture1;extern const unsigned char picture2;void GPIO_Configuration(void);/延时n usvoid delay_nus(unsigned long n) unsigned long j; while(n-) j=8; while(j-); /延时n msvoid delay_nms(unsigned long n) while(n-) delay_nus(1100);/时钟配置函数 72MHz 端口配置void RCC_Configuration() RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); /fPCLK1=36MHz /RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIO

温馨提示

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

评论

0/150

提交评论