LCD12864

本文档详细介绍了LCD12864显示模块的初始化过程和驱动函数实现,包括取模方式、字符显示以及库函数的使用。提供了逆向取模和逐列显示的原理,以及如何在HAL库环境下操作LCD12864的示例代码。通过LCD12864_OverTurn函数实现数据位反转,确保正确显示。此外,还展示了清屏、显示字符和字符串的函数,帮助开发者理解并应用到实际项目中。
摘要由CSDN通过智能技术生成

LCD12864

取中文取模方式:列行,取模走向(LCD12864正常取模走向):逆向,高位在前(从上到下,从低位到高位)
第一个点作为最低位。如*-------取为00000001

字符取模方式:逐列,取模走向:顺向,低位在前
即第一个点作为最高位。如*-------取为10000000

LCD12864_Init();
//LCD12864_CLS();	

/* USER CODE END 2 /
LCD12864_CS1_CLS();
LCD12864_CS2_SET();
/
Infinite loop /
/
USER CODE BEGIN WHILE /
while (1)
{
/
USER CODE END WHILE */
/*LCD12864_Writedat(0x00);
HAL_Delay(1000);
LCD12864_Writedat(0xff);
HAL_Delay(1000);
*/
LCD12864_CS1_CLS();
LCD12864_CS2_SET();
LCD12864_ShowChar(0,10,‘a’,16);
LCD12864_CS1_SET();
LCD12864_CS2_CLS();
LCD12864_ShowString(2,0,“LCD12864”,16);

**

HAL库版

**

LCD12864.c

#include “12864.h”
#include “font.h”

uint8_t LCD12864_OverTurn(uint8_t data)
{
uint8_t i;
uint8_t retval=0x00;

for(i=0;i<8;i++)
{
	retval|=((data>>i)&0x01)<<(7-i);
}

return retval;

}

void LCD12864_Writecmd(uint8_t cmd)
{
//LCD12864_WaitReady();

LCD12864_RS_CLS();	//Ö¸Áî
LCD12864_RW_CLS();	 //д

LCD12864_DataOutput(cmd);
HAL_Delay(1);
LCD12864_EN_SET();
HAL_Delay(2);
LCD12864_EN_CLS();
HAL_Delay(1);

}

void LCD12864_Writedat(uint8_t data)
{
//LCD12864_WaitReady();

LCD12864_RS_SET();	//Êý¾Ý
LCD12864_RW_CLS();	 //д

LCD12864_DataOutput(data);
HAL_Delay(1);
LCD12864_EN_SET();
HAL_Delay(2);
LCD12864_EN_CLS();
HAL_Delay(1);

}

void LCD12864_SetCursor(uint16_t page,uint16_t column)
{
LCD12864_Writecmd(PAGE_ADD+page); //ÉèÖÃÒ³µØÖ·
LCD12864_Writecmd(COL_ADD+column); //ÉèÖÃÁеØÖ·
}

void LCD12864_CLS()
{
LCD12864_Writecmd(0x01);
}

void hz_LCDDisp16(unsigned char page,unsigned char column,const unsigned char hzk)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++)
{
//LCD12864_Writecmd(PAGE_ADD+page+j);
//LCD12864_Writecmd(COL_ADD+column);
for(i=0;i<16;i++)
{
LCD12864_SetCursor(page+j,column+i);
LCD12864_Writedat(hzk[16
j+i]);
}
}
}

void LCD12864_ShowChar(uint8_t page,uint8_t column,uint8_t chr,uint8_t size)
{
uint8_t size1,size2,chr1,temp;
uint8_t i;
size1=size/8+((size%8)?1:0);
size2=size1*(size/2);

chr1=chr-' ';

for(i=0;i<size2;i++)
{
	if(size==16) temp=asc2_1608[chr1][i];
	else if(size==24) temp=asc2_2412[chr1][i];
	LCD12864_SetCursor(page+(i%size1),column+i/size1);
	LCD12864_Writedat(LCD12864_OverTurn(temp));
}

}

void LCD12864_ShowString(uint8_t page,uint8_t column,uint8_t* str,uint8_t size)
{
while((*str>=’ ‘) && (*str<=’~’))
{
LCD12864_ShowChar(page,column,*str,size);
column+=size/2;
if(column>64-size)
{
column=0;
page+=2;
}
str++;
}
}
void LCD12864_Init()
{
LCD12864_CS1_SET();
LCD12864_CS2_SET();

LCD12864_Writecmd(LCD_Off);
LCD12864_Writecmd(0xc0);
LCD12864_Writecmd(PAGE_ADD);
LCD12864_Writecmd(COL_ADD);
LCD12864_Writecmd(0x01);
LCD12864_Writecmd(LCD_On);

}

