利用彩屏显示汉字、字符和字符串,需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。
彩屏的驱动程序如果写好的话,就可以一直使用了,精力主要集中在应用程序的编写就可以了,但是移植的话,要移植驱动程序。其实移植也只是改变那些很底层的靠近处理器的那部分代码。
代码如下,注释比较详细,看懂了基本就可以了。
驱动程序的头文件LCD_driver.h如下:
#defineucharunsignedchar
#defineuintunsignedint
#defineBus_16//16位数据模式,如果使用8位模式,请注释此语句,如果使用16位模式,请打开此句
#defineLCD_DataPortHP1//高8位数据口,8位模式下只使用高8位
#defineLCD_DataPortLP0//低8位数据口,8位模式下低8位可以不接线
#defineLCD_WRGPIO_Pin_2//WR引脚定义P2^5
#defineLCD_RSGPIO_Pin_1//RS引脚定义P2^6
#defineLCD_CSGPIO_Pin_0//CS引脚定义P2^7
#defineLCD_RSTGPIO_Pin_11//RST引脚定义P3^3
#defineLCD_RDGPIO_Pin_8//RD引脚定义P3^2
#defineLCD_SIZE_X240//彩屏的分辨率为240*320
#defineLCD_SIZE_Y320
externuintcolors[];
voidLCD_Init(void);//LCD初始化函数
voidLCD_ShowString(uintx,uinty,uintFor_color,uintBk_color,char*p);//写字符串函数
voidLCD_ShowChar(uintx,uinty,uintFor_color,uintBk_color,charch);//写字符函数
voidChineseChar(uintx,uinty,intsize,uintFor_color,uintBk_color,charc);//写汉字函数
voiddelayms(intcount);
//voidLCD_Writ_Bus(charVH,charVL);//8位模式下的总线写函数
voidLCD_Writ_Bus(uintVH,uintVL);//16位模式下的总线写函数
voidLCD_Write_COM(charVH,charVL);//写命令函数
voidLCD_Write_DATA(charVH,charVL);//写数据函数
voidPant(charVH,charVL);//涂满彩屏函数
voidAddress_set(unsignedintx1,unsignedinty1,unsignedintx2,unsignedinty2);//设置地址范围函数
驱动程序Lcd.c文件如下:
#include"stm32f10x_lib.h"
#include"LCD_driver.h"
#include"chinese.h"
#include"char.h"
#defineLCD_rest(x)x?GPIO_SetBits(GPIOA,LCD_RST):GPIO_ResetBits(GPIOA,LCD_RST)//自己定义位操作函数
#defineLCD_rd(x)x?GPIO_SetBits(GPIOA,LCD_RD):GPIO_ResetBits(GPIOA,LCD_RD)
#defineLCD_rs(x)x?GPIO_SetBits(GPIOB,LCD_RS):GPIO_ResetBits(GPIOB,LCD_RS)
#defineLCD_wr(x)x?GPIO_SetBits(GPIOB,LCD_WR):GPIO_ResetBits(GPIOB,LCD_WR)
#defineLCD_cs(x)x?GPIO_SetBits(GPIOB,LCD_CS):GPIO_ResetBits(GPIOB,LCD_CS)
uintcolors[]=
{
0xf800,0x07e0,0x001f,0xffe0,0x0000,0x07ff,0xf81f,0xffff//颜色数据是16位的
};
voidLCD_Init(void)//lcd初始化
{
LCD_rest(1);
delayms(5);
LCD_rest(0);
delayms(5);
LCD_rest(1);
delayms(5);
LCD_cs(0);//打开片选使能
//
LCD_Write_COM(0x00,0xE5);LCD_Write_DATA(0x78,0xF0);//setSRAMinternaltiming
LCD_Write_COM(0x00,0x01);LCD_Write_DATA(0x01,0x00);//setSSandSMbit
LCD_Write_COM(0x00,0x02);LCD_Write_DATA(0x07,0x00);//set1lineinversion
LCD_Write_COM(0x00,0x03);LCD_Write_DATA(0x10,0x30);//setGRAMwritedirectionandBGR=1.
LCD_Write_COM(0x00,0x04);LCD_Write_DATA(0x00,0x00);//Resizeregister
LCD_Write_COM(0x00,0x08);LCD_Write_DATA(0x02,0x07);//setthebackporchandfrontporch
LCD_Write_COM(0x00,0x09);LCD_Write_DATA(0x00,0x00);//setnon-displayarearefreshcycleISC[3:0]
LCD_Write_COM(0x00,0x0A);LCD_Write_DATA(0x00,0x00);//FMARKfunction
LCD_Write_COM(0x00,0x0C);LCD_Write_DATA(0x00,0x00);//RGBinterfacesetting
LCD_Write_COM(0x00,0x0D);LCD_Write_DATA(0x00,0x00);//FramemarkerPosition
LCD_Write_COM(0x00,0x0F);LCD_Write_DATA(0x00,0x00);//RGBinterfacepolarity
//
LCD_Write_COM(0x00,0x10);LCD_Write_DATA(0x00,0x00);//SAP,BT[3:0],AP,DSTB,SLP,STB
LCD_Write_COM(0x00,0x11);LCD_Write_DATA(0x00,0x07);//DC1[2:0],DC0[2:0],VC[2:0]
LCD_Write_COM(0x00,0x12);LCD_Write_DATA(0x00,0x00);//VREG1OUTvoltage
LCD_Write_COM(0x00,0x13);LCD_Write_DATA(0x00,0x00);//VDV[4:0]forVCOMamplitude
LCD_Write_COM(0x00,0x07);LCD_Write_DATA(0x00,0x01);
delayms(50);//Dis-chargecapacitorpowervoltage
LCD_Write_COM(0x00,0x10);LCD_Write_DATA(0x10,0x90);//1490//SAP,BT[3:0],AP,DSTB,SLP,STB
LCD_Write_COM(0x00,0x11);LCD_Write_DATA(0x02,0x27);//DC1[2:0],DC0[2:0],VC[2:0]
delay