STM32 LCD12864驱动程序(头文件)

STM32 LCD12864驱动程序(头文件)

#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); //写命令到LCD12864
void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864
void 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);
}
//写命令到LCD12864
void 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;
}
//写一字节数据到LCD12864
void 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+1>3) 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;str[i]!=’\0’;i++)
{
LCD_WriteByte(str[i]);
}
}

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 str[12];
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;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);//显示字符串
}

void LCD_Setpos_Dispnum(uint16_t row,uint16_t col,uint32_t num)
{
LCD_Setpos(row,col);
LCD_Dispnum(num);
}

void LCD_DispDecimal(uint32_t num,uint16_t dot)
{
uint32_t i=0,j,k=0,wei;
uint32_t q;
char str[10];
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;
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);//显示浮点小数
}

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((month<10)&&(day<10)) //清除无效位置可能残留的显示
{
LCD_DispChar(’ ‘);
LCD_DispChar(’ ‘);
}
else if(((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(’
’);//第二行结束符显示
}

void LCD_DispPicture(const unsigned char picture[])
{
uint16_t i,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);
}

//屏幕整体左移一格,用于滚动显示
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.h”

extern const unsigned char picture1[];
extern const unsigned char picture2[];

void GPIO_Configuration(void);

//延时n us
void delay_nus(unsigned long n)
{
unsigned long j;
while(n–)
{ j=8;
while(j–);
}
}

//延时n ms
void 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_GPIOB | RCC_APB2Periph_GPIOC|
// RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE,ENABLE);
}

int main(void)
{
//uint16_t i;
//char str1[]={“Happy everyday!”};
//char str2[]={“天天向上”};
RCC_Configuration();
LCD_PORT_Init();
LCD_Init();
//LCD_Writecmd(0x90);
//LCD_WriteByte(‘a’);
//delay_nms(10); //至少延时1us
LCD_Setpos_DispString(1,3,“好好学习”);
delay_nms(10); //至少延时1us
LCD_Setpos_DispString(3,3,“天天向上”);
delay_nms(300);
LCD_FlickerChar(3,3);
//LCD_Setpos_DispString(2,1,“天天sr向上”);
//delay_nms(2000);
//LCD_Setpos_Dispnum(3,1,12345678);
//LCD_Setpos_Dispnum(4,1,12345678);
//LCD_Setpos_DispDecimal(4,1,1234567,6);
//delay_nms(1); //必要的延时
//LCD_Setpos_DispString(3,1,“Have a good time!”);
//delay_nms(1); //必要的延时
//LCD_Setpos_DispString(4,1,“天天向上天天向上”);

//LCD_Setpos_DispString(3,1,“进步每一天!”);
//LCD_Setpos_DispString(3,1,“Happy everyday!”);
//LCD_Setpos_DispString(4,1,“认真学习 STM32”);
//LCD_Setpos_DispString(2,2,str1);
//LCD_DispPicture(picture1);

//LCD_WriteByte(‘d’);
//LCD_WriteByte(‘e’);
//delay_nms(1000);
while (1)
{
};
}

转载:http://blog.sina.com.cn/s/blog_5c5ca6710100zymf.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部