**

LCD12864.h

**
#ifndef __12864_H
#define __12864_H

#include “gpio.h”

#define PAGE_ADD 0xB8 //页地址设置
#define COL_ADD 0x40 //列地址设置
#define LCD_Off 0x3e //LCD关
#define LCD_On 0x3f //LCD开

#define LCD12864_RS_SET() HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_SET)
#define LCD12864_RS_CLS() HAL_GPIO_WritePin(RS_GPIO_Port,RS_Pin,GPIO_PIN_RESET)

#define LCD12864_RW_SET() HAL_GPIO_WritePin(RW_GPIO_Port,RW_Pin,GPIO_PIN_SET)
#define LCD12864_RW_CLS() HAL_GPIO_WritePin(RW_GPIO_Port,RW_Pin,GPIO_PIN_RESET)

#define LCD12864_EN_SET() HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_SET)
#define LCD12864_EN_CLS() HAL_GPIO_WritePin(EN_GPIO_Port,EN_Pin,GPIO_PIN_RESET)

#define LCD12864_CS1_SET() HAL_GPIO_WritePin(CS1_GPIO_Port,CS1_Pin,GPIO_PIN_SET)
#define LCD12864_CS1_CLS() HAL_GPIO_WritePin(CS1_GPIO_Port,CS1_Pin,GPIO_PIN_RESET)

#define LCD12864_CS2_SET() HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_SET)
#define LCD12864_CS2_CLS() HAL_GPIO_WritePin(CS2_GPIO_Port,CS2_Pin,GPIO_PIN_RESET)

#define LCD12864_DataOutput(x) GPIOE->ODR = x
#define LCD12864_DataInput() GPIOE->ODR

void LCD12864_Writecmd(uint8_t cmd);
void LCD12864_Writedat(uint8_t data);
void LCD12864_SetCursor(uint16_t page,uint16_t column);
void LCD12864_CLS(void);
void LCD12864_Init(void);
uint8_t LCD12864_OverTurn(uint8_t data);
void LCD12864_ShowChar(uint8_t page,uint8_t column,uint8_t chr,uint8_t size);
void LCD12864_ShowString(uint8_t page,uint8_t column,uint8_t* str,uint8_t size);
void hz_LCDDisp16(unsigned char page,unsigned char column,const unsigned char *hzk);

#endif

main.c

/* USER CODE BEGIN 2 /
LCD12864_Init();
//LCD12864_CLS();
/
USER CODE END 2 */
LCD12864_CS1_CLS();
LCD12864_CS2_SET();

/* Infinite loop /
/
USER CODE BEGIN WHILE /
while (1)
{
/
USER CODE END WHILE */
/*LCD12864_Writedat(0x00);
HAL_Delay(1000);
LCD12864_Writedat(0xff);
HAL_Delay(1000);
/
LCD12864_CS1_CLS();
LCD12864_CS2_SET();
LCD12864_ShowChar(0,10,‘a’,16);
LCD12864_CS1_SET();
LCD12864_CS2_CLS();
LCD12864_ShowString(2,0,“LCD12864”,16);
//hz_LCDDisp16(0,15,Hz_xu);
/
USER CODE BEGIN 3 /
}
/
USER CODE END 3 */

官方例程标准库版

.c文件

#include “12864LCD.h”

void LCD12864_PORT_Init(void)
{
GPIO_InitTypeDef GPIO_PortInit;

   /************ÅäÖÿØÖÆIO¶Ë¿Ú**********/
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//ʹÄÜGPIODʱÖÓ
   GPIO_PortInit.GPIO_Pin =  LCD_EN | LCD_RW | LCD_RS;//¿ØÖÆIO¶Ë¿Ú

   GPIO_PortInit.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
   GPIO_PortInit.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
   GPIO_PortInit.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
   GPIO_PortInit.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
     
     GPIO_Init( GPIOF , &GPIO_PortInit);//³õʼ»¯¿ØÖƶ˿ÚGPIO
   GPIO_Init( GPIOG , &GPIO_PortInit);//³õʼ»¯¿ØÖƶ˿ÚGPIO

   /************ÅäÖÃÊý¾Ý¶Ë¿Ú*************/
   RCC_AHB1PeriphClockCmd(LCD_DATA_PORT_CLOCK, ENABLE);//ʹÄÜGPIOEʱÖÓ
   GPIO_PortInit.GPIO_Pin = LCD_DATA_PIN;//

   GPIO_PortInit.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
   GPIO_PortInit.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
   GPIO_PortInit.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
   GPIO_PortInit.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­

   GPIO_Init(LCD_DATA_PORT, &GPIO_PortInit);//ʼ»¯Êý¾Ý¶Ë¿ÚGPIO

}

