#else//条件编译-8位数据模式
voidLCD_Writ_Bus(charVH,charVL)//并行数据写入函数
{
//LCD_DataPortH=VH;//八位模式都用P0口送数据
//LCD_wr(0);
//LCD_wr(1);
//LCD_DataPortH=VL;//八位模式都用P0口送数据
//LCD_wr(0);
//LCD_wr(1);
}
#endif
//参数VH,VL分别为要写入命令的高8位和低8位
voidLCD_Write_COM(charVH,charVL)//发送命令
{
LCD_rs(0);
LCD_Writ_Bus(VH,VL);
}
//参数VH,VL分别为要写入数据的高8位和低8位
voidLCD_Write_DATA(charVH,charVL)//发送数据
{
LCD_rs(1);
LCD_Writ_Bus(VH,VL);
}
voidPant(charVH,charVL)//涂满全屏函数
{
inti,j;
LCD_cs(0);//打开片选使能
Address_set(0,0,239,319);//设置地址范围为全屏
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_Write_DATA(VH,VL);
}
}
LCD_cs(1);//关闭片选使能
}
voidAddress_set(unsignedintx1,unsignedinty1,unsignedintx2,unsignedinty2)//设置地址范围函数
{
LCD_Write_COM(0x00,0x20);LCD_Write_DATA(x1>>8,x1);//设置X坐标位置
LCD_Write_COM(0x00,0x21);LCD_Write_DATA(y1>>8,y1);//设置Y坐标位置
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);//关闭片选使能
评论