初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2017-1-22
- 在线时间
- 20 小时
|

楼主 |
发表于 2022-8-31 10:58:24
|
显示全部楼层
然后是lcd屏幕的驱动
- #ifndef __LCD_256_64_H_
- #define __LCD_256_64_H_
- #if defined STM32F4XX
- #include "stm32f4xx.h"
- #else
- #include "gd32f30x.h"
- #endif
- #include "dataType.h"
- //LCD分辨率
- #define LCD_WIDTH 256
- #define LCD_HEIGHT 64
- //IO管脚定义
- //lcd_rd PE10
- //lcd_wr PE11
- //lcd_rst PE12
- //lcd_light PE13
- #define LCD_COMM_SERIAL 0
- #define LCD_COMM_SPI 1
- #define LCD_COMM_IIC 2
- #define LCD_COMM LCD_COMM_IIC
- #if defined STM32F4XX
- #if LCD_COMM == LCD_COMM_SPI
- #define LCD_CS_PIN GPIO_Pin_12 //pB12
- #define LCD_RS_PIN GPIO_Pin_11 //pa11
- #define LCD_RD_PIN GPIO_Pin_15 //pb15
- #define LCD_WR_PIN GPIO_Pin_9 //pc9
- #define LCD_RESET_PIN GPIO_Pin_12 //pa12
- #define LCD_BLK_PIN GPIO_Pin_8 //pa8
- #elif LCD_COMM == LCD_COMM_IIC
- //IF0 割线,焊接到3.3
- //CS -- 焊接R12(PB12) 不焊接R13
- //RD WR 焊接R14 R15直接拉高, 不焊接R17 R21
- //D0 -- 焊接R6(PB10), 不焊接R18
- //D1~D3 - 焊接R23 R24 R25(PC3) 不焊接R22 R27 R31
- //D4-D5 -- 不焊接R43 R45,悬空
- //D6-D7 -- 不焊接R35 R36, 并短接到地
- #define LCD_CS_PIN GPIO_Pin_12 //pb12 片选,接地. 焊接R12,不焊接R13
- #define LCD_RS_PIN GPIO_Pin_11 //pa11 使用IIC时,此引脚不使用,拉高
-
- //RD WR不需要接到MCU,直接修改电阻
- //#define LCD_RD_PIN GPIO_Pin_15 //pb15 使用IIC时,此引脚不使用,拉高。焊接R15,不焊接R17
- //#define LCD_WR_PIN GPIO_Pin_9 //pc9 使用IIC时,此引脚不使用,拉高。焊接R14,不焊接R21
- #define LCD_RESET_PIN GPIO_Pin_12 //pa12
- #define LCD_BLK_PIN GPIO_Pin_8 //pa8
- #else
-
- #endif
- #else
- #define LCD_CS_PIN GPIO_PIN_8 //pc8
- #define LCD_RS_PIN GPIO_PIN_11 //pa11
- #define LCD_RD_PIN GPIO_PIN_15 //pb15
- #define LCD_WR_PIN GPIO_PIN_9 //pc9
- #define LCD_RESET_PIN GPIO_PIN_12 //pa12
- #define LCD_BLK_PIN GPIO_PIN_8 //pa8
- #endif
- //lcd D0-D7 PC0-PC7
- #define LCD_D0_D7_PIN ((uint16_t)0x00ff)//0x00ff //GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7
- #if defined STM32F4XX
- #if LCD_COMM == LCD_COMM_SPI
- #define LCD_CS_HIGH GPIO_WriteBit(GPIOB,LCD_CS_PIN,Bit_SET)
- #define LCD_CS_LOW GPIO_WriteBit(GPIOB,LCD_CS_PIN,Bit_RESET)
- #define LCD_RS_HIGH GPIO_WriteBit(GPIOA,LCD_RS_PIN,Bit_SET)
- #define LCD_RS_LOW GPIO_WriteBit(GPIOA,LCD_RS_PIN,Bit_RESET)
- #define LCD_RD_HIGH GPIO_WriteBit(GPIOB,LCD_RD_PIN,Bit_SET)
- #define LCD_RD_LOW GPIO_WriteBit(GPIOB,LCD_RD_PIN,Bit_RESET)
- #define LCD_WR_HIGH GPIO_WriteBit(GPIOC,LCD_WR_PIN,Bit_SET)
- #define LCD_WR_LOW GPIO_WriteBit(GPIOC,LCD_WR_PIN,Bit_RESET)
- #elif LCD_COMM == LCD_COMM_IIC
- #define LCD_CS_HIGH GPIO_WriteBit(GPIOB,LCD_CS_PIN,Bit_SET)
- #define LCD_CS_LOW GPIO_WriteBit(GPIOB,LCD_CS_PIN,Bit_RESET)
-
- #define LCD_RS_HIGH GPIO_WriteBit(GPIOA,LCD_RS_PIN,Bit_SET)
- #define LCD_RS_LOW GPIO_WriteBit(GPIOA,LCD_RS_PIN,Bit_RESET)
- #endif
- #define LCD_RESET_HIGH GPIO_WriteBit(GPIOA,LCD_RESET_PIN,Bit_SET)
- #define LCD_RESET_LOW GPIO_WriteBit(GPIOA,LCD_RESET_PIN,Bit_RESET)
- #define LCD_BLK_HIGH GPIO_WriteBit(GPIOA,LCD_BLK_PIN,Bit_SET)
- #define LCD_BLK_LOW GPIO_WriteBit(GPIOA,LCD_BLK_PIN,Bit_RESET)
- #define LCD_BLK_STATUS GPIO_ReadInputDataBit(GPIOA, LCD_BLK_PIN)//(GPIOA->IDR & (1<<8))
- #else
- #define LCD_CS_HIGH gpio_bit_set(GPIOC,LCD_CS_PIN)
- #define LCD_CS_LOW gpio_bit_reset(GPIOC,LCD_CS_PIN)
- #define LCD_RS_HIGH gpio_bit_set(GPIOA,LCD_RS_PIN)
- #define LCD_RS_LOW gpio_bit_reset(GPIOA,LCD_RS_PIN)
- #define LCD_RD_HIGH gpio_bit_set(GPIOB,LCD_RD_PIN)
- #define LCD_RD_LOW gpio_bit_reset(GPIOB,LCD_RD_PIN)
- #define LCD_WR_HIGH gpio_bit_set(GPIOC,LCD_WR_PIN)
- #define LCD_WR_LOW gpio_bit_reset(GPIOC,LCD_WR_PIN)
- #define LCD_RESET_HIGH gpio_bit_set(GPIOA,LCD_RESET_PIN)
- #define LCD_RESET_LOW gpio_bit_reset(GPIOA,LCD_RESET_PIN)
- #define LCD_BLK_HIGH gpio_bit_set(GPIOA,LCD_BLK_PIN)
- #define LCD_BLK_LOW gpio_bit_reset(GPIOA,LCD_BLK_PIN)
- #define LCD_BLK_STATUS (GPIO_ISTAT(GPIOA)&(LCD_BLK_PIN))//(GPIOA->IDR & (1<<8))
- #endif
- void transfer_data_lcd(u8 data, u8 data_type);//data_type: 0-CMD data 1-Display data.
- #if LCD_COMM == LCD_COMM_SPI
- void transfer_command_lcd(u8 data1);
- //void transfer_data_lcd(u8 data1);
- #elif LCD_COMM == LCD_COMM_IIC
- void iic_comm_lcd(u8 start, u8 stop, u8 addr, u8 ctrl, u16 len, u8 data, u8* buf);
- #endif
- u8 transfer_data_lcd_read(void);
- void initial_lcd25664_gpio(void);
- void initial_lcd25664(void);
- void lcd_address(int x,int y,int x_total,int y_total);
- void lcd_address_read(int x,int y,int x_total,int y_total);
- void clear_screen(void);
- void lcd_disp_readback(void);
- #endif
复制代码- #include "delay.h"
- #include "lcd25664.h"
- #include "spi.h"
- #include "myiic_lcd.h"
- #include "string.h"
- #define KEY_VALUE (u16)(1 << 10)
- #define LCD_IIC_SA0 0
- #define LCD_IIC_SA1 0
- #define LCD_IIC_ADDR_R (0x78 | (LCD_IIC_SA1 << 2) | (LCD_IIC_SA0 << 1) | 1)
- #define LCD_IIC_ADDR_W (0x78 | (LCD_IIC_SA1 << 2) | (LCD_IIC_SA0 << 1) | 0)
- #define LCD_IIC_CTRL_REGDATA_LAST (0x40) //01000000b A0:H-Data Register L-CMD Register
- #define LCD_IIC_CTRL_REGCMD_LAST (0x00) //01000000b A0:H-Data Register L-CMD Register
- #define LCD_IIC_CTRL_REGDATA_ANOTHER (0xC0) //01000000b A0:H-Data Register L-CMD Register
- #define LCD_IIC_CTRL_REGCMD_ANOTHER (0x80) //01000000b A0:H-Data Register L-CMD Register
- u8 lcd_iic_cmddata_buf[256];
- u8 lcd_iic_disp_buf[8][256];
- u8 lcd_iic_disp_buf_w[8][256];
- int lcd_disp_pos = 0;
- int lcd_disp_posX = 0, lcd_disp_posY = 0, lcd_disp_minX = 0, lcd_disp_minY = 0, lcd_disp_maxX = 0, lcd_disp_maxY = 0, lcd_disp_w = 0;
- void iic_comm_lcd(u8 start, u8 stop, u8 addr, u8 ctrl, u16 len, u8 data, u8* buf)
- {
- if(start)
- {
- LCD_Start_I2C(LCD_IIC_FAST_MODE); /*启动总线*/
- LCD_SendByte_I2C(addr, LCD_IIC_FAST_MODE);//01111000b -- SA0-0 SA1-0 RW-0(Write is 0)
- //LCD_ack_I2C(1,LCD_IIC_FAST_MODE);
- }
- LCD_SendByte_I2C(ctrl, LCD_IIC_FAST_MODE);//10000000b 1-Co
- //LCD_ack_I2C(1,LCD_IIC_FAST_MODE);
- if(len == 1)
- {
- LCD_SendByte_I2C(data, LCD_IIC_FAST_MODE);//10000000b 1-Co
- //LCD_ack_I2C(1,LCD_IIC_FAST_MODE);
- }
- else
- {
- for(u16 i = 0; i < len; i++)
- {
- LCD_SendByte_I2C(buf[i], LCD_IIC_FAST_MODE);//10000000b 1-Co
- //LCD_ack_I2C(1,LCD_IIC_FAST_MODE);
- }
- }
- if(stop)
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- }
- /**
- * @brief 写指令到 LCD 模块
- * @param[in] data1:命令参数
- * @return None
- */
- void transfer_command_lcd(u8 data1)
- {
- #if defined STM32F4XX
- #if LCD_COMM == LCD_COMM_SPI
- LCD_CS_LOW;//lcd_cs1=0;
- LCD_RS_LOW;//lcd_rs=0;
- LCD_RD_LOW;//lcd_rd=0;
- LCD_WR_LOW;//lcd_wr=0;
- SPI_ReadWriteByte_to_lcd(data1);
- LCD_RD_HIGH;//lcd_rd=1;
- LCD_CS_HIGH;//lcd_cs1=1;
- LCD_RD_LOW;//lcd_rd=0;
- #elif LCD_COMM == LCD_COMM_IIC
- //iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, data1, 0);
- LCD_Start_I2C(LCD_IIC_FAST_MODE); /*启动总线*/
- LCD_SendByte_I2C(0x78, LCD_IIC_FAST_MODE);//01111000b -- SA0-0 SA1-0 RW-0(Write is 0)
- LCD_SendByte_I2C(0x80, LCD_IIC_FAST_MODE);//10000000b 1-Co
- LCD_SendByte_I2C(data1, LCD_IIC_FAST_MODE);//10000000b 1-Co
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
- #else
- u16 regTemp = 0;
- LCD_CS_LOW;//lcd_cs1=0;
- LCD_RS_LOW;//lcd_rs=0;
- LCD_RD_LOW;//lcd_rd=0;
- LCD_WR_LOW;//lcd_wr=0;
- regTemp = gpio_output_port_get(GPIOC);//GPIO_ReadOutputData(GPIOC);
- regTemp = regTemp & 0xFF00;
- gpio_port_write(GPIOC,regTemp | data1);//GPIO_Write(GPIOC,regTemp | data1);//P1=data1;
- LCD_RD_HIGH;//lcd_rd=1;
- LCD_CS_HIGH;//lcd_cs1=1;
- LCD_RD_LOW;//lcd_rd=0;
- #endif
- }
- /**
- * @brief 写数据到 LCD 模块
- * @param[in] data1:数据参数
- * @return None
- */
- void transfer_data_lcd(u8 data, u8 data_type)//void transfer_data_lcd(u8 data1)
- {
- #if defined STM32F4XX
- #if LCD_COMM == LCD_COMM_SPI
- LCD_CS_LOW;//lcd_cs1=0;
- LCD_RS_HIGH;//lcd_rs=1;
- LCD_RD_LOW;//lcd_rd=0;
- LCD_WR_LOW;//lcd_wr=0;
- SPI_ReadWriteByte_to_lcd(data);
-
- LCD_RD_HIGH;//lcd_rd=1;
- LCD_CS_HIGH;//lcd_cs1=1;
- LCD_RD_LOW;//lcd_rd=0;
- #elif LCD_COMM == LCD_COMM_IIC
- LCD_SendByte_I2C(data, LCD_IIC_FAST_MODE);//
- if(data_type && lcd_disp_w)
- {
- lcd_iic_disp_buf_w[lcd_disp_posY][lcd_disp_posX] = data;
-
- lcd_disp_posX++;
- if(lcd_disp_posX > lcd_disp_maxX)
- {
- lcd_disp_posX = lcd_disp_minX;
- lcd_disp_posY++;
- if(lcd_disp_posY > lcd_disp_maxY)
- lcd_disp_posY = lcd_disp_minY;
- }
- }
- else
- lcd_disp_w = 0;
- //LCD_Start_I2C(LCD_IIC_FAST_MODE); /*启动总线*/
- //LCD_SendByte_I2C(0x78, LCD_IIC_FAST_MODE);//01111000b -- SA0-0 SA1-0 RW-0(Write is 0)
- //LCD_SendByte_I2C(0xC0, LCD_IIC_FAST_MODE);//10000000b 1-Co
- //LCD_SendByte_I2C(data1, LCD_IIC_FAST_MODE);//10000000b 1-Co
- //LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
- #else
- u16 regTemp = 0;
- LCD_CS_LOW;//lcd_cs1=0;
- LCD_RS_HIGH;//lcd_rs=1;
- LCD_RD_LOW;//lcd_rd=0;
- LCD_WR_LOW;//lcd_wr=0;
- regTemp = gpio_output_port_get(GPIOC);//GPIO_ReadOutputData(GPIOC);
- regTemp = regTemp & 0xFF00;
- gpio_port_write(GPIOC,regTemp | data1);//GPIO_Write(GPIOC,regTemp | data1);//P1=data1;
- LCD_RD_HIGH;//lcd_rd=1;
- LCD_CS_HIGH;//lcd_cs1=1;
- LCD_RD_LOW;//lcd_rd=0;
- #endif
- }
- u8 transfer_data_lcd_read(void)
- {
- u16 regTemp = 0;
- #if defined STM32F4XX
- #if LCD_COMM == LCD_COMM_SPI
-
- #elif LCD_COMM == LCD_COMM_IIC
- regTemp = LCD_RcvByte_I2C(LCD_IIC_FAST_MODE);
- #endif
- #else
-
- #endif
- return (u8)regTemp;
- }
- void read_data_lcd(u8* buf, u8 len)
- {
-
- }
- //u8 disp_change_flag = 0;
- void lcd_disp_readback(void)
- {
- lcd_address_read(0, 0, LCD_WIDTH, LCD_HEIGHT/8);
- for(int i=0;i<LCD_HEIGHT/8;i++)
- {
- for (int j=0; j< LCD_WIDTH; j++)
- {
- //iic_comm_lcd(1, 0, 0x79, 0xC0, 0, 0, 0);
- lcd_iic_disp_buf[i][j] = transfer_data_lcd_read();
- LCD_ack_I2C((i == LCD_HEIGHT/8 - 1 && j == LCD_WIDTH - 1) ? 1 : 0, LCD_IIC_FAST_MODE);
- //LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- }
- }
- #if LCD_COMM == LCD_COMM_IIC
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
-
- // if(disp_change_flag)
- // {
- // disp_change_flag = 0;
- // memset(lcd_iic_disp_buf, 0, sizeof(lcd_iic_disp_buf));
- // }
-
- if(memcmp(lcd_iic_disp_buf, lcd_iic_disp_buf_w, sizeof(lcd_iic_disp_buf_w)))//与显示内容不一致
- {
- memcpy(lcd_iic_disp_buf, lcd_iic_disp_buf_w, sizeof(lcd_iic_disp_buf_w));
- initial_lcd25664();
- #if defined STM32F4XX
- IWDG_ReloadCounter();
- #else
- fwdgt_counter_reload();//IWDG_ReloadCounter();
- #endif
- //LCD_BLK_HIGH;
-
- lcd_address(0, 0, LCD_WIDTH, LCD_HEIGHT/8);
- for(int i=0;i<LCD_HEIGHT/8;i++)
- {
- for (int j=0; j< LCD_WIDTH; j++)
- {
- transfer_data_lcd(lcd_iic_disp_buf[i][j], 1);
- }
- }
- #if LCD_COMM == LCD_COMM_IIC
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
- }
-
- }
- /**
- * @brief LCD引脚初始化
- * @param[in] None
- * @return None
- */
- void initial_lcd25664_gpio(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- #if defined STM32F4XX
-
- #if LCD_COMM == LCD_COMM_SPI
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC,ENABLE);
-
-
- GPIO_InitStructure.GPIO_Pin = (1U << 10) ;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = (1U << 3) ;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
-
- GPIO_PinAFConfig(GPIOB,10,GPIO_AF_SPI2);
- GPIO_PinAFConfig(GPIOC,3,GPIO_AF_SPI2);
-
-
- uint16_t tempreg = 0;
- SPI_DeInit(SPI2);
-
- tempreg = SPI2->CR1;
- tempreg &= 0x3040;
- tempreg |= (uint16_t)((uint32_t)SPI_Direction_2Lines_FullDuplex | SPI_Mode_Master |
- SPI_DataSize_8b | SPI_CPOL_High |
- SPI_CPHA_2Edge| SPI_NSS_Soft |
- SPI_BaudRatePrescaler_128 | SPI_FirstBit_MSB);
- SPI2->CR1 = tempreg;
- SPI2->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD);
- SPI2->CRCPR = 7;
- SPI2->CR1 |= SPI_CR1_SPE;
-
-
- GPIO_InitStructure.GPIO_Pin = (1U << 12) ;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIOB->BSRRL |= (1U << 12); //PB12 写高电平
- #elif LCD_COMM == LCD_COMM_IIC
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC,ENABLE);
- LCD_IIC_Init();
-
- GPIO_InitStructure.GPIO_Pin = LCD_CS_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// 开漏 //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
-
- GPIO_InitStructure.GPIO_Pin = LCD_RS_PIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
-
- GPIO_InitStructure.GPIO_Pin = LCD_RESET_PIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
-
- GPIO_InitStructure.GPIO_Pin = LCD_BLK_PIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
-
- LCD_CS_LOW;
- LCD_RS_HIGH;
- LCD_BLK_LOW;
- LCD_RESET_LOW;
- #else
-
- #endif
- #else
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_GPIOB);
- rcu_periph_clock_enable(RCU_GPIOC);
- gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_D0_D7_PIN | LCD_CS_PIN | LCD_WR_PIN);
- gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_RS_PIN | LCD_RESET_PIN | LCD_BLK_PIN);
- gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LCD_RD_PIN);
- #endif
- }
- /**
- * @brief LCD初始化
- * @param[in] None
- * @return None
- */
- void initial_lcd25664(void)
- {
- //初始化液晶屏IO
- //initial_lcd25664_gpio();
- LCD_RESET_LOW;//reset=0;
- delay_ms(10);
- LCD_RESET_HIGH;//reset=1;
- delay_ms(10);
- #if LCD_COMM == LCD_COMM_SPI
- transfer_command_lcd(0x30); //EXT=0
- transfer_command_lcd(0x94); //Sleep out
- transfer_command_lcd(0x31); //EXT=1
- transfer_command_lcd(0xD7); //Autoread disable
- transfer_data_lcd(0X9F, 0); //
- transfer_command_lcd(0x32); //Analog SET
- transfer_data_lcd(0x00, 0); //OSC Frequency adjustment
- transfer_data_lcd(0x01, 0); //Frequency on booster capacitors->6KHz
- transfer_data_lcd(0x05, 0); //Bias=1/9
- transfer_command_lcd(0x20); // Gray Level
- transfer_data_lcd(0x01, 0);
- transfer_data_lcd(0x03, 0);
- transfer_data_lcd(0x05, 0);
- transfer_data_lcd(0x07, 0);
- transfer_data_lcd(0x09, 0);
- transfer_data_lcd(0x0b, 0);
- transfer_data_lcd(0x0d, 0);
- transfer_data_lcd(0x10, 0);
- transfer_data_lcd(0x11, 0);
- transfer_data_lcd(0x13, 0);
- transfer_data_lcd(0x15, 0);
- transfer_data_lcd(0x17, 0);
- transfer_data_lcd(0x19, 0);
- transfer_data_lcd(0x1b, 0);
- transfer_data_lcd(0x1d, 0);
- transfer_data_lcd(0x1f, 0);
-
- transfer_command_lcd(0x30); //EXT1=0,EXT0=0,表示选择了“扩展指令表 1”
- transfer_command_lcd(0x75); //页地址设置
- transfer_data_lcd(0X00, 0); //起始页地址:YS=0X00
- transfer_data_lcd(0X1f, 0); //结束页地址:YE=0x1F 每 4 行为一页,第 0~3 行为第 0 页,第 124~127 行为第 31页
- transfer_command_lcd(0x15); //列地址设置
- transfer_data_lcd(0X00, 0); //起始列地址:XS=0
- transfer_data_lcd(0Xff, 0); // 结束列地址:XE=256(0xff)
- transfer_command_lcd(0xBC); //Data scan direction
- transfer_data_lcd(0x00, 0); //MX.MY=Normal
- transfer_data_lcd(0xA6, 0);
- transfer_data_lcd(0x0c, 0); //数据格式,如果设为 0x0C:表示选择 LSB(DB0)在顶,如果设为 0x08:表示选择LSB(DB0)在底
- transfer_command_lcd(0xCA); //显示控制
- transfer_data_lcd(0X00, 0); //设置 CL 驱动频率:CLD=0
- transfer_data_lcd(0X3F, 0); //占空比:Duty=64
- transfer_data_lcd(0X20, 0); //N 行反显:Nline=off
- transfer_command_lcd(0xF0); //显示模式
- transfer_data_lcd(0X10, 0); //如果设为 0x11:表示选择 4 灰度级模式,如果设为 0x10:表示选择黑白模式
- transfer_command_lcd(0x81); //设置对比度, “0x81”不可改动,紧跟着的 2 个数据是可改的,但“先微调后粗调”这个顺序别乱了
- transfer_data_lcd(0x12, 0); //对比度微调,可调范围 0x00~0x3f,共 64 级
- transfer_data_lcd(0x02, 0); //对比度粗调,可调范围 0x00~0x07,共 8 级
- transfer_command_lcd(0x20); //Power control
- transfer_data_lcd(0x0B, 0); //D0=regulator ; D1=follower ; D3=booste, on:1 off:0
- delay_us(1);
- transfer_command_lcd(0xAF); //打开显示
- #elif LCD_COMM == LCD_COMM_IIC
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0);//EXT=0
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x94, 0);//Sleep out
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x31, 0);//EXT=1
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0xD7, 0);//Autoread disable
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 1, 0x9F, lcd_iic_cmddata_buf);//Set to disable
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x32, 0);//Analog SET. 偏压比设置
- lcd_iic_cmddata_buf[0] = 0x00; lcd_iic_cmddata_buf[1] = 0x01; lcd_iic_cmddata_buf[2] = 0x05;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 3, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x20, 0);// Gray Level
- lcd_iic_cmddata_buf[0] = 0x01; lcd_iic_cmddata_buf[1] = 0x03; lcd_iic_cmddata_buf[2] = 0x05;
- lcd_iic_cmddata_buf[3] = 0x07; lcd_iic_cmddata_buf[4] = 0x09; lcd_iic_cmddata_buf[5] = 0x0b;
- lcd_iic_cmddata_buf[6] = 0x0d; lcd_iic_cmddata_buf[7] = 0x10; lcd_iic_cmddata_buf[8] = 0x11;
- lcd_iic_cmddata_buf[9] = 0x13; lcd_iic_cmddata_buf[10] = 0x15; lcd_iic_cmddata_buf[11] = 0x17;
- lcd_iic_cmddata_buf[12] = 0x19; lcd_iic_cmddata_buf[13] = 0x1b; lcd_iic_cmddata_buf[14] = 0x1d;
- lcd_iic_cmddata_buf[15] = 0x1f;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 16, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0); //EXT1=0,EXT0=0,表示选择了“扩展指令表 1”
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x75, 0); //页地址设置
- lcd_iic_cmddata_buf[0] = 0x00; lcd_iic_cmddata_buf[1] = 0x1f;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x15, 0); //列地址设置
- lcd_iic_cmddata_buf[0] = 0x00; lcd_iic_cmddata_buf[1] = 0xff;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0xBC, 0);//Data scan direction
- lcd_iic_cmddata_buf[0] = 0x00; lcd_iic_cmddata_buf[1] = 0xA6; lcd_iic_cmddata_buf[2] = 0x0C;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 3, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0xCA, 0);//显示控制
- lcd_iic_cmddata_buf[0] = 0x00; lcd_iic_cmddata_buf[1] = 0x3F; lcd_iic_cmddata_buf[2] = 0x20;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 3, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0xF0, 0);//显示模式
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 1, 0x10, lcd_iic_cmddata_buf);//如果设为 0x11:表示选择 4 灰度级模式,如果设为 0x10:表示选择黑白模式
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x81, 0);//设置对比度, “0x81”不可改动,紧跟着的 2 个数据是可改的,但“先微调后粗调”这个顺序别乱
- lcd_iic_cmddata_buf[0] = 0x12; lcd_iic_cmddata_buf[1] = 0x02;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x20, 0);//Power control
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 1, 0x0B, lcd_iic_cmddata_buf);//D0=regulator ; D1=follower ; D3=booste, on:1 off:0
- delay_us(1);
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0xAF, 0);
- #endif
- //LCD_BLK_LOW;//LCD_BLK_HIGH;
- clear_screen();
- }
- /**
- * @brief 设置LCD页地址&列地址
- * @param[in] x:列起始地址 0 ~ (LCD_WIDTH-1)
- * @param[in] y:页起始地址 0 ~ (LCD_HEIGHT/8 -1)
- * @param[in] x_total:总列数
- * @param[in] y_total:总页数
- * @return None
- */
- void lcd_address(int x,int y,int x_total,int y_total)
- {
- x = x % LCD_WIDTH;
- y = y % (LCD_HEIGHT/8);
-
- #if LCD_COMM == LCD_COMM_SPI
- transfer_command_lcd(0x15); //Set Column Address
- transfer_data_lcd(x, 0);
- transfer_data_lcd(x+x_total-1, 0);
-
- transfer_command_lcd(0x75); //Set Page Address
- transfer_data_lcd(y, 0);
- transfer_data_lcd(y+y_total-1, 0);
-
- transfer_command_lcd(0x30);
- transfer_command_lcd(0x5c);
- #elif LCD_COMM == LCD_COMM_IIC//当使用IIC方式时,此函数后只能跟显示数据
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0);//EXT=0
-
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x15, 0); //列地址设置
- lcd_iic_cmddata_buf[0] = x; lcd_iic_cmddata_buf[1] = x+x_total-1;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
-
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x75, 0); //页地址设置
- lcd_iic_cmddata_buf[0] = y; lcd_iic_cmddata_buf[1] = y+y_total-1;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
-
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0);//EXT=0
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x5C, 0);//写数据
- iic_comm_lcd(0, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 0, 0, 0);
- #endif
-
- lcd_disp_posX = x;
- lcd_disp_posY = y;
- lcd_disp_minX = x;
- lcd_disp_minY = y;
- lcd_disp_maxX = x+x_total-1;
- lcd_disp_maxY = y+y_total-1;
- if(lcd_disp_maxX >= LCD_WIDTH)
- lcd_disp_maxX = LCD_WIDTH - 1;
- if(lcd_disp_maxY >= LCD_HEIGHT/8)
- lcd_disp_maxY = LCD_HEIGHT/8 - 1;
- lcd_disp_w = 1;
- }
- /**
- * @brief 从LCD中读出显示数据
- * @param[in] x:列起始地址 0 ~ (LCD_WIDTH-1)
- * @param[in] y:页起始地址 0 ~ (LCD_HEIGHT/8 -1)
- * @param[in] x_total:总列数
- * @param[in] y_total:总页数
- * @return None
- */
- void lcd_address_read(int x,int y,int x_total,int y_total)
- {
- //x=x-1;
- //y=y-1;
- x = x % LCD_WIDTH;
- y = y % (LCD_HEIGHT/8);
- #if LCD_COMM == LCD_COMM_SPI//SPI方式不支持读回
- transfer_command_lcd(0x15); //Set Column Address
- transfer_data_lcd(x, 0);
- transfer_data_lcd(x+x_total-1, 0);
- transfer_command_lcd(0x75); //Set Page Address
- transfer_data_lcd(y, 0);
- transfer_data_lcd(y+y_total-1, 0);
- transfer_command_lcd(0x30);
- transfer_command_lcd(0x5d);
- #elif LCD_COMM == LCD_COMM_IIC//
- //iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0);//EXT=0
-
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x15, 0); //列地址设置
- lcd_iic_cmddata_buf[0] = x; lcd_iic_cmddata_buf[1] = x+x_total-1;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
-
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x75, 0); //页地址设置
- lcd_iic_cmddata_buf[0] = y; lcd_iic_cmddata_buf[1] = y+y_total-1;
- iic_comm_lcd(0, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGDATA_LAST, 2, 0x00, lcd_iic_cmddata_buf);
-
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_LAST, 1, 0x30, 0);//EXT=0
- iic_comm_lcd(1, 1, LCD_IIC_ADDR_W, LCD_IIC_CTRL_REGCMD_ANOTHER, 1, 0x5D, 0);//读数据
- iic_comm_lcd(1, 0, LCD_IIC_ADDR_R, LCD_IIC_CTRL_REGDATA_LAST, 0, 0, 0);
- LCD_RcvByte_I2C(LCD_IIC_FAST_MODE);//不知为何,直接读取会从设置的结束地址开始读。所以此处先空出1个字节的读取。
- LCD_ack_I2C(0, LCD_IIC_FAST_MODE);
- #endif
- }
- /**
- * @brief 清屏
- * @param[in] None
- * @return None
- */
- void clear_screen(void)
- {
- int i,j;
- lcd_address(0,0,256,8);
- for(i=0;i<LCD_HEIGHT/8;i++)
- {
- for(j=0;j<LCD_WIDTH;j++)
- {
- transfer_data_lcd(0x00, 1);
- }
- }
- #if LCD_COMM == LCD_COMM_IIC
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
- }
- void disp_read(int x, int y, int width, int height, u8* dp, u16 max_len)
- {
- if(max_len < width * height / 8)
- return;
- lcd_address_read(x,y,width,height/8);
- for(u8 i = 0; i < 64; i++)
- dp[i] = transfer_data_lcd_read();
- //read_data_lcd(dp, width * height / 8);
- #if LCD_COMM == LCD_COMM_IIC
- LCD_Stop_I2C(LCD_IIC_FAST_MODE);
- #endif
- }
复制代码 |
|