STM32f103系列诺基亚5110lcd液晶显示程序
主体的程序来源于OPENEDV论坛
适用于STM32F103系列
移植改端口只需在LCD5110.h中改管脚即可
本程序包括汉字,英文字符,图片显示,画圆,矩形等子涵,具体参见LCD5110.C
编译BY @kinsley
LCD5110.C
#include "stm32f10x.h"
#include "LCD5110.h"
#include "delay.h"
#include "Pixel_EN.h"
#include "Pixel_CH.h"
#include "Picture.h"
#define uchar unsigned char
//------------------------------------------------------------------- // Nokia5510指令集
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 1 0 0 PD V H
// | | |_______1->扩展指令集 0->基本指令集
// | |___________1->垂直寻址 0->水平寻址
// |_______________1->低功耗模式 0->正常模式
//------------------------------------------------------------------- // 显示模式
// D7 D6 D5 D4 D3 D2 D1 D0
// 0 0 0 0 1 D 0 E
// | |_______0 0 1 1 // |_______________0 1 0 1 // 白屏 正常 全显 反转
//-------------------------------------------------------------------
/******************************************************************************
************************************************************** @f_name: void LCD5110_GPIOInit(void)
@brief: 初始化硬件端口配置
@param: None
@return: None
*******************************************************************************
**************************************************************/ u8 Value_List[504];
void LCD5110_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LCDRCC_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LCD_CTRL_PORT, &GPIO_InitStructure);
LCD5110_Init();
}
/******************************************************************************
**************************************************************
@f_name: void LCD5110_Init(void)
@brief: 液晶初始化
@param: None
@return: None
*******************************************************************************
**************************************************************/
void LCD5110_Init(void)
{
//复位LCD_低电平脉冲
LCD_RST_L;
delay_ms(1);
LCD_RST_H;
//复位串行接口_高电平脉冲
LCD_CE_H;
delay_ms(1);
LCD_CE_L;
//设置LCD
LCD5110_Send(0x21, DC_CMD); //使用扩展命令设置LCD模式
LCD5110_Send(0xC8, DC_CMD); //设置偏置电压
LCD5110_Send(0x06, DC_CMD); //温度校正
LCD5110_Send(0x13, DC_CMD); //1:48
LCD5110_Send(0x20, DC_CMD); //使用基本命令
LCD5110_Send(0x0C, DC_CMD); //设定显示模式,正常显示
LCD5110_SetContrast(65); //对比度为68
}
/******************************************************************************
**************************************************************
@f_name: void LCD5110_SetContrast(u8 contrast) @brief: 设置LCD对比度(对比度范围: 0~127)
@param: None
@return: None
*******************************************************************************
**************************************************************/ void LCD5110_SetContrast(u8 contrast)
{
LCD5110_Send(0x21, DC_CMD);
LCD5110_Send(0x80 | contrast, DC_CMD);
LCD5110_Send(0x20, DC_CMD);
}
/******************************************************************************
************************************************************** @f_name: void LCD5110_SetXY(u8 X, u8 Y)
@brief: 设置LCD当前坐标
@param: X:0~83 Y:0~5
@return: None
*******************************************************************************
**************************************************************/ void LCD5110_SetXY(u8 X, u8 Y)
{
if(X>83) X=83;
if(Y>5) Y=5;
LCD5110_Send(0x40 | Y, DC_CMD); // 行
LCD5110_Send(0x80 | X, DC_CMD); // 列
}
/******************************************************************************
************************************************************** @f_name: void LCD5110Clear(void)
@brief: LCD全部清屏
@param: None
@return: None
*******************************************************************************
**************************************************************/ void LCD5110Clear(void)
{
u16 i;
LCD5110_Send(0x0c, DC_CMD);
LCD5110_Send(0x80, DC_CMD);
for (i=0; i<504; i++)
LCD5110_Send(0, DC_DATA);
}
/******************************************************************************
**************************************************************
@f_name: void LCD5110ClearPart(u8 X,u8 Y,u8 L,u8 H) @brief: LCD部分清屏
@param: u8 X,u8 Y, u8 L, u8 H @return: None
*******************************************************************************
**************************************************************/
void LCD5110ClearPart(u8 X,u8 Y,u8 L,u8 H) {
u16 i,j;
LCD5110_Send(0x0c, DC_CMD);
LCD5110_Send(0x80, DC_CMD);
for (i=Y; i84)
{
X=0;
Y=Y+1;
*s--;
if(Y>=6) {Y=0;}
}
}
}
/******************************************************************************
**************************************************************
@f_name: void LCD5110ShowNum(u8 X,u16 Y,u32 num)
@brief: 显示一个数字
@param: x,y:起点坐标 num:数值(0~65536);
@return: None
*******************************************************************************
**************************************************************/
//m^n函数
u32 mypow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
void LCD5110ShowNum(u8 X,u16 Y,u32 num) {
u32 res;
u8 t=0,t1=0;
res=num;
if(!num)LCD5110WriteChar( X,Y,'0');//显示0
while(res) //得到数字长度
{
res/=10;
t++;
}
t1=t;
while(t) //显示数字
{
res=mypow(10,t-1);
LCD5110WriteChar(X+(t1-t)*6,Y,(num/res)%10+'0');//数字字符第一个在'0'之前
t--;
}
}
/******************************************************************************
************************************************************** @f_name: void LCD5110WriteChStr(u8 X, u8 Y,u8 n) @brief: 向LCD写中文字符串
@param: u8 X, u8 Y,u8 n
@return: None
*******************************************************************************
**************************************************************/ void LCD5110WriteChStr(u8 X, u8 Y,u8 n)
{
int i;
LCD5110_SetXY(X,Y);
for(i = 0;i < 12; i++)//汉字上半身
{
LCD5110_Send(chinese_character[n][i],DC_DATA);
}
LCD5110_SetXY(X,Y+1);
for(i = 12; i < 24; i++)//汉字下半身
{LCD5110_Send(chinese_character[n][i],DC_DATA);} }
/******************************************************************************
************************************************************** @f_name: Nokia5110_DrawPoint(u8 X, u8 Y)
@brief: //打点函数(水平寻址)
@param: //x:0-83, y:0-47
@return: //返回值:1:成功 :失败0
*******************************************************************************
**************************************************************/
u8 Nokia5110_DrawPoint(u8 X, u8 Y)
{
u8 y1 = 0, y2 = 0;
if (X > 83 || Y > 47)
{
return 0;
}
y1 = Y / 8;
y2 = Y % 8;
LCD5110_SetXY(X,y1);
Value_List[y1 *84 + X] |= 0x01 << y2; //与事先保存的该位置的数据相或,并将新得到
的数据写入显示出来
LCD5110_Send(Value_List[y1 *84 + X], DC_DATA);
return 1;
}
/******************************************************************************
************************************************************** @f_name: Nokia5110_ShowPicturePoint(void)
@brief: //显示自定义图片
@param: //x:0-83, y:0-47
@return:
*******************************************************************************
**************************************************************/ void Nokia5110_ShowPicturePoint(void)
{
u8 x_pos = 0, y_pos = 0;
u8 j, tmp;
u16 i;
LCD5110Clear();
for (i = 0; i < 504; i++)
{
tmp = Picture[i];
for (j = 0; j < 8; j++)
{
if (tmp & 0x01)
{
Nokia5110_DrawPoint(x_pos, y_pos);
}
tmp >>= 1;
y_pos++;
}
if ((i + 1) % 6 == 0)
{
x_pos++;
y_pos = 0;
}
}
}
/******************************************************************************
************************************************************** @f_name: LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) @brief: //画线 (x1,y1) to (x2,y2)
@param: //x:0-83, y:0-47
@return:
*******************************************************************************
**************************************************************/
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{
Nokia5110_DrawPoint(uRow,uCol);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/******************************************************************************
**************************************************************
@f_name: void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) @brief: //画矩形,对角线(x1,y1) to (x2,y2)
@param: //x:0-83, y:0-47
@return:
*******************************************************************************
**************************************************************/ void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) {
LCD_DrawLine(x1,y1,x2,y1);
LCD_DrawLine(x1,y1,x1,y2);
LCD_DrawLine(x1,y2,x2,y2);
LCD_DrawLine(x2,y1,x2,y2);
}
/******************************************************************************
************************************************************** @f_name: void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2) @brief: //画矩形,对角线(x1,y1) to (x2,y2)
@param: //x:0-83, y:0-47
@return:
*******************************************************************************
**************************************************************/ void LCD_DrawTriangle(u16 x1, u16 y1, u16 x2, u16 y2) {
LCD_DrawLine(x1,y1,x2,y1);
LCD_DrawLine(x1,y1,x1,y2);
LCD_DrawLine(x1,y2,x2,y1);
}
/******************************************************************************
************************************************************** @f_name: void Draw_Circle(u16 x0,u16 y0,u8 r)
@brief: //画圆 原点(x,y),半径r
@param: //x:0-83, y:0-47
@return:
*******************************************************************************
**************************************************************/ void Draw_Circle(u16 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
Nokia5110_DrawPoint(x0-b,y0-a); //3
Nokia5110_DrawPoint(x0+b,y0-a); //0
Nokia5110_DrawPoint(x0-a,y0+b); //1
Nokia5110_DrawPoint(x0-b,y0-a); //7
Nokia5110_DrawPoint(x0-a,y0-b); //2
Nokia5110_DrawPoint(x0+b,y0+a); //4
Nokia5110_DrawPoint(x0+a,y0-b); //5
Nokia5110_DrawPoint(x0+a,y0+b); //6
Nokia5110_DrawPoint(x0-b,y0+a);
a++;
//使用Bresenham算法画圆
if(di<0)
di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
Nokia5110_DrawPoint(x0+a,y0+b);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线
LCD5110.h
#ifndef _LCD5110_H
#define _LCD5110_H
#include"sys.h"
//宽高像素
#define LCD_X_RES 84
#define LCD_Y_RES 48
//枚举 D/C模式选择
typedef enum //emum为枚举常量
{
DC_CMD = 0, //写命令
DC_DATA = 1 //写数据
} DCType;
//------------------------------------------------------------管脚修改区
-----------------------------------------------------------------------
#define LCD_CTRL_PORT GPIOB
#define LCDRCC_CLK RCC_APB2Periph_GPIOB
#define LCD_RST GPIO_Pin_3
#define LCD_CE GPIO_Pin_5
#define LCD_DC GPIO_Pin_7
#define LCD_MOSI GPIO_Pin_9
#define LCD_CLK GPIO_Pin_11
// #define LCD_VCC GPIO_Pin_13
// #define LCD_BGL GPIO_Pin_15
//---------------------------------------------------------------------------------------------------------------------
------------------------
//H结尾为1,L结尾为0
#define LCD_RST_H GPIO_SetBits(LCD_CTRL_PORT, LCD_RST) #define LCD_RST_L GPIO_ResetBits(LCD_CTRL_PORT, LCD_RST)
#define LCD_CE_H GPIO_SetBits(LCD_CTRL_PORT, LCD_CE) #define LCD_CE_L GPIO_ResetBits(LCD_CTRL_PORT, LCD_CE)
#define LCD_DC_DATA GPIO_SetBits(LCD_CTRL_PORT, LCD_DC) #define LCD_DC_CMD GPIO_ResetBits(LCD_CTRL_PORT, LCD_DC)
#define LCD_MOSI_H GPIO_SetBits(LCD_CTRL_PORT, LCD_MOSI) #define LCD_MOSI_L GPIO_ResetBits(LCD_CTRL_PORT, LCD_MOSI)
#define LCD_CLK_H GPIO_SetBits(LCD_CTRL_PORT, LCD_CLK) #define LCD_CLK_L GPIO_ResetBits(LCD_CTRL_PORT, LCD_CLK)
#define LCD_VCC_H GPIO_SetBits(LCD_CTRL_PORT, LCD_VCC)
#define LCD_BGL_H GPIO_SetBits(LCD_CTRL_PORT, LCD_BGL)
#define LCD_GND_L GPIO_ResetBits(LCD_CTRL_PORT, LCD_GND)
void LCD5110_GPIOInit(void);
void LCD5110_Init(void) ;
void LCD5110_SetContrast(u8 contrast);
void LCD5110_SetXY(u8 X, u8 Y);
void LCD5110Clear(void);
void LCD5110ClearPart(u8 X,u8 Y,u8 L,u8 H);
void LCD5110_Send(u8 data, DCType dc);
void LCD5110WriteChar(u8 X, u8 Y,u8 ascii);
void LCD5110WriteEnStr(u8 X, u8 Y, u8* s);
u32 mypow(u8 m,u8 n);
void LCD5110ShowNum(u8 X,u16 Y,u32 num);
void LCD5110WriteChStr(u8 X, u8 Y,u8 n);
void Nokia5110_ShowPicturePoint(void);
u8 Nokia5110_DrawPoint(u8 X, u8 Y) ;
void Draw_Circle(u16 x0,u16 y0,u8 r);
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);
void LCD_DrawTriangle(u16 x1, u16 y1, u16 x2, u16 y2);
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线
Picture.h
#ifndef _PICTURE_H_
#define _PICTURE_H_
const unsigned char Picture[504] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x00, 0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x60,0xF8,0x00,0x00,0x00,0x00,0x40,0xF8, 0x00,0x00,0x00,0x00,0xC0,0xF0,0x00,0x00,0x00,0x00,0x80,0xF0,0x00,0x00,0x00,0x00, 0x80,0xC1,0x00,0x00,0x00,0x00,0x80,0xE9,0x00,0x00,0x00,0x00,0x80,0xF8,0x00,0x00, 0x00,0x00,0x80,0xF8,0x00,0x00,0x00,0x00,0x70,0xFC,0x00,0x00,0x00,0x00,0x70,0xFE, 0x00,0x00,0x00,0x00,0xC0,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00, 0xE4,0xFF,0x00,0x00,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00,0xF0,0xFF,0x00,0x00, 0x00,0x00,0xF8,0xFF,0x00,0x1F,0x00,0x00,0xF8,0xFF,0xC0,0x3F,0x00,0x00,0xFC,0xFF, 0xE0,0x7F,0x00,0x00,0xFC,0xFF,0xE0,0xFF,0x01,0x00,0xFC,0xFF,0xF0,0x23,0x00,0x00,
0xFC,0xFF,0xF8,0xE1,0x80,0x05,0xFE,0xFF,0xF8,0x61,0x81,0xA7,0xFF,0xFF,0xFC,0xA0, 0x03,0xE7,0xFF,0xFF,0xFC,0xA0,0xC2,0xE7,0xFF,0xFF,0xFC,0xA0,0xC2,0xE6,0xFF,0xFF, 0xFC,0xA0,0x62,0xF7,0xFF,0xFF,0xFE,0xE0,0x30,0xFF,0xFF,0xFF,0x7E,0xC0,0x28,0xF9, 0xFF,0xFF,0x7E,0xC0,0x30,0xD7,0xFF,0xFF,0x7E,0x00,0x60,0xB7,0xFF,0xFF,0x7E,0x00, 0x60,0x27,0xFE,0xFF,0x7E,0x40,0x60,0x67,0xFC,0xFF,0x3E,0xE0,0x20,0x67,0xF0,0xFF, 0x3E,0xE0,0x20,0x66,0xF8,0xFF,0x3E,0xA0,0x09,0xE3,0xFC,0xFF,0x3E,0xA0,0x12,0xE1, 0x3E,0xFC,0x3E,0xA0,0x92,0xA0,0x39,0xF0,0x3E,0xA0,0xA0,0xB0,0x01,0xC0,0x3E,0xB0, 0xA0,0xB1,0x00,0x00,0x3E,0xB0,0xC0,0x39,0x00,0x00,0x7C,0x80,0x00,0x3E,0x00,0x00, 0xFC,0x01,0x00,0x3F,0x0A,0x00,0xFC,0x0F,0x00,0x1E,0x00,0x00,0xF8,0x1F,0x00,0x0F, 0x04,0x00,0xF8,0x3F,0x80,0x0F,0x04,0x00,0xF0,0x7F,0xCE,0x03,0x04,0x00,0xF0,0xFF, 0xF7,0x00,0x00,0xC8,0xE0,0xFF,0x30,0x00,0xE8,0xFF,0xC0,0xFF,0x61,0xC0,0xFF,0xFF, 0x80,0x7F,0xC0,0xF8,0xFF,0xFF,0x00,0x5F,0x80,0xFF,0xFF,0xFF,0x00,0x80,0x80,0xFF, 0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00, 0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF, 0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xFF, 0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF, 0x00,0x00,0x00,0xFE,0xFF,0xF7,0x00,0x00,0x00,0xFE,0xFF,0xF7,0x00,0x00,0x00,0xFE, 0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x00,0x00, 0x00,0xFE,0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFF,0xFF, 0x00,0x00,0x00,0xFC,0xFF,0xF7,0x00,0x00,0x00,0xFC,0xFF,0xFF,0x00,0x00,0x00,0xFC, 0xFF,0xFF,0x00,0x00,0x00,0xFC,0xFF,0xFF,/*"C:\Users\Kingsley\Desktop\70f9fd63jw1eanvqrot9ej206j064aa0.bmp",0*/
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线
Pixel_CH.h
/*汉字取模*/
#ifndef _PIXEL_CH_H
#define _PIXEL_CH_H
const char chinese_character[][24]=
{
{0xFE,0x02,0xFE,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x00,0x03,0x01,0x03,0x00,
0x03,0x01,0x01,0x09,0x08,0x0F,0x00,0x00},/*"?",0*/
{0xFE,0x02,0xFE,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x00,0x03,0x01,0x03,0x00,
0x03,0x01,0x01,0x09,0x08,0x0F,0x00,0x00},/*"?",1*/
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////分割线
Pixel_EN.h
#ifndef _PIXEL_EN_H
#define _PIXEL_EN_H
const u8 Font6x8[][6] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
};
#endif