读取W25Q64数据并显示在OLED
一、数据准备
1.PS处理图片
- 裁剪
将图片裁剪为128*64 - 处理为单色
①图像->模式->灰度
②图像->模式->位图 - 批处理
①窗口->动作
②文件->自动->批处理
2.python处理
import os
import cv2 as cv
import numpy as np
import struct
import binascii
from PIL import Image
def BMP_2_OLED_HEAD(pic_name,pic_type):
print('开始转换图片:',pic_name+ '.' + pic_type)
py_dir = os.getcwd()
file_handle = open(py_dir + '/OLED/BMP12864/'+'ImgData.txt', 'a')
file_handle.write('static unsigned char ' + pic_type + pic_name + '[] =\n{\n')
img_screen = Image.open(py_dir + '/OLED/BMP12864/' + pic_name + '.' + pic_type)
img_screen = np.array(img_screen)
str_bin_8bit = ''
for page in range(0,8):
for lie in range(0, 128):
for hang in range(7, -1,-1):
str_bin_8bit = str_bin_8bit + str(img_screen[page*8+hang][lie])
mumber = int(str_bin_8bit, 2)
str_hex = '0x' + hex(mumber)[2:].zfill(2).replace("0x", "") + ','
str_bin_8bit = ''
file_handle.write(str_hex)
if (lie+1)%16==0:
file_handle.write('\n')
file_handle.write('};\n')
file_handle.close()
print(pic_name + '.' + pic_type,'转换结束!')
def BMP_2_OLED_HEAD_AUTO():
picture_type = 'bmp'
picture_num = 16
for namex in range(0, picture_num):
if len(str(namex)) == 1:
strName = '0' + str(namex)
if len(str(namex)) == 2:
strName = str(namex)
BMP_2_OLED_HEAD(strName,picture_type)
二、W25Q64操作
1.初始化
- 并不需要初始化,只需通过判断ID是否正确,确保W25Q64工作正常
uint16_t jidcode = 0;
uint32_t midcode = 0;
jidcode = W25Q_ReadJID16();
midcode = W25Q_ReadMID32();
user_info("W25Q64 JID=%x\tMID=%x", jidcode, midcode);
HAL_Delay(2000);
uint8_t read_buf[1024] = {0};
W25QXX_Read(read_buf, 0, W25Q64_ONETIME_WR);
int W25QXX_Read(uint8_t *buffer, uint32_t start_addr, uint16_t nbytes)
{
uint8_t cmd = READ_DATA_CMD_0x03;
start_addr = start_addr << 8;
W25QXX_Wait_Busy();
W25Q_CS_0;
SPI_Transmit(&cmd, 1);
if (HAL_OK == SPI_Transmit((uint8_t *)&start_addr, 3))
{
if (HAL_OK == SPI_Receive(buffer, nbytes))
{
W25Q_CS_1;
return 0;
}
}
W25Q_CS_1;
return -1;
}
uint8_t write_buf[W25Q64_ONETIME_WR] = {0};
W25QXX_Page_Program(write_buf, 0, W25Q64_ONETIME_WR);
void W25QXX_Page_Program(uint8_t *dat, uint32_t WriteAddr, uint16_t nbytes)
{
uint8_t cmd = PAGE_PROGRAM_CMD_0x02;
WriteAddr <<= 8;
W25QXX_Write_Enable();
W25Q_CS_0;
SPI_Transmit(&cmd, 1);
SPI_Transmit((uint8_t *)&WriteAddr, 3);
SPI_Transmit(dat, nbytes);
W25Q_CS_1;
W25QXX_Wait_Busy();
}
void W25QXX_Erase_Sector(uint32_t sector_addr)
{
uint8_t cmd = SECTOR_ERASE_CMD_0x20;
sector_addr *= 4096;
sector_addr <<= 8;
W25QXX_Write_Enable();
W25QXX_Wait_Busy();
W25Q_CS_0;
SPI_Transmit(&cmd, 1);
SPI_Transmit((uint8_t *)§or_addr, 3);
W25Q_CS_1;
W25QXX_Wait_Busy();
}
void Write_1024Byte_To_W25Q64(uint8_t *bmpdata, uint16_t sector_addr, uint8_t page_addr)
void Read_1024Byte_From_W25Q64(uint8_t *bmpdata, uint16_t sector_addr, uint8_t page_addr)
三、OLED显示
W25QXX_Erase_Sector(0);
Write_1024Byte_To_W25Q64(bmp00,0,0);
Write_1024Byte_To_W25Q64(bmp01,0,4);
Write_1024Byte_To_W25Q64(bmp02,0,8);
Write_1024Byte_To_W25Q64(bmp03,0,12);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 13; j = j + 4)
{
Read_1024Byte_From_W25Q64(read_buf, i, j);
OLED_ShowBmp_12864(read_buf);
OLED_Refreash();
HAL_Delay(1000);
}
}