LCD128664 SPI驱动

LCD128664  SPI驱动      

  OLED12864自带字库,直接写入字符串就行,显示图片需要一个个像素写入。这个屏幕地址设置的有点恶心,它有说明书里写者有两行地址,但显示的却是错开的,并不连续。且显示文字和图片的地址并不相同。

        最令人疑惑的是那个反白的功能,迷惑至极,感觉堪称鸡肋,不能指定某一行反白,直接反白两行。虽然知道因为地址的原因,但你既然做不出那种效果为何要加个反白。同样的地址卷动也很搞笑,想要实现一行行卷动需要自己写算法。而且地址卷动是因为这屏幕有页地址可以显示文字,而且第一页相当于有两个图层,一个用来显示图片,一个用来显示图片,第二页貌似不能显示图片,只能显示文字。当然也可能我还没玩明白,反正我感觉是这样的,反正迷惑至极。

LED.c

unsigned char LCD_addr[]={                   //坐标编码
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};

//初始化
void LCD_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct ={0};
	
	__HAL_RCC_GPIOA_CLK_ENABLE();

	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_GPIOF_CLK_ENABLE();
	
	
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	
	GPIO_InitStruct.Pin = PIN_CS_RS | PIN_RES_V0;
	HAL_GPIO_Init(GPIOF,&GPIO_InitStruct);
	GPIO_InitStruct.Pin = PIN_SID_RW | PIN_CLK_E;
	HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	HIGH_RES_V0;

}

//SPI串行驱动
void LCD_write_byte(u8 dat)
{
	u8 i = 0;
	HIGH_CS_RS;
	for(i = 0;i<8;i++)
	{
		((dat<<i) & 0x80)?(HIGH_SID_RW):(LOW_SID_RW);
		LOW_CLK_E;
		HIGH_CLK_E;
	}
	LOW_CS_RS;
}


//写入数据或命令
void LCD_write_cmd_dat(uint8_t cmd,uint8_t data)
{
	
	LCD_write_byte(cmd);
	LCD_write_byte(data&0xf0);
	LCD_write_byte(data<<4);

}

//清屏 接入空格
void LCD_Clear(void)
{
	LCD_write_cmd_dat(LCD_CMD,0x01);
	delay_ms(2);
}

//屏幕初始化

void InitLCD(void)
{

	LCD_write_cmd_dat(LCD_CMD,0xE2);
	delay_ms(5);
	LCD_write_cmd_dat(LCD_CMD,0x2c);		/*升压步聚1*/
	delay_ms(5);
	LCD_write_cmd_dat(LCD_CMD,0x2e);		/*升压步聚2*/
	delay_ms(5);
	LCD_write_cmd_dat(LCD_CMD,0x2f);		/*升压步聚3*/
	delay_ms(5);
	LCD_write_cmd_dat(LCD_CMD,0x25);		/*粗调对比度,可设置范围20~27*/
	LCD_write_cmd_dat(LCD_CMD,0x81);		/*微调对比度*/
	LCD_write_cmd_dat(LCD_CMD,0x1a);		/*微调对比度的值,可设置范围0~63  1f*/
	LCD_write_cmd_dat(LCD_CMD,0xa2);		/*1/9偏压比(bias)*/
	LCD_write_cmd_dat(LCD_CMD,0xc8);		/*行扫描顺序:从上到下*/
	LCD_write_cmd_dat(LCD_CMD,0xa0);		/*列扫描顺序:从左到右*/
	LCD_write_cmd_dat(LCD_CMD,0x40);		/*起始行:从第一行开始*/
	LCD_Clear();
	LCD_write_cmd_dat(LCD_CMD,0xaf);		/*开显示*/
}


/*屏幕开显示*/

void LCD_turn_on(void)
{
	LCD_write_cmd_dat(LCD_CMD,0x0C);	
}

//进入睡眠模式
void LCD_turn_off(void)
{
	LCD_write_cmd_dat(LCD_CMD,0x08);		
}


//移动光标
void Lcd_xy_12864(unsigned char x,unsigned char y)
{
  switch(x)
  {
    case 0:
      x=0x80;break;
    case 1:
      x=0x90;break;
    case 2:
      x=0x88;break;
    case 3:
      x=0x98;break;
    default:
      x=0x80;
  }
  y=y&0x07;
  LCD_write_cmd_dat(LCD_CMD,0x30);
  LCD_write_cmd_dat(LCD_CMD,y+x);
  LCD_write_cmd_dat(LCD_CMD,y+x);
}


