微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习笔记——TFT2.4彩屏显示字符和汉字

STM32学习笔记——TFT2.4彩屏显示字符和汉字

时间:11-28 来源:互联网 点击:

LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>

LCD_Write_COM(0x00,0x50);LCD_Write_DATA(x1>>8,x1);//开始X

LCD_Write_COM(0x00,0x52);LCD_Write_DATA(y1>>8,y1);//开始Y

LCD_Write_COM(0x00,0x51);LCD_Write_DATA(x2>>8,x2);//结束X

LCD_Write_COM(0x00,0x53);LCD_Write_DATA(y2>>8,y2);//结束Y

LCD_Write_COM(0x00,0x22);

}

voidChineseChar(uintx,uinty,intsize,uintFor_color,uintBk_color,charc)

{

inte=0,i,j;

inted;

uintncols;

uintnrows;

uintnbytes;

uchar*pFONT;//指向指定大小的汉字数据存储的数组的指针

uchar*pchar;//指向指定数组中指定要显示的汉字的数据的指针

uchar*FONTtable[]={(uchar*)hz16,(uchar*)hz24,(uchar*)hz32};//汉字的三种大小,16位,24位,32位

//其中hz16,hz24,hz32为三个数组,分别存储宋体12,宋体18和宋体24的汉字的数据

//每个数组中的数据可能包含相同大小字体的多个汉字

pFONT=(uchar*)FONTtable[size];//指向指定大小的汉字的数组

if(size==0)

{

ncols=16-1;

nrows=16-1;

nbytes=32;//每个字取模的字节数=(16*16)/8

}

else

if(size==1)

{

ncols=24-1;

nrows=24-1;

nbytes=72;//每个字取模的字节数=(24*24)/8

}

else

if(size==2)

{

ncols=32-1;

nrows=32-1;

nbytes=132;//每个字取模的字节数=(32*32)/8

}

pchar=pFONT+(nbytes*(c-1));//指定要显示指定数组中的第c个汉字

//每个数组中的数据可能包含相同大小字体的多个汉字

Address_set(x,y,x+nrows,y+ncols);//设置汉字显示的范围

for(i=0;i//每个汉字含有nbytes个字节,所以要循环nbytes次

{

ed=*pchar++;//ed取出指定要显示的字节的数据

if(size==0)//???

{

if(i%2==0)//???

e=8;

else

e=4;//???

}

else

e=8;

for(j=0;j{

if((ed>>j)&0x01)//判断是汉字还是背景,然后分别写入不同的颜色

{

LCD_Write_DATA(For_color>>8,For_color);//textcolor

}

else

{

LCD_Write_DATA(Bk_color>>8,Bk_color);//backcolor

}

}

}

}

voidLCD_ShowChar(uintx,uinty,uintFor_color,uintBk_color,charch)

{

uchartemp,Bytes;

ucharpos,t;

uintCHAR_W,CHAR_H;//一个字符的大小

//CHAR_W=8;//8*16

//CHAR_H=16;

CHAR_W=16;//16*24字符的大小为16*24

CHAR_H=24;

if(x>(LCD_SIZE_X-CHAR_W)||y>(LCD_SIZE_Y-CHAR_H))//如果指定的字符显示的位置超过了彩屏的分辨率,则返回

return;

Address_set(x,y,x+CHAR_W-1,y+CHAR_H-1);//设置字符显示的地址范围

ch=ch-32;//按照ASCII编码顺序得到相应字母的编码

Bytes=(CHAR_W*CHAR_H)/8;//每个字母取模字节数一个字节为8位,也即是8个像素点是一个字节

for(pos=0;pos//一个字节一个字节的写入,知道这个字符的全部字节数写完

{

//temp=Font8x16[ch][pos];//8*16的字体

temp=Font16x24[ch][pos];//字体的大小为16*24

for(t=0;t<8;t++)//一个字节为8位,所以要循环8次写入,一次只能写入一个像素点

{

//判断哪里是显示字符的地方,哪里是背景,然后分别写入不同的颜色就可以了

if(temp&0x80)//如果是显示字符的地方

LCD_Write_DATA(For_color>>8,For_color);//textcolor

else//否则就是背景的地方

LCD_Write_DATA(Bk_color>>8,Bk_color);//backcolor

temp<=1;//右移一位

}

}

}

voidLCD_ShowString(uintx,uinty,uintFor_color,uintBk_color,char*p)

{

while(*p!=)//判断是否到了字符串尾

{

LCD_ShowChar(x,y,For_color,Bk_color,*p);

//x+=8;//8是字体的宽度

x+=16;//16是字体的宽度

p++;//指针后移一位

}

}

主程序main.c

在主程序中完成对系统的初始化配置,利用彩屏的驱动程序完成相应的显示等功能,程序如下:

#include"stm32f10x_lib.h"

#include"LCD_driver.h"

#defineLCD_cs(x)x?GPIO_SetBits(GPIOB,LCD_CS):GPIO_ResetBits(GPIOB,LCD_CS)//自己定义的位函数对CS位的操作

//打开或关闭片选使能LCD_cs(0);//打开片选使能LCD_cs(1);//关闭片选使能

GPIO_InitTypeDefGPIO_InitStructure;//定义GPIO初始化的结构体变量

ErrorStatusHSEStartUpStatus;//定义错误状态变量,是枚举类型

voidRCC_Configuration(void);

voidNVIC_Configuration(void);

voidDelay(vu32nCount);

intmain(void)

{

#ifdefDEBUG

debug();

#endif

RCC_Configuration();//系统时钟配置函数

NVIC_Configuration();//NVIC配置函数

//启动GPIO模块时钟使能APB2

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

//把调试设置普通IO口禁止SWJ

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//所有GPIO为同一类型端口选中所有的IO口

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top