//ÉÔ×÷ÑÓʱ
void NOP(void)
{
u8 i = 200;
while(i > 0){
i–;
}
}

//
/дָÁîÊý¾Ýµ½LCD /
/RS=L£¬RW=L£¬E=¸ßÂö³å£¬D0-D7=Ö¸ÁîÂë¡£ /
/
/
void LCD12864_WriteCmd(u8 cmd) //дÃüÁÊý
{
Clear_LCD_RS; //RS = 0.
Clear_LCD_RW; //RW = 0.
Set_LCD_EN; //EN = 1.
NOP();
NOP();
LCD_DATA_PORT->ODR=((LCD_DATA_PORT->ODR & 0xff00)|cmd); //´Ë´¦£¬
// Ö»ÓÐÖ±½Ó²Ù×÷¼Ä´æÆ÷²ÅÄÜ
//´ïµ½£¬Ö»¸Ä±äÊä³öÊý¾Ý¼Ä´æÆ÷ODRµÄµÍ8룬ÆäËüλ
//²»±äµÄÄ¿µÄ¡£ÒòΪ£¬Ö»ÓеÍ8λÊÇÊý¾ÝÒý½Å£¬
//ÆäËüλ¿ÉÄÜÊÇ¿ØÖÆÒý½Å£¬²»Äܸı䡣
NOP();
NOP();
Clear_LCD_EN; //EN = 0;
NOP();
NOP();
}
/
/
/дÏÔʾÊý¾Ýµ½LCD /
/RS=H£¬RW=L£¬E=¸ßÂö³å£¬D0-D7=Êý¾Ý¡£ /
/
/
void LCD12864_WriteData(u8 data) //дÊý¾Ýº¯Êý
{
Set_LCD_RS; //RS = 1.
Clear_LCD_RW; //RW = 0.
Set_LCD_EN; //EN = 1.
NOP();
NOP();
LCD_DATA_PORT->ODR=((LCD_DATA_PORT->ODR & 0xff00)|data);
NOP();
NOP();
Clear_LCD_EN; //EN = 0;
NOP();
NOP();
}
//
/
LCD12864³õʼ»¯ /
/
/
void LCD12864_Init(void) //³õʼ»¯ 12864
{
Set_LCD_CS1;
Set_LCD_CS2;
// Set_LCD_RST;
// delay_ms(2);
//
// Set_LCD_PSB; //ÁîPSB=1£¬ÉèÖÃΪ²¢ÐÐÊý¾Ýģʽ
// delay_ms(2);
LCD12864_WriteCmd(0x30); //Ñ¡Ôñ»ù±¾Ö¸Á£¬ºÍ£¬8λÊý¾Ýģʽ
delay_ms(2);
LCD12864_WriteCmd(0x0c); //¿ªÏÔʾ,ÎÞÓαê,²»·´°×.
delay_ms(2);
LCD12864_WriteCmd(0x01); //Çå³ýÏÔʾ£¬²¢½« DDRAM µÄµØÖ·¼ÆÊýÆ÷ AC ÉèΪ 00H.
delay_ms(2);
LCD12864_WriteCmd(0x06); //ÉèÖã¬Íⲿ¶ÁдÊý¾Ýºó,µØÖ·¼ÇÊýÆ÷ AC »á×Ô¶¯¼Ó 1
delay_ms(2);
LCD12864_WriteCmd(0x80); //½« DDRAM µØÖ·¼ÆÊýÆ÷ AC ÉèΪ 0.
delay_ms(2);
}
//
/* É趨ÏÔʾλÖã¬ÒÔÏÂÊǹâ±ê¶¨Î»º¯Êý£¬µÚÒ»¸ö²ÎÊýΪÐÐ×ø±ê£¬ /
/
µÚ¶þ¸öΪÁÐ×ø±ê£¬Æðʼ×ø±êÊÇ1ÐÐ1ÁС£Ö»ÄÜÒÔ16¸öµãµÄ¿í¶ÈΪµ¥Î»Òƶ¯ */
/
/
void Position(u8 X, u8 Y)
{
switch(X){
case 1: LCD12864_WriteCmd(0x80+Y); break;
case 2: LCD12864_WriteCmd(0x90+Y); break;
case 3: LCD12864_WriteCmd(0x88+Y); break;
case 4: LCD12864_WriteCmd(0x98+Y); break;
}
}
//
/
LCD12864ÏÔʾ×Ö·û´® /
/
/
void DisPlayString(u8 X,u8 Y,u8 *str) //ÏÔʾ×Ö·û´®µÄº¯Êý
{
if(X>4){X = 1;}
if(Y>4){Y = 0;}
Position(X,Y) ;
while(*str != ‘\0’)
{
LCD12864_WriteData(*str);
str++;
delay_ms(5);
}
}

