浅谈STM32的FSMC的TFT笔记

1、fsmc初初了解:
fsmc 包括4个模块:
(1)ahb接口(包括fsmc配置寄存器)
(2)nor闪存和psram控制器(驱动lcd的时候lcd就好像一个psram的里面只有2个16位的存储空间,一个是data ram 一个是cmd ram)
(3)nand闪存和pc卡控制器
(4)外部设备接口
我们驱动tft很明显用的是第二个模块:nor闪存。
2、fsmc的外设地址选择
fsmc _bank 用来选择外接存储器的地址,fsmc所控制的外存储器所映射的地址是0x6000 0000 ~ 0x9fff ffff
其中属于nor flash 的是0x6000 0000 ~ 0x6fff ffff ,然后这部分的地址空间又被分为四份,每份64mb, 编号是bank1 ~ bank 4 ,每个bank 都有一个片选引脚。
而这四个分存储块的片选,则使用ne[4:1]来选择。数据线/地址线/控制线是共享的。
ne1 ->bank1 ne2->bank2 ne3->bank3 ne4->bank4
第一块:6000 0000h--63ff ffffh
第二块:6400 0000h--67ff ffffh
第三块:6800 0000h--6bff ffffh
第四块:6c00 0000h--6fff ffffh
3、fsmc 驱动lcd
fsmc提供了所有的lcd控制器的信号:
fsmc_d[16:0]:16bit的数据总线
fsmc nex:分配给nor的256m,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是ne1-ne4,对应的引脚为:pd7—ne1,pg9—ne2,pg10-ne3,pg12—ne4
fsmc noe:输出使能,连接lcd的rd脚。
fsmc nwe:写使能,连接lcd的rw脚。
fsmc ax:用在lcd显示ram和寄存器之间进行选择的地址线,即该线用于选择lcd的rs脚,该线可用地址线的任意一根线,范围:fsmc_a[25:0]。
正如我们操作12864的命令/数据选择端口rs一样,对于fsmc驱动tft :rs = 0时,表示读写寄存器;rs = 1表示读写数据ram。
4、gpio端口配置
由于是使用fsmc来驱动tft的,所以除了背光用的pd13和复位用的pc1要设置为通用推挽输出之外,其他引脚都必须设置为复用推挽输出。然而,很奇怪的是。当我配置好pd13时,我发现程序下载进去后是一片漆黑的,后来再三检查是背光的pd13的问题。必须把pd13置高才可以亮,否则默认低电平,就是一片黑了。
5、 具体程序
/*******************************************************************************
* function name : lcd_configuration
* description : configures lcd control lines
* input : none
* output : none
* return : none
* attention : none
*******************************************************************************/
static void lcd_configuration(void)
{
gpio_inittypedef gpio_initstructure;
/* enable gpiod and gpioe clocks */
rcc_apb2periphclockcmd( rcc_apb2periph_gpiod | rcc_apb2periph_gpioe, enable);
/* pe.00(d0), pe.01(d1), pe.02(d2), pe.03(d3), pe.04(d4), pe.05(d5), pe.06(d6), pe.07(d7), pe.08(d8)
pe.09(d9), pe.10(d10), pe.11(d11), pe.12(d12), pe.13(d13), pe.14(d14), pe.15(d15) */
gpio_initstructure.gpio_pin = gpio_pin_all;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;
gpio_init(gpioe, &gpio_initstructure);
/* pd.13(rs), pd.14(wr), pd.15(rd) */
gpio_initstructure.gpio_pin = gpio_pin_13|gpio_pin_14|gpio_pin_15;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;
gpio_init(gpiod, &gpio_initstructure);
/* pd.12(cs)*/
gpio_initstructure.gpio_pin = gpio_pin_12;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;
gpio_init(gpiod, &gpio_initstructure);
}
/*******************************************************************************
* function name : lcd_writereg
* description : lcd控制器寄存器地址
* input : - index: 寄存器地址
* output : none
* return : none
* attention : none
*******************************************************************************/
__inline void lcd_writeindex(uint16_t index)
{
clr_rs;
set_nrd;
gpioe->odr = index; /* gpio_write(gpioe,index); */
clr_nwr;
set_nwr;
}
/*******************************************************************************
* function name : lcd_writereg
* description : lcd寄存器数据
* input : - index: 寄存器数据
* output : none
* return : none
* attention : none
*******************************************************************************/
__inline void lcd_writedata(uint16_t data)
{
set_rs;
gpioe->odr = data; /* gpio_write(gpioe,data); */
clr_nwr;
set_nwr;
}
/*******************************************************************************
* function name : lcd_readdata
* description : 读取控制器数据
* input : none
* output : none
* return : 返回读取到的数据
* attention : none
*******************************************************************************/
__inline uint16_t lcd_readdata(void)
{
uint16_t value;
set_rs;
set_nwr;
clr_nrd;
gpioe->crh = 0x44444444;
gpioe->crl = 0x44444444;
value = gpioe->idr;
value = gpioe->idr;
gpioe->crh = 0x33333333;
gpioe->crl = 0x33333333;
set_nrd;
return value;
}
__inline void lcd_writereg(uint16_t lcd_reg,uint16_t lcd_regvalue)
{
/* write 16-bit index, then write reg */
clr_cs;
lcd_writeindex(lcd_reg);
/* write 16-bit reg */
lcd_writedata(lcd_regvalue);
set_cs;
}
__inline uint16_t lcd_readreg(uint16_t lcd_reg)
{
uint16_t lcd_ram;
/* write 16-bit index (then read reg) */
clr_cs;
lcd_writeindex(lcd_reg);
/* read 16-bit reg */
lcd_ram = lcd_readdata();
set_cs;
return lcd_ram;
}
static void lcd_setcursor( uint16_t xpos, uint16_t ypos )
{
#if ( disp_orientation == 90 ) || ( disp_orientation == 270 )
uint16_t temp = xpos;
xpos = ypos;
ypos = ( max_x - 1 ) - temp;
#elif ( disp_orientation == 0 ) || ( disp_orientation == 180 )
#endif
lcd_writereg(0x004e, xpos );
lcd_writereg(0x004f, ypos );
}
static void delay_ms(uint16_t ms)
{
uint16_t i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 1141; j++ );
}
}
void lcd_initializtion(void)
{
lcd_configuration();
// devicecode = lcd_readreg(0x0000);
/* 读取屏id */
lcd_writereg(0x0000,0x0001); delay_ms(50); /* 打开晶振 ,内部晶振500k*/
lcd_writereg(0x0003,0xa8a4); delay_ms(50);
lcd_writereg(0x000c,0x0000); delay_ms(50);
lcd_writereg(0x000d,0x080c); delay_ms(50);
lcd_writereg(0x000e,0x2b00); delay_ms(50);
lcd_writereg(0x001e,0x00b0); delay_ms(50);
lcd_writereg(0x0001,0x2b3f); delay_ms(50); /* 驱动输出控制320*240 0x2b3f */
lcd_writereg(0x0002,0x0600); delay_ms(50);
lcd_writereg(0x0010,0x0000); delay_ms(50);
lcd_writereg(0x0011,0x6070); delay_ms(50); /* 定义数据格式 16位色 横屏 0x6070 */
lcd_writereg(0x0005,0x0000); delay_ms(50);
lcd_writereg(0x0006,0x0000); delay_ms(50);
lcd_writereg(0x0016,0xef1c); delay_ms(50);
lcd_writereg(0x0017,0x0003); delay_ms(50);
lcd_writereg(0x0007,0x0133); delay_ms(50);
lcd_writereg(0x000b,0x0000); delay_ms(50);
lcd_writereg(0x000f,0x0000); delay_ms(50); /* 扫描开始地址 */
lcd_writereg(0x0041,0x0000); delay_ms(50);
lcd_writereg(0x0042,0x0000); delay_ms(50);
lcd_writereg(0x0048,0x0000); delay_ms(50);
lcd_writereg(0x0049,0x013f); delay_ms(50);
lcd_writereg(0x004a,0x0000); delay_ms(50);
lcd_writereg(0x004b,0x0000); delay_ms(50);
lcd_writereg(0x0044,0xef00); delay_ms(50);
lcd_writereg(0x0045,0x0000); delay_ms(50);
lcd_writereg(0x0046,0x013f); delay_ms(50);
lcd_writereg(0x0030,0x0707); delay_ms(50);
lcd_writereg(0x0031,0x0204); delay_ms(50);
lcd_writereg(0x0032,0x0204); delay_ms(50);
lcd_writereg(0x0033,0x0502); delay_ms(50);
lcd_writereg(0x0034,0x0507); delay_ms(50);
lcd_writereg(0x0035,0x0204); delay_ms(50);
lcd_writereg(0x0036,0x0204); delay_ms(50);
lcd_writereg(0x0037,0x0502); delay_ms(50);
lcd_writereg(0x003a,0x0302); delay_ms(50);
lcd_writereg(0x003b,0x0302); delay_ms(50);
lcd_writereg(0x0023,0x0000); delay_ms(50);
lcd_writereg(0x0024,0x0000); delay_ms(50);
lcd_writereg(0x0025,0x8000); delay_ms(50);
lcd_writereg(0x004f,0); /* 行首址0 */
lcd_writereg(0x004e,0); //列首址0
}else if(devicecode==0x4531){
lcd_writereg(0x00,0x0001);
lcd_delay(50);
lcd_writereg(0x10,0x1628);
lcd_writereg(0x12,0x000e);//0x0006
lcd_writereg(0x13,0x0a39);
lcd_delay(10);
lcd_writereg(0x11,0x0040);
lcd_writereg(0x15,0x0050);
lcd_delay(40);
lcd_writereg(0x12,0x001e);//16
lcd_delay(40);
lcd_writereg(0x10,0x1620);
lcd_writereg(0x13,0x2a39);
lcd_delay(10);
lcd_writereg(0x01,0x0100);
lcd_writereg(0x02,0x0300);
lcd_writereg(0x03,0x1030);//改变方向的
lcd_writereg(0x08,0x0202);
lcd_writereg(0x0a,0x0008);
lcd_writereg(0x30,0x0000);
lcd_writereg(0x31,0x0402);
lcd_writereg(0x32,0x0106);
lcd_writereg(0x33,0x0503);
lcd_writereg(0x34,0x0104);
lcd_writereg(0x35,0x0301);
lcd_writereg(0x36,0x0707);
lcd_writereg(0x37,0x0305);
lcd_writereg(0x38,0x0208);
lcd_writereg(0x39,0x0f0b);
lcd_writereg(0x41,0x0002);
lcd_writereg(0x60,0x2700);
lcd_writereg(0x61,0x0001);
lcd_writereg(0x90,0x0210);
lcd_writereg(0x92,0x010a);
lcd_writereg(0x93,0x0004);
lcd_writereg(0xa0,0x0100);
lcd_writereg(0x07,0x0001);
lcd_writereg(0x07,0x0021);
lcd_writereg(0x07,0x0023);
lcd_writereg(0x07,0x0033);
lcd_writereg(0x07,0x0133);
lcd_writereg(0xa0,0x0000);
}
lcd_delay(5000);
set_led;//点亮背光
lcd_clear(white);
}
//清屏函数
//color:要清屏的填充色
void lcd_clear(u16 color)
{
u32 index=0;
lcd_setcursor(0x00,0x0000);//设置光标位置
lcd_writeram_prepare(); //开始写入gram
for(index=0;index《76800;index++)
{
lcd_wr_data(color); //向每个gram写入数据
}
}
//在指定区域内填充指定颜色
//区域大小:
// (xend-xsta)*(yend-ysta)
void lcd_fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color)
{
#if use_horizontal //横屏
u16 colortemp=point_color;
u16 ytemp=ysta;
point_color=color;
for(;xsta《=xend;xsta++)
{
for(;ysta《=yend;ysta++)lcd_drawpoint(xsta,ysta);
ysta=ytemp;
}
point_color=colortemp;
#else //竖屏
u32 n;
//设置窗口
lcd_writereg(r80, xsta); //水平方向gram起始地址
lcd_writereg(r81, xend); //水平方向gram结束地址
lcd_writereg(r82, ysta); //垂直方向gram起始地址
lcd_writereg(r83, yend); //垂直方向gram结束地址
lcd_setcursor(xsta,ysta);//设置光标位置
lcd_writeram_prepare(); //开始写入gram
n=(u32)(yend-ysta+1)*(xend-xsta+1);
while(n--){lcd_wr_data(color);}//显示所填充的颜色。
//恢复设置
lcd_writereg(r80, 0x0000); //水平方向gram起始地址
lcd_writereg(r81, (lcd_width-1)); //水平方向gram结束地址
lcd_writereg(r82, 0x0000); //垂直方向gram起始地址
lcd_writereg(r83, (lcd_height-1)); //垂直方向gram结束地址
#endif
}
//画线
//x1,y1:起点坐标
//x2,y2:终点坐标
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++ )//画线输出
{
lcd_drawpoint(urow,ucol);//根据坐标画点
xerr+=delta_x ; //x坐标增量
yerr+=delta_y ; //y坐标增量
if(xerr》distance)
{
xerr-=distance;
urow+=incx;
}
if(yerr》distance)
{
yerr-=distance;
ucol+=incy;
}
}
}
//画矩形
void lcd_drawrectangle(u8 x1, u16 y1, u8 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);
}
//在指定位置画一个指定大小的圆
//(x,y):中心点
//r :半径
void draw_circle(u8 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r《《1); //判断下个点位置的标志
while(a《=b)
{
lcd_drawpoint(x0-b,y0-a); //3
lcd_drawpoint(x0+b,y0-a); //0
lcd_drawpoint(x0-a,y0+b); //1
lcd_drawpoint(x0-b,y0-a); //7
lcd_drawpoint(x0-a,y0-b); //2
lcd_drawpoint(x0+b,y0+a); //4
lcd_drawpoint(x0+a,y0-b); //5
lcd_drawpoint(x0+a,y0+b); //6
lcd_drawpoint(x0-b,y0+a);
a++;
//使用bresenham算法画圆
if(di《0){
di +=4*a+6;
}else{
di+=10+4*(a-b);
b--;
}
lcd_drawpoint(x0+a,y0+b);
}
}
//在指定位置显示一个字符
//x:0~234
//y:0~308
//num:要显示的字符:“ ”---》“~”
//size:字体大小 12/16
//mode:叠加方式(1)还是非叠加方式(0)
void lcd_showchar(u8 x,u16 y,u8 num,u8 size,u8 mode)
{
#if use_horizontal
#define max_char_posx 312
#define max_char_posy 232
u8 temp;
u8 pos,t;
u16 x0=x;
u16 colortemp=point_color;
if(x》max_char_posx||y》max_char_posy)return;
//设置窗口
num=num-‘ ’;//得到偏移后的值
if(!mode) //非叠加方式
{
for(pos=0;pos《size;pos++)
{
if(size==12)
temp=asc2_1206[num][pos];//调用1206字体
else
temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t《size/2;t++)
{
if(temp&0x01)
point_color=colortemp;
else
point_color=back_color;
lcd_drawpoint(x,y);
temp》》=1;
x++;
}
x=x0;
y++;
}
}else{ //叠加方式
for(pos=0;pos《size;pos++)
{
if(size==12)
temp=asc2_1206[num][pos];//调用1206字体
else
temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t《size/2;t++)
{
if(temp&0x01)lcd_drawpoint(x+t,y+pos);//画一个点
temp》》=1;
}
}
}
point_color=colortemp;
#else
#define max_char_posx 232
#define max_char_posy 304
u8 temp;
u8 pos,t;
if(x》max_char_posx||y》max_char_posy)return;
//设置窗口
lcd_writereg(r80,x); //水平方向gram起始地址
lcd_writereg(r81,x+(size/2-1));//水平方向gram结束地址
lcd_writereg(r82,y); //垂直方向gram起始地址
lcd_writereg(r83,y+size-1); //垂直方向gram结束地址
lcd_setcursor(x,y); //设置光标位置
lcd_writeram_prepare(); //开始写入gram
num=num-‘ ’;//得到偏移后的值
if(!mode) //非叠加方式
{
for(pos=0;pos《size;pos++)
{
if(size==12)
temp=asc2_1206[num][pos];//调用1206字体
else
temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t《size/2;t++)
{
if(temp&0x01){
lcd_wr_data(point_color);
}else{
lcd_wr_data(back_color);
}
temp》》=1;
}
}
}else{ //叠加方式
for(pos=0;pos《size;pos++)
{
if(size==12)
temp=asc2_1206[num][pos]; //调用1206字体
else
temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t《size/2;t++)
{
if(temp&0x01)
lcd_drawpoint(x+t,y+pos);//画一个点
temp》》=1;
}
}
}
//恢复窗体大小
lcd_writereg(r80, 0x0000); //水平方向gram起始地址
lcd_writereg(r81, (lcd_width-1)); //水平方向gram结束地址
lcd_writereg(r82, 0x0000); //垂直方向gram起始地址
lcd_writereg(r83, (lcd_height-1)); //垂直方向gram结束地址
#endif
}
//m^n函数
u32 mypow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//显示数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
void lcd_shownum(u8 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t《len;t++)
{
temp=(num/mypow(10,len-t-1))%10;
if(enshow==0&&t《(len-1))
{
if(temp==0)
{
lcd_showchar(x+(size/2)*t,y,‘ ’,size,0);
continue;
}else{
enshow=1;
}
}
lcd_showchar(x+(size/2)*t,y,temp+‘0’,size,0);
}
}
//显示字符串
//x,y:起点坐标
//*p:字符串起始地址
//用16字体
void lcd_showstring(u8 x,u16 y,const u8 *p)
{
while(*p!=‘\0’) //字符串到达结束
{
if(x》max_char_posx){x=0;y+=16;} //换行
if(y》max_char_posy){y=x=0;lcd_clear(white);} //超出屏幕显示范围
lcd_showchar(x,y,*p,16,0);
x+=8;
p++;
}
}
lcd/ili93xx.h (相关i/o操作在此文件中以宏定义的方式实现)
[cpp] view plain copy#include “stm32f10x.h”
//tftlcd部分外要调用的函数
extern u16 point_color;//默认红色
extern u16 back_color; //背景颜色。默认为白色
//定义lcd的尺寸
#define lcd_width 240
#define lcd_height 320
//9320/9325 lcd寄存器
#define r0 0x00
#define r1 0x01
#define r2 0x02
#define r3 0x03
#define r4 0x04
#define r5 0x05
#define r6 0x06
#define r7 0x07
#define r8 0x08
#define r9 0x09
#define r10 0x0a
#define r12 0x0c
#define r13 0x0d
#define r14 0x0e
#define r15 0x0f
#define r16 0x10
#define r17 0x11
#define r18 0x12
#define r19 0x13
#define r20 0x14
#define r21 0x15
#define r22 0x16
#define r23 0x17
#define r24 0x18
#define r25 0x19
#define r26 0x1a
#define r27 0x1b
#define r28 0x1c
#define r29 0x1d
#define r30 0x1e
#define r31 0x1f
#define r32 0x20
#define r33 0x21
#define r34 0x22
#define r36 0x24
#define r37 0x25
#define r40 0x28
#define r41 0x29
#define r43 0x2b
#define r45 0x2d
#define r48 0x30
#define r49 0x31
#define r50 0x32
#define r51 0x33
#define r52 0x34
#define r53 0x35
#define r54 0x36
#define r55 0x37
#define r56 0x38
#define r57 0x39
#define r59 0x3b
#define r60 0x3c
#define r61 0x3d
#define r62 0x3e
#define r63 0x3f
#define r64 0x40
#define r65 0x41
#define r66 0x42
#define r67 0x43
#define r68 0x44
#define r69 0x45
#define r70 0x46
#define r71 0x47
#define r72 0x48
#define r73 0x49
#define r74 0x4a
#define r75 0x4b
#define r76 0x4c
#define r77 0x4d
#define r78 0x4e
#define r79 0x4f
#define r80 0x50
#define r81 0x51
#define r82 0x52
#define r83 0x53
#define r96 0x60
#define r97 0x61
#define r106 0x6a
#define r118 0x76
#define r128 0x80
#define r129 0x81
#define r130 0x82
#define r131 0x83
#define r132 0x84
#define r133 0x85
#define r134 0x86
#define r135 0x87
#define r136 0x88
#define r137 0x89
#define r139 0x8b
#define r140 0x8c
#define r141 0x8d
#define r143 0x8f
#define r144 0x90
#define r145 0x91
#define r146 0x92
#define r147 0x93
#define r148 0x94
#define r149 0x95
#define r150 0x96
#define r151 0x97
#define r152 0x98
#define r153 0x99
#define r154 0x9a
#define r157 0x9d
#define r192 0xc0
#define r193 0xc1
#define r229 0xe5
/*硬件相关的宏定义*/
#define lcd_fast_io 1 //定义是否使用快速io 建议使用快速io,效率更高
//-----------------lcd端口定义----------------
/********************************************************************************/
#define lcd_gpio_led_port gpioc
#define lcd_gpio_led_pin gpio_pin_10
#define lcd_gpio_cs_port gpioc
#define lcd_gpio_cs_pin gpio_pin_9
#define lcd_gpio_rs_port gpioc
#define lcd_gpio_rs_pin gpio_pin_8
#define lcd_gpio_wr_port gpioc
#define lcd_gpio_wr_pin gpio_pin_7
#define lcd_gpio_rd_port gpioc
#define lcd_gpio_rd_pin gpio_pin_6
//16位数据所在端口,pb0~15作为数据线
#define lcd_gpio_data_port gpiob
#define lcd_gpio_data_pin gpio_pin_all
#if lcd_fast_io == 1 //快速io
#define set_cs gpioc-》bsrr=1《《9 //片选端口 pc9
#define set_rs gpioc-》bsrr=1《《8 //数据/命令 pc8
#define set_wr gpioc-》bsrr=1《《7 //写数据 pc7
#define set_rd gpioc-》bsrr=1《《6 //读数据 pc6
#define clr_cs gpioc-》brr=1《《9 //片选端口 pc9
#define clr_rs gpioc-》brr=1《《8 //数据/命令 pc8
#define clr_wr gpioc-》brr=1《《7 //写数据 pc7
#define clr_rd gpioc-》brr=1《《6 //读数据 pc6
#else
#define set_cs {gpio_setbits(lcd_gpio_cs_port,lcd_gpio_cs_pin);}
#define clr_cs {gpio_resetbits(lcd_gpio_cs_port,lcd_gpio_cs_pin);}
#define set_rs {gpio_setbits(lcd_gpio_rs_port,lcd_gpio_rs_pin);}
#define clr_rs {gpio_resetbits(lcd_gpio_rs_port,lcd_gpio_rs_pin);}
#define set_wr {gpio_setbits(lcd_gpio_wr_port,lcd_gpio_wr_pin);}
#define clr_wr {gpio_resetbits(lcd_gpio_wr_port,lcd_gpio_wr_pin);}
#define set_rd {gpio_setbits(lcd_gpio_rd_port,lcd_gpio_rd_pin);}
#define clr_rd {gpio_resetbits(lcd_gpio_rd_port,lcd_gpio_rd_pin);}
#endif
#define set_led {gpio_setbits(lcd_gpio_led_port,lcd_gpio_led_pin);}
#define clr_led {gpio_resetbits(lcd_gpio_led_port,lcd_gpio_led_pin);}
#define write_data(datavalue) {gpio_write(lcd_gpio_data_port,datavalue);}
//直接操作寄存器读取,使用库函数读取i/o有问题,原因不详
#define read_data() (lcd_gpio_data_port -》idr) //必须使用宏定义,写成函数会有问题
//#define read_data() (gpio_readinputdata(lcd_gpio_data_port)) //这句有问题
//写8位数据函数
//用宏定义,提高速度。
#define lcd_wr_data(data){\
set_rs;\
clr_cs;\
write_data(data);\
clr_wr;\
set_wr;\
set_cs;\
}
/********************************************************************************/
//画笔颜色
#define white 0xffff
#define black 0x0000
#define blue 0x001f
#define bred 0xf81f
#define gred 0xffe0
#define gblue 0x07ff
#define red 0xf800
#define magenta 0xf81f
#define green 0x07e0
#define cyan 0x7fff
#define yellow 0xffe0
#define brown 0xbc40 //棕色
#define brred 0xfc07 //棕红色
#define gray 0x8430 //灰色
//gui颜色
#define darkblue 0x01cf //深蓝色
#define lightblue 0x7d7c //浅蓝色
#define grayblue 0x5458 //灰蓝色
//以上三色为panel的颜色
#define lightgreen 0x841f //浅绿色
//#define lightgray 0xef5b //浅灰色(pannel)
#define lgray 0xc618 //浅灰色(pannel),窗体背景色
#define lgrayblue 0xa651 //浅灰蓝色(中间层颜色)
#define lbblue 0x2b12 //浅棕蓝色(选择条目的反色)
void lcd_delay(u32 ncount);
void lcd_config(void);
void lcd_displayon(void);
void lcd_displayoff(void);
void lcd_clear(u16 color);
void lcd_setcursor(u8 xpos, u16 ypos);
void lcd_drawpoint(u16 x,u16 y);//画点
u16 lcd_readpoint(u16 x,u16 y); //读点
void draw_circle(u8 x0,u16 y0,u8 r);
void lcd_drawline(u16 x1, u16 y1, u16 x2, u16 y2);
void lcd_drawrectangle(u8 x1, u16 y1, u8 x2, u16 y2);
void lcd_fill(u8 xsta,u16 ysta,u8 xend,u16 yend,u16 color);
void lcd_showchar(u8 x,u16 y,u8 num,u8 size,u8 mode);//显示一个字符
void lcd_shownum(u8 x,u16 y,u32 num,u8 len,u8 size); //显示一个数字
void lcd_showstring(u8 x,u16 y,const u8 *p); //显示一个字符串,16字体
void lcd_writereg(u8 lcd_reg, u16 lcd_regvalue);
u16 lcd_readreg(u8 lcd_reg);
void lcd_writeram_prepare(void);
void lcd_writeram(u16 rgb_code);
u16 lcd_readram(void);
font.h (字库文件)
[cpp] view plain copy
//常用ascii表
//偏移量32
//ascii字符集
//偏移量32
//大小:12*6
const unsigned char asc2_1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“ ”,0*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x00,0x00},/*“!”,1*/
{0x00,0x14,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“”“,2*/
{0x00,0x00,0x14,0x14,0x3f,0x14,0x0a,0x3f,0x0a,0x0a,0x00,0x00},/*”#“,3*/
{0x00,0x04,0x1e,0x15,0x05,0x06,0x0c,0x14,0x15,0x0f,0x04,0x00},/*”$“,4*/
{0x00,0x00,0x12,0x15,0x0d,0x0a,0x14,0x2c,0x2a,0x12,0x00,0x00},/*”%“,5*/
{0x00,0x00,0x04,0x0a,0x0a,0x1e,0x15,0x15,0x09,0x36,0x00,0x00},/*”&“,6*/
{0x00,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*”‘“,7*/
{0x00,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x00},/*”(“,8*/
{0x00,0x02,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x00},/*”)“,9*/
{0x00,0x00,0x00,0x04,0x15,0x0e,0x0e,0x15,0x04,0x00,0x00,0x00},/*”*“,10*/
{0x00,0x00,0x04,0x04,0x04,0x1f,0x04,0x04,0x04,0x00,0x00,0x00},/*”+“,11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01},/*”,“,12*/
{0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00},/*”-“,13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*”。“,14*/
{0x00,0x10,0x08,0x08,0x08,0x04,0x04,0x02,0x02,0x02,0x01,0x00},/*”/“,15*/
{0x00,0x00,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x00,0x00},/*”0“,16*/
{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0e,0x00,0x00},/*”1“,17*/
{0x00,0x00,0x0e,0x11,0x11,0x08,0x04,0x02,0x01,0x1f,0x00,0x00},/*”2“,18*/
{0x00,0x00,0x0e,0x11,0x10,0x0c,0x10,0x10,0x11,0x0e,0x00,0x00},/*”3“,19*/
{0x00,0x00,0x08,0x0c,0x0a,0x0a,0x09,0x1e,0x08,0x18,0x00,0x00},/*”4“,20*/
{0x00,0x00,0x1f,0x01,0x01,0x0f,0x10,0x10,0x11,0x0e,0x00,0x00},/*”5“,21*/
{0x00,0x00,0x0e,0x09,0x01,0x0f,0x11,0x11,0x11,0x0e,0x00,0x00},/*”6“,22*/
{0x00,0x00,0x1f,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x00,0x00},/*”7“,23*/
{0x00,0x00,0x0e,0x11,0x11,0x0e,0x11,0x11,0x11,0x0e,0x00,0x00},/*”8“,24*/
{0x00,0x00,0x0e,0x11,0x11,0x11,0x1e,0x10,0x12,0x0e,0x00,0x00},/*”9“,25*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*”:“,26*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*”;“,27*/
{0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00},/*”《“,28*/
{0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x1f,0x00,0x00,0x00,0x00},/*”=“,29*/
{0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*”》“,30*/
{0x00,0x00,0x0e,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*”?“,31*/
{0x00,0x00,0x0e,0x11,0x19,0x15,0x15,0x1d,0x01,0x1e,0x00,0x00},/*”@“,32*/
{0x00,0x00,0x04,0x04,0x0c,0x0a,0x0a,0x1e,0x12,0x33,0x00,0x00},/*”a“,33*/
{0x00,0x00,0x0f,0x12,0x12,0x0e,0x12,0x12,0x12,0x0f,0x00,0x00},/*”b“,34*/
{0x00,0x00,0x1e,0x11,0x01,0x01,0x01,0x01,0x11,0x0e,0x00,0x00},/*”c“,35*/
{0x00,0x00,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x00,0x00},/*”d“,36*/
{0x00,0x00,0x1f,0x12,0x0a,0x0e,0x0a,0x02,0x12,0x1f,0x00,0x00},/*”e“,37*/
{0x00,0x00,0x1f,0x12,0x0a,0x0e,0x0a,0x02,0x02,0x07,0x00,0x00},/*”f“,38*/
{0x00,0x00,0x1c,0x12,0x01,0x01,0x39,0x11,0x12,0x0c,0x00,0x00},/*”g“,39*/
{0x00,0x00,0x33,0x12,0x12,0x1e,0x12,0x12,0x12,0x33,0x00,0x00},/*”h“,40*/
{0x00,0x00,0x1f,0x04,0x04,0x04,0x04,0x04,0x04,0x1f,0x00,0x00},/*”i“,41*/
{0x00,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x00},/*”j“,42*/
{0x00,0x00,0x37,0x12,0x0a,0x06,0x0a,0x0a,0x12,0x37,0x00,0x00},/*”k“,43*/
{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3f,0x00,0x00},/*”l“,44*/
{0x00,0x00,0x1b,0x1b,0x1b,0x1b,0x15,0x15,0x15,0x15,0x00,0x00},/*”m“,45*/
{0x00,0x00,0x3b,0x12,0x16,0x16,0x1a,0x1a,0x12,0x17,0x00,0x00},/*”n“,46*/
{0x00,0x00,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x00,0x00},/*”o“,47*/
{0x00,0x00,0x0f,0x12,0x12,0x0e,0x02,0x02,0x02,0x07,0x00,0x00},/*”p“,48*/
{0x00,0x00,0x0e,0x11,0x11,0x11,0x11,0x17,0x19,0x0e,0x18,0x00},/*”q“,49*/
{0x00,0x00,0x0f,0x12,0x12,0x0e,0x0a,0x12,0x12,0x37,0x00,0x00},/*”r“,50*/
{0x00,0x00,0x1e,0x11,0x01,0x06,0x08,0x10,0x11,0x0f,0x00,0x00},/*”s“,51*/
{0x00,0x00,0x1f,0x15,0x04,0x04,0x04,0x04,0x04,0x0e,0x00,0x00},/*”t“,52*/
{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x00,0x00},/*”u“,53*/
{0x00,0x00,0x33,0x12,0x12,0x0a,0x0a,0x0c,0x04,0x04,0x00,0x00},/*”v“,54*/
{0x00,0x00,0x15,0x15,0x15,0x0e,0x0a,0x0a,0x0a,0x0a,0x00,0x00},/*”w“,55*/
{0x00,0x00,0x1b,0x0a,0x0a,0x04,0x04,0x0a,0x0a,0x1b,0x00,0x00},/*”x“,56*/
{0x00,0x00,0x1b,0x0a,0x0a,0x04,0x04,0x04,0x04,0x0e,0x00,0x00},/*”y“,57*/
{0x00,0x00,0x1f,0x09,0x08,0x04,0x04,0x02,0x12,0x1f,0x00,0x00},/*”z“,58*/
{0x00,0x1c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1c,0x00},/*”[“,59*/
{0x00,0x02,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x00,0x00},/*”\“,60*/
{0x00,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x00},/*”]“,61*/
{0x00,0x04,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*”^“,62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f},/*”_“,63*/
{0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*”`“,64*/
{0x00,0x00,0x00,0x00,0x00,0x0c,0x12,0x1c,0x12,0x3c,0x00,0x00},/*”a“,65*/
{0x00,0x00,0x03,0x02,0x02,0x0e,0x12,0x12,0x12,0x0e,0x00,0x00},/*”b“,66*/
{0x00,0x00,0x00,0x00,0x00,0x1c,0x12,0x02,0x02,0x1c,0x00,0x00},/*”c“,67*/
{0x00,0x00,0x18,0x10,0x10,0x1c,0x12,0x12,0x12,0x3c,0x00,0x00},/*”d“,68*/
{0x00,0x00,0x00,0x00,0x00,0x0c,0x12,0x1e,0x02,0x1c,0x00,0x00},/*”e“,69*/
{0x00,0x00,0x38,0x04,0x04,0x1e,0x04,0x04,0x04,0x1e,0x00,0x00},/*”f“,70*/
{0x00,0x00,0x00,0x00,0x00,0x3c,0x12,0x0c,0x02,0x1e,0x22,0x1c},/*”g“,71*/
{0x00,0x00,0x03,0x02,0x02,0x0e,0x12,0x12,0x12,0x37,0x00,0x00},/*”h“,72*/
{0x00,0x00,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0e,0x00,0x00},/*”i“,73*/
{0x00,0x00,0x08,0x00,0x00,0x0c,0x08,0x08,0x08,0x08,0x08,0x07},/*”j“,74*/
{0x00,0x00,0x03,0x02,0x02,0x3a,0x0a,0x0e,0x12,0x37,0x00,0x00},/*”k“,75*/
{0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x1f,0x00,0x00},/*”l“,76*/
{0x00,0x00,0x00,0x00,0x00,0x0f,0x15,0x15,0x15,0x15,0x00,0x00},/*”m“,77*/
{0x00,0x00,0x00,0x00,0x00,0x0f,0x12,0x12,0x12,0x37,0x00,0x00},/*”n“,78*/
{0x00,0x00,0x00,0x00,0x00,0x0c,0x12,0x12,0x12,0x0c,0x00,0x00},/*”o“,79*/
{0x00,0x00,0x00,0x00,0x00,0x0f,0x12,0x12,0x12,0x0e,0x02,0x07},/*”p“,80*/
{0x00,0x00,0x00,0x00,0x00,0x1c,0x12,0x12,0x12,0x1c,0x10,0x38},/*”q“,81*/
{0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x02,0x02,0x07,0x00,0x00},/*”r“,82*/
{0x00,0x00,0x00,0x00,0x00,0x1e,0x02,0x0c,0x10,0x1e,0x00,0x00},/*”s“,83*/
{0x00,0x00,0x00,0x04,0x04,0x0e,0x04,0x04,0x04,0x18,0x00,0x00},/*”t“,84*/
{0x00,0x00,0x00,0x00,0x00,0x1b,0x12,0x12,0x12,0x3c,0x00,0x00},/*”u“,85*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0a,0x0c,0x04,0x00,0x00},/*”v“,86*/
{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0e,0x0a,0x0a,0x00,0x00},/*”w“,87*/
{0x00,0x00,0x00,0x00,0x00,0x1b,0x0a,0x04,0x0a,0x1b,0x00,0x00},/*”x“,88*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0a,0x0c,0x04,0x04,0x03},/*”y“,89*/
{0x00,0x00,0x00,0x00,0x00,0x1e,0x08,0x04,0x04,0x1e,0x00,0x00},/*”z“,90*/
{0x00,0x18,0x08,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x18,0x00},/*”{“,91*/
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*”|“,92*/
{0x00,0x06,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*”}“,93*/
{0x02,0x25,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} /*”~“,94*/
};
const unsigned char asc2_1608[95][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*” “,0*/
{0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00},/*”!“,1*/
{0x00,0x48,0x6c,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*”“”,2*/
{0x00,0x00,0x00,0x24,0x24,0x24,0x7f,0x12,0x12,0x12,0x7f,0x12,0x12,0x12,0x00,0x00},/*“#”,3*/
{0x00,0x00,0x08,0x1c,0x2a,0x2a,0x0a,0x0c,0x18,0x28,0x28,0x2a,0x2a,0x1c,0x08,0x08},/*“$”,4*/
{0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2a,0x58,0x54,0x54,0x54,0x22,0x00,0x00},/*“%”,5*/
{0x00,0x00,0x00,0x0c,0x12,0x12,0x12,0x0a,0x76,0x25,0x29,0x11,0x91,0x6e,0x00,0x00},/*“&”,6*/
{0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“’”,7*/
{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*“(”,8*/
{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*“)”,9*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x6b,0x1c,0x1c,0x6b,0x08,0x08,0x00,0x00,0x00,0x00},/*“*”,10*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x08,0x00,0x00,0x00},/*“+”,11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03},/*“,”,12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“-”,13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00},/*“。”,14*/
{0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},/*“/”,15*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*“0”,16*/
{0x00,0x00,0x00,0x08,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00},/*“1”,17*/
{0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7e,0x00,0x00},/*“2”,18*/
{0x00,0x00,0x00,0x3c,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1c,0x00,0x00},/*“3”,19*/
{0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7e,0x20,0x20,0x78,0x00,0x00},/*“4”,20*/
{0x00,0x00,0x00,0x7e,0x02,0x02,0x02,0x1a,0x26,0x40,0x40,0x42,0x22,0x1c,0x00,0x00},/*“5”,21*/
{0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1a,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*“6”,22*/
{0x00,0x00,0x00,0x7e,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},/*“7”,23*/
{0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3c,0x00,0x00},/*“8”,24*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1c,0x00,0x00},/*“9”,25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*“:”,26*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04},/*“;”,27*/
{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*“《”,28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00},/*“=”,29*/
{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*“》”,30*/
{0x00,0x00,0x00,0x3c,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00},/*“?”,31*/
{0x00,0x00,0x00,0x1c,0x22,0x5a,0x55,0x55,0x55,0x55,0x2d,0x42,0x22,0x1c,0x00,0x00},/*“@”,32*/
{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3c,0x22,0x42,0x42,0xe7,0x00,0x00},/*“a”,33*/
{0x00,0x00,0x00,0x1f,0x22,0x22,0x22,0x1e,0x22,0x42,0x42,0x42,0x22,0x1f,0x00,0x00},/*“b”,34*/
{0x00,0x00,0x00,0x7c,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1c,0x00,0x00},/*“c”,35*/
{0x00,0x00,0x00,0x1f,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1f,0x00,0x00},/*“d”,36*/
{0x00,0x00,0x00,0x3f,0x42,0x12,0x12,0x1e,0x12,0x12,0x02,0x42,0x42,0x3f,0x00,0x00},/*“e”,37*/
{0x00,0x00,0x00,0x3f,0x42,0x12,0x12,0x1e,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00},/*“f”,38*/
{0x00,0x00,0x00,0x3c,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1c,0x00,0x00},/*“g”,39*/
{0x00,0x00,0x00,0xe7,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0xe7,0x00,0x00},/*“h”,40*/
{0x00,0x00,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00},/*“i”,41*/
{0x00,0x00,0x00,0x7c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0f},/*“j”,42*/
{0x00,0x00,0x00,0x77,0x22,0x12,0x0a,0x0e,0x0a,0x12,0x12,0x22,0x22,0x77,0x00,0x00},/*“k”,43*/
{0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7f,0x00,0x00},/*“l”,44*/
{0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2a,0x2a,0x2a,0x2a,0x2a,0x6b,0x00,0x00},/*“m”,45*/
{0x00,0x00,0x00,0xe3,0x46,0x46,0x4a,0x4a,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00},/*“n”,46*/
{0x00,0x00,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00},/*“o”,47*/
{0x00,0x00,0x00,0x3f,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*“p”,48*/
{0x00,0x00,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x4d,0x53,0x32,0x1c,0x60,0x00},/*“q”,49*/
{0x00,0x00,0x00,0x3f,0x42,0x42,0x42,0x3e,0x12,0x12,0x22,0x22,0x42,0xc7,0x00,0x00},/*“r”,50*/
{0x00,0x00,0x00,0x7c,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3e,0x00,0x00},/*“s”,51*/
{0x00,0x00,0x00,0x7f,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00},/*“t”,52*/
{0x00,0x00,0x00,0xe7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00},/*“u”,53*/
{0x00,0x00,0x00,0xe7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00},/*“v”,54*/
{0x00,0x00,0x00,0x6b,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,0x00,0x00},/*“w”,55*/
{0x00,0x00,0x00,0xe7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xe7,0x00,0x00},/*“x”,56*/
{0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00},/*“y”,57*/
{0x00,0x00,0x00,0x7e,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3f,0x00,0x00},/*“z”,58*/
{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*“[”,59*/
{0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40},/*“\”,60*/
{0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00},/*“]”,61*/
{0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“^”,62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},/*“_”,63*/
{0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“`”,64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x78,0x44,0x42,0x42,0xfc,0x00,0x00},/*“a”,65*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1a,0x26,0x42,0x42,0x42,0x26,0x1a,0x00,0x00},/*“b”,66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*“c”,67*/
{0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xd8,0x00,0x00},/*“d”,68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x7e,0x02,0x02,0x42,0x3c,0x00,0x00},/*“e”,69*/
{0x00,0x00,0x00,0xf0,0x88,0x08,0x08,0x7e,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00},/*“f”,70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x1c,0x02,0x3c,0x42,0x42,0x3c},/*“g”,71*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3a,0x46,0x42,0x42,0x42,0x42,0xe7,0x00,0x00},/*“h”,72*/
{0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x0e,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00},/*“i”,73*/
{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1e},/*“j”,74*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0a,0x16,0x12,0x22,0x77,0x00,0x00},/*“k”,75*/
{0x00,0x00,0x00,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00},/*“l”,76*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x92,0x92,0x92,0x92,0x92,0xb7,0x00,0x00},/*“m”,77*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x46,0x42,0x42,0x42,0x42,0xe7,0x00,0x00},/*“n”,78*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00},/*“o”,79*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x26,0x42,0x42,0x42,0x22,0x1e,0x02,0x07},/*“p”,80*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xe0},/*“q”,81*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4c,0x04,0x04,0x04,0x04,0x1f,0x00,0x00},/*“r”,82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x42,0x02,0x3c,0x40,0x42,0x3e,0x00,0x00},/*“s”,83*/
{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00},/*“t”,84*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xdc,0x00,0x00},/*“u”,85*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00},/*“v”,86*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xeb,0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00},/*“w”,87*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6e,0x00,0x00},/*“x”,88*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07},/*“y”,89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x22,0x10,0x08,0x08,0x44,0x7e,0x00,0x00},/*“z”,90*/
{0x00,0xc0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xc0,0x00},/*“{”,91*/
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*“|”,92*/
{0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00},/*“}”,93*/
{0x0c,0x32,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*“~”,94*/
};
配置好相应的io为推挽输出,硬件初始化即可。不过这里需要注意的是,这里使用gpiob作为i80总线数据口,所以和jtag口冲突(详见:stm32 最小系统 中jtag说明)。所以在配置io时要将 jtag口的io复用关闭:
[cpp] view plain copy在gpio_configuration()配置中:
gpio_pinremapconfig(gpio_remap_swj_disable, enable);
// 改变指定管脚的映射 gpio_remap_swj_disable swj 完全禁用(jtag+sw-dp);必须加上这句,否则会导致串口无法使用 被折腾了很久 原因不详
gpio_pinremapconfig(gpio_remap_swj_jtagdisable , enable);
// 改变指定管脚的映射 gpio_remap_swj_jtagdisable ,jtag-dp 禁用 + sw-dp 使能
注意:不要忘记在rcc_configuration()中开启afio时钟,//afio时钟
rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable);
在main.c中直接调用相关函数:
[cpp] view plain copyint main(void)
{
//stm32 初始化
rcc_configuration();
nvic_configuration();
usart_configuration();
spi_configuration();
gpio_configuration();
lcd_init();
point_color = black; //设置字体颜色
lcd_showstring(30,50,“hello dog 。. ”);
printf(“\r\n test.。 \r\n”);
while(1);
}

超详细的无人机编程教学,练的是逻辑思维能力
Python简直就是万能的,你用Python都做过哪些事?
什么是集成运放的非线性区?集成运放工作在线性区和非线性区有什么区别?
热管原理进化之VC均热板的散热原理
电荷泵电路的工作原理及倍压器电路示例
浅谈STM32的FSMC的TFT笔记
多通道测温还需要搭电路?一个模块全搞定!
HDHG-FA互感器伏安变比极性综合测试仪配套工具软件使用说明
什么是ADC(模数转换器)?A/D转换器包括哪些内容?
两岸LED企业联手 璨圆引进三安1.2亿
揭秘国产智能手机品牌海外销售状况,小米在印度是三大巨头之一
浅析非对称双核MCU基础知识及核间通信
为数据安全而生,阿里云容灾备份方案场景实践解析
国星光电入选国务院国资委2022年度国有企业品牌建设典型案例
粘扣带疲劳强度试验机的原理、参数及特征
量子秒表或将可以把时间存储在量子存储器中
Intel全力打磨的独立显卡 将是迄今为止印度打造的最大硅片
东软医疗快速研发和推出了新冠肺炎智能辅助筛查系统——“火眼AI”
ADMTV340: Zero-IF Mobile TV T
安泰仪器租赁种类和优点