//写入字符串
void LCD_to_TXT(uint8_t x,uint8_t y,uint8_t *str) 
{


  LCD_write_cmd_dat(LCD_CMD,0x30);
  LCD_write_cmd_dat(LCD_CMD,LCD_addr[8*x+y]);
  while(*str != '\0')
  {

		
    if(y == 8)
    {
      y = 0;
      x++;
    }
    if(x==4)
			x=0;
    LCD_write_cmd_dat(LCD_CMD,LCD_addr[8*x+y]);
    LCD_write_cmd_dat(LCD_DAT,*str);
    str++;
    if(*str != '\0')
    {
      LCD_write_cmd_dat(LCD_DAT,*str);
      str++;
      y++;
    }  
  }
}
//显示图片
void LCD_Display_Picture(uint8_t *img)
{
	uint8_t x,y,i;
	LCD_write_cmd_dat(LCD_CMD,0x34);		//切换到扩充指令
	LCD_write_cmd_dat(LCD_CMD,0x34);		//关闭图形显示
	for(i = 0; i < 2; i++)   //上下屏写入
	{
		for(y=0;y<32;y++)   //垂直Y写32次
		{  
			for(x=0;x<8;x++)   //横向X写8次
			{
				LCD_write_cmd_dat(LCD_CMD,0x80 + y);		//行地址
				LCD_write_cmd_dat(LCD_CMD,0x80 + x+i);		//列地址
				LCD_write_cmd_dat(LCD_DAT,*img ++);		//写高位字节数据 D15-D8   
				LCD_write_cmd_dat(LCD_DAT,*img ++);		//写低位字节数据 D7-D0
			}
		}
	}
	LCD_write_cmd_dat(LCD_CMD,0x36);//打开图形显示		
	LCD_write_cmd_dat(LCD_CMD,0x30);        //切换回基本指令
}	

//清除文本
void LcmClearTXT( void )
{
  unsigned char i;
  LCD_write_cmd_dat(LCD_CMD,0x30);
  LCD_write_cmd_dat(LCD_CMD,0x80);
  for(i=0;i<64;i++)
  LCD_write_cmd_dat(LCD_DAT,0x20);
  Location_xy_12864(0,0);      
}

 LCD.h

#ifndef _LCD_H
#define _LCD_H

#include "typedef.h"

#define GPIO_SID_RW 		GPIOA
#define PIN_SID_RW 			GPIO_PIN_2

#define GPIO_CLK_E 			GPIOA
#define PIN_CLK_E 			GPIO_PIN_3

#define GPIO_RES_V0 			GPIOF
#define PIN_RES_V0 				GPIO_PIN_3

#define GPIO_CS_RS 			GPIOF
#define PIN_CS_RS 			GPIO_PIN_4

#define HIGH_SID_RW		HAL_GPIO_WritePin(GPIO_SID_RW, PIN_SID_RW, 	GPIO_PIN_SET)
#define LOW_SID_RW 		HAL_GPIO_WritePin(GPIO_SID_RW, PIN_SID_RW,	GPIO_PIN_RESET)

#define HIGH_CLK_E 		HAL_GPIO_WritePin(GPIO_CLK_E, PIN_CLK_E, 		GPIO_PIN_SET)
#define LOW_CLK_E 		HAL_GPIO_WritePin(GPIO_CLK_E, PIN_CLK_E, 		GPIO_PIN_RESET)

#define HIGH_RES_V0 	HAL_GPIO_WritePin(GPIO_RES_V0, 	PIN_RES_V0, 			GPIO_PIN_SET)
#define LOW_RES_V0 		HAL_GPIO_WritePin(GPIO_RES_V0, 	PIN_RES_V0, 			GPIO_PIN_RESET)

#define HIGH_CS_RS 		HAL_GPIO_WritePin(GPIO_CS_RS, PIN_CS_RS, 		GPIO_PIN_SET)
#define LOW_CS_RS 		HAL_GPIO_WritePin(GPIO_CS_RS, PIN_CS_RS, 		GPIO_PIN_RESET)

//#define PSB_HIGH 	GPIO_SetBits(CMD_PROT,PSB)
//#define PSB_LOW 	GPIO_ResetBits(CMD_PROT,PSB)

#define LCD_CMD 0xF8	//写指令
#define LCD_DAT 0xFA	//写数据


void LCD_Init(void);
void LCD_write_Init(void);
void LCD_write_cmd_dat(unsigned char cmd,unsigned char data);
void LCD_to_TXT(unsigned char x,unsigned char y,unsigned char *str);
void LCD_turn_on(void);
void LCD_turn_off(void);
void LCD_Display_Picture(unsigned char *img);
void show_16x16(u8 x,u8 y,u8*str);
void show_min_iocn(u8 line);
void LCD_Clear(void);
void LcmClearTXT( void);
void clearimg(void);
void show_to_ph(u8* str);
void katon(u8* str);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值