//ÇåÆÁ£¬Çå³ýLCD12864ÏÔʾ
void LCD12864_Clear(void)
{
LCD12864_WriteCmd(0x01);
}

//ÆÁÄ»ÕûÌå×óÒÆÒ»¸ñ£¬ÓÃÓÚLCD12864À´×ö¹ö¶¯ÏÔʾ
void LCD_ShiftLeft(void)
{
LCD12864_WriteCmd(0x18);
}

//ÆÁÄ»ÕûÌåÓÒÒÆÒ»¸ñ£¬ÓÃÓÚLCD12864À´×ö¹ö¶¯ÏÔʾ
void LCD_ShiftRight(void)
{
LCD12864_WriteCmd(0x1C);
}

.h文件

#ifndef 12864LCD_H
#define 12864LCD_H

#include “stm32f4xx.h”
#include “stm32f4xx_gpio.h”
#include “sys.h”
#include “delay.h”
#include <stdlib.h>

/***¿ØÖƶ˿ÚGPIO¶¨Òå***/
#define LCD_CS1 GPIO_Pin_3
#define LCD_CS2 GPIO_Pin_4
#define LCD_EN GPIO_Pin_15
#define LCD_RW GPIO_Pin_1
#define LCD_RS GPIO_Pin_0

//¶¨Òå¿ØÖÆ¶Ë¿Ú ÖÃ1
#define Set_LCD_RS GPIO_SetBits(GPIOF,LCD_RS)
#define Set_LCD_RW GPIO_SetBits(GPIOF,LCD_RW)
#define Set_LCD_EN GPIO_SetBits(GPIOG,LCD_EN)
#define Set_LCD_CS1 GPIO_SetBits(GPIOF,LCD_CS1)
#define Set_LCD_CS2 GPIO_SetBits(GPIOF,LCD_CS2)

//¶¨Òå¿ØÖÆ¶Ë¿Ú Çå0
#define Clear_LCD_RS GPIO_ResetBits(GPIOF,LCD_RS)
#define Clear_LCD_RW GPIO_ResetBits(GPIOF,LCD_RW)
#define Clear_LCD_EN GPIO_ResetBits(GPIOG,LCD_EN)
#define Clear_LCD_CS1 GPIO_ResetBits(GPIOF,LCD_CS1)
#define Clear_LCD_CS2 GPIO_ResetBits(GPIOF,LCD_CS2)

/Êý¾Ý¶Ë¿ÚGPIO¶¨Òå*/
#define LCD_DB0 GPIO_Pin_0
#define LCD_DB1 GPIO_Pin_1
#define LCD_DB2 GPIO_Pin_2
#define LCD_DB3 GPIO_Pin_3
#define LCD_DB4 GPIO_Pin_4
#define LCD_DB5 GPIO_Pin_5
#define LCD_DB6 GPIO_Pin_6
#define LCD_DB7 GPIO_Pin_7

#define LCD_CONTROL_PORT GPIOF | GPIOF
#define LCD_DATA_PORT GPIOE

//GPIOʱÖÓ
#define LCD_CONTROL_PORT_CLOCK RCC_AHB1Periph_GPIOD
#define LCD_DATA_PORT_CLOCK RCC_AHB1Periph_GPIOE

#define LCD_CONTROL_PIN LCD_RST | LCD_PSB| LCD_EN | LCD_RW | LCD_RS
#define LCD_DATA_PIN LCD_DB0 | LCD_DB1|LCD_DB2 | LCD_DB3 | LCD_DB4 |LCD_DB5 | LCD_DB6 | LCD_DB7

void NOP(void);
void LCD12864_PORT_Init(void);
void LCD12864_WriteCmd(u8 cmd); //дÃüÁÊý
void LCD12864_WriteData(u8 data); //дÊý¾Ýº¯Êý
void LCD12864_Init(void); //³õʼ»¯ 12864
void Locate16(u8 X, u8 Y);
void DisPlayString(u8 X,u8 Y,u8 *str); //ÏÔʾ×Ö·û´®µÄº¯Êý
void LCD12864_Clear(void);
void LCD_ShiftLeft(void);
void LCD_ShiftRight(void);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值