3.3V与5V使用程序指导书
QQ:326578980 tel:18
我们学习单片机对LCD12864是最熟悉不过了,这个很简单,这个是用51来说,很好使用。现在用32位
我们在淘宝上买这个LCD12864,价格有差别,一般而言,5V的LCD12864要比3.3V的LCD
一.LCD12864特点
工作电压:
5V
3.3V
驱动芯片:
ST7920
ST7920
串并行数据
串,并行
串,并行
背光:
有
有
中文字库:
有
有
二.LCD12864效果画面
1)3.3V LCD12864显示画面
以上是3.3V的LCD12864显示内容,程序完整兼容5V的,只是硬件上有点差别。
2)5V LCD12864显示画面
二.LCD12864硬件设计
1)5V硬件设计图
2)3.3V硬件设计图
从以上的硬件电路发现,5V的LCD12864在STM32单片机上使用,需要在数据线和控制线上接上拉电
这里是硬件选择串并行数据发送,LCD12864的PSB引脚
L:串行发送
H:并行发送
LCD12864的Reset复位引脚直接接高电平,不需要复位。
LCD12864的背光调节电阻省了,需要的在VO脚接一个可调电阻。
三.LCD12864程序
1.首先看LX12864.h这个文件,主要是对引脚宏定义,以及函数声明
#ifndef __LX12864_H__
#define __LX12864_H__
#include
#define uchar unsigned char
#define uint unsigned int
/************************************************
RS ----> PD0;
WR--->PD1;
E--->PD2;
Led--->PD3 //背光控制管脚
*************************************************
#define LCD_DB0 GPIO_Pin_8
#define LCD_DB1 GPIO_Pin_9
#define LCD_DB2 GPIO_Pin_10
#define LCD_DB3 GPIO_Pin_11
#define LCD_DB4 GPIO_Pin_12
#define LCD_DB5 GPIO_Pin_13
#define LCD_DB6 GPIO_Pin_14
#define LCD_DB7 GPIO_Pin_15
#define LCD_DATA_PORT GPIOE
#define LCD_DATA_PIN LCD_DB0|LCD_DB1|LCD_DB2|LCD
#define LCD_RS_0 GPIO_ResetBits(GPIOD,GPIO_Pin_
#define LCD_RS_1 GPIO_SetBits(GPIOD,GPIO_Pin_0)
#define LCD_WR_0 GPIO_ResetBits(GPIOD,GPIO_Pin_
#define LCD_WR_1 GPIO_SetBits(GPIOD,GPIO_Pin_1)
#define LCD_E_0 GPIO_ResetBits(GPIOD,GPIO_Pin_2
#define LCD_E_1 GPIO_SetBits(GPIOD,GPIO_Pin_2)
#define LCD_led_0 GPIO_ResetBits(GPIOD,GPIO_Pin
#define LCD_led_1 GPIO_SetBits(GPIOD,GPIO_Pin_3
void write_Data(u8 data);
void delay(u8 dd); //延时函数
void LCD_GPIO_Configeration(void);
void LCD_WriteConmand(uchar com);
void LCD_WriteDada(uchar dat);
void LCD_Clear(u8 temp);
void LCD12864_Init(void);
void LCD12864_Position(u8 X, u8 Y) ;
void DisPlayString(u8 X,u8 Y,u8 *str) ;
#endif
2)下面是"LX12864.c文件,
#include"LX12864.h"
/*****************************************
*函数名:void LCD_GPIO_Configeration(void)
*功能:LCD GPIO配置
* 参数:
*************************************/
void LCD_GPIO_Configeration(void)
{
GPIO_InitTypeDef GPIO_InitStructre;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_
/**********ÅäÖÿØÖÆIO¶Ë¿Ú************/
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructre);
/**********ÅäÖÃÊý¾ÝIO¶Ë¿Ú************/
GPIO_InitStructre.GPIO_Pin=LCD_DATA_PIN;
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(LCD_DATA_PORT, &GPIO_InitStructre);
}
/*****************************************
*函数名:void _NOP_(void)
* ÃèÊö £º¼òµ¥ÑÓʱ
* ÊäÈë £º
* Êä³ö £ºÎÞ
* µ÷Óà £º
*************************************/
void delay(u8 dd)
{
u8 i;
for(;dd>0;dd--)
for(i=110;i>0;i--);
}
/*****************************************
*函数名:void write_Data(u8 data)
* ÃèÊö £ºµ÷Óÿâ¿âº¯Êý
* ÊäÈë £º
* Êä³ö £ºÎÞ
* µ÷Óà £º
*************************************/
void write_Data(u8 data)
{
GPIO_Write(GPIOE,data<<8); //该函数直接调用stm32f10x_G
}
/*****************************************
*函数名:void LCD_WriteConmand(uchar com)
* ÃèÊö £ºÐ´Ö¸ÁîÊý¾Ý¸øLCD ,RS=L,RW=L,E=¸ßÂö³å,D0-
* ÊäÈë £º
* Êä³ö £ºÎÞ
* µ÷Óà £º
*************************************/
void LCD_WriteConmand(uchar com)
{
LCD_RS_0; //RS=0
LCD_WR_0; //WR=0
LCD_E_0;//E=0
write_Data(com) ;
delay(15);
LCD_E_1;//E=1
delay(15);
LCD_E_0;//E=0
}
/*****************************************
*函数名:void LCD_WriteDada(uchar dat)
* ÃèÊö £ºÐ´Ö¸ÁîÊý¾Ý¸øLCD ,RS=H,RW=L,E=¸ßÂö³å,D0-
* ÊäÈë £º
* Êä³ö £ºÎÞ
* µ÷Óà £º
*************************************/
void LCD_WriteDada(uchar dat)
{
LCD_RS_1; //RS=1
LCD_WR_0; //WR=0
LCD_E_0;//E=1
write_Data(dat) ;
delay(15);
LCD_E_1;//E=1
delay(15);
LCD_E_0;//E=0
}
/*****************************************
*函数名:void LCD_Clear(u8 temp)
* ÃèÊö £ºLCDÇå³ýÏÔʾ
* ÊäÈë £º
* Êä³ö £ºÎÞ
* µ÷Óà £º
*************************************/
void LCD_Clear(u8 temp)
{
switch(temp) {
case 0: LCD_WriteConmand(0x01);break; //Çå³ýÈ«
default :break;
}
}
/*****************************************
*函数名:oid LCD12864_Init(void)
* ÃèÊö £ºLCD12864³õʼ»¯³ÌÐò£¬Ð´Èë³õʼָÁ¿ª±³¹
* ÊäÈë £º
* Êä³ö £ºÎÞ
* ¹¦ÄÜ £º PSB=H£¬Ó²¼þÉèÖ㬲¢Ðз¢ËÍÊý¾Ý
*************************************/
void LCD12864_Init(void)
{
LCD_E_0;
delay(5);
LCD_WriteConmand(0X30);//Ñ¡Ôñ»ù±¾Ö¸Á£¬8λÊý¾ÝÄ£
delay(5);
LCD_WriteConmand(0X0C);//¿ªÏÔʾ£¬ÎÞÓα꣬²»·´°×
delay(5);
LCD_WriteConmand(0X01);//Çå³ýÏÔʾ£¬²¢½«DDRAMµÄµØÖ·
delay(5);
LCD_WriteConmand(0X06);//ÉèÖÃÍⲿ¶ÁдÊý¾Ý£DDRAMµÄµ
delay(5);
LCD_WriteConmand(0X80);//DDRAMµÄµØÖ·¼ÆÊýÆ÷ACλ0,
delay(5);
LCD_led_1;//´ò¿ªLCDµÆ±³¹â
}
/*****************************************
*函数名:void LCD12864_Position(u8 X, u8 Y)
* ÃèÊö £ºLCD12864É趨ÏÔʾλÖã¬
* ÊäÈë £ºX:ÐÐ×ø±ê
Line1: 80H 81H 82H 83H 84H 85H 86H 87
Line2: 90H 91H 92H 93H 94H 95H 96H 97
Line3: 88H 89H 8AH 8BH 8CH 8DH 8EH 8F
Line4: 98H 99H 9AH 9BH 9CH 9DH 9EH 9F
Y£ºÁÐ×ø±ê£ºÖ»ÄÜÒÔ16¸öµãµÄ¿í¶ÈÒÆ¶¯
* Êä³ö £ºÎÞ
* ¹¦ÄÜ £º
*************************************/
void LCD12864_Position(u8 X, u8 Y)
{
switch(X){
case 1: LCD_WriteConmand(0x80+Y); break;
case 2: LCD_WriteConmand(0x90+Y); break;
case 3: LCD_WriteConmand(0x88+Y); break;
case 4: LCD_WriteConmand(0x98+Y); break;
}
}
/*****************************************
*函数名:void DisPlayString(u8 X,u8 Y,u8 *str)
* ÃèÊö £ºLCD12864
* ÊäÈë £º
* Êä³ö £ºÎÞ
* ¹¦ÄÜ £º ÏÔʾ×Ö·û´®º¯Êý
*************************************/
void DisPlayString(u8 X,u8 Y,u8 *str)
{
if(X>4){X = 1;}
if(Y>4){Y = 0;}
LCD12864_Position(X,Y) ;
while(*str != '\0')
{
LCD_WriteDada(*str);
str++;
}
}
3)主函数main.c,该文件
#include
#include"LX12864.h"
#include"delay.h"
u8 LCD_data1[]={"2017-04-07 19:50"};
void delayms(uint16_t time)
{ uint8_t y;
for(;time>0;time--)
for(y=100;y>0;y--);
}
int main()
{
u8 i;
LCD_GPIO_Configeration();
LCD12864_Init();
for(i=1;i<17;i++)
{
LCD_WriteDada(LCD_data1[i-1]);
delayms(5);
}
DisPlayString(2,0, "ÀîÁ¢ÇåLOVEµËÐÄâù");
DisPlayString(3,0, "QQ:326578980");
DisPlayString(4,0, "TEL:18781173563 ");
while(1)
{
}
}