|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#include "stm32f4xx.h"
#include "Font_Lib.h"
#include "sysdelay.h"
uint32_t devicecode = 0; //自动获得LCD型号自适应选择驱动
uint16_t colort;
/*---------------------------------------初始化函数----------------------------------*/
/*---------------静态总线配置------------------------*/
void FSMC_Configuration(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 0x0;
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0x0;
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 0xc;
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0x0;
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0x0;
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0x00;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_B;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
/*--------------总线IO配置----------------------*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*-------------------------------lcd初始化函数----------------------------*/
/*------------------------------初始化状态为黑屏--------------------------*/
void LCD_Init(void)
{
uint32_t color1=0;
LCD_Reset();
devicecode = LCD_ReadRegister(0x0000);
if(devicecode == 0x9328)
{
LCD_WR_CMD(0x00e7,0x0010);
LCD_WR_CMD(0x0000,0x0001);
LCD_WR_CMD(0x0001,0x0100);
LCD_WR_CMD(0x0002,0x0700);
LCD_WR_CMD(0x0003,(1<<12)|(3<<4)|(0<<3));
LCD_WR_CMD(0x0004,0x0000);
LCD_WR_CMD(0x0008,0x0207);
LCD_WR_CMD(0x0009,0x0000);
LCD_WR_CMD(0x000a,0x0000);
LCD_WR_CMD(0x000c,0x0001);
LCD_WR_CMD(0x000d,0x0000);
LCD_WR_CMD(0x000f,0x0000);
Delay_Nms(50);
LCD_WR_CMD(0x0010,0x0000);
LCD_WR_CMD(0x0011,0x0007);
LCD_WR_CMD(0x0012,0x0000);
LCD_WR_CMD(0x0013,0x0000);
Delay_Nms(50);
LCD_WR_CMD(0x0010,0x1590);
LCD_WR_CMD(0x0011,0x0227);
Delay_Nms(50);
LCD_WR_CMD(0x0012,0x009c);
Delay_Nms(50);
LCD_WR_CMD(0x0013,0x1900);
LCD_WR_CMD(0x0029,0x0023);
LCD_WR_CMD(0x002b,0x000e);
Delay_Nms(50);
LCD_WR_CMD(0x0020,0x0000);
LCD_WR_CMD(0x0021,0x013f);
Delay_Nms(50);
LCD_WR_CMD(0x0030,0x0007);
LCD_WR_CMD(0x0031,0x0707);
LCD_WR_CMD(0x0032,0x0006);
LCD_WR_CMD(0x0035,0x0704);
LCD_WR_CMD(0x0036,0x1f04);
LCD_WR_CMD(0x0037,0x0004);
LCD_WR_CMD(0x0038,0x0000);
LCD_WR_CMD(0x0039,0x0706);
LCD_WR_CMD(0x003c,0x0701);
LCD_WR_CMD(0x003d,0x000f);
Delay_Nms(50);
LCD_WR_CMD(0x0050,0x0000);
LCD_WR_CMD(0x0051,0x00ef);
LCD_WR_CMD(0x0052,0x0000);
LCD_WR_CMD(0x0053,0x013f);
LCD_WR_CMD(0x0060,0xa700);
LCD_WR_CMD(0x0061,0x0001);
LCD_WR_CMD(0x006a,0x0000);
LCD_WR_CMD(0x0080,0x0000);
LCD_WR_CMD(0x0081,0x0000);
LCD_WR_CMD(0x0082,0x0000);
LCD_WR_CMD(0x0083,0x0000);
LCD_WR_CMD(0x0084,0x0000);
LCD_WR_CMD(0x0085,0x0000);
LCD_WR_CMD(0x0090,0x0010);
LCD_WR_CMD(0x0092,0x0000);
LCD_WR_CMD(0x0093,0x0003);
LCD_WR_CMD(0x0095,0x0110);
LCD_WR_CMD(0x0097,0x0000);
LCD_WR_CMD(0x0098,0x0000);
//开启显示设置
LCD_WR_CMD(0x0007,0x0133);
LCD_WR_CMD(0x0020,0x0000);
LCD_WR_CMD(0x0021,0x013f);
LCD_WR_REG(34);
for(color1=0;color1<76800;color1++) //用黑色清屏
{
LCD_WR_Data(Black);
}
}
else if(devicecode==0x7783)
{
LCD_WR_CMD(0x00ff,0x0001);
LCD_WR_CMD(0x0001,0x0000);
LCD_WR_CMD(0x0002,0x0700);
LCD_WR_CMD(0x0003,0x1030);
LCD_WR_CMD(0x0008,0x0302);
Delay_Nms(50);
LCD_WR_CMD(0x0010,0x10E0);
Delay_Nms(50);
LCD_WR_CMD(0x0060,0x2700);
LCD_WR_CMD(0x0061,0x0001);
LCD_WR_CMD(0x0090,0x003A);
LCD_WR_CMD(0x00B0,0x2B0C);
LCD_WR_CMD(0x0030,0x0000);
LCD_WR_CMD(0x0031,0x0507);
LCD_WR_CMD(0x0032,0x0303);
LCD_WR_CMD(0x0035,0x0004);
LCD_WR_CMD(0x0036,0x0B07);
LCD_WR_CMD(0x0037,0x0000);
LCD_WR_CMD(0x0038,0x0507);
LCD_WR_CMD(0x0039,0x0303);
LCD_WR_CMD(0x003c,0x0004);
LCD_WR_CMD(0x003d,0x0B07);
LCD_WR_CMD(0x0050,0x0000);
LCD_WR_CMD(0x0051,0x00ef);
LCD_WR_CMD(0x0052,0x0000);
LCD_WR_CMD(0x0053,0x013f);
LCD_WR_CMD(0x0007,0x0133);
LCD_WR_CMD(0x0022,0x0000);
LCD_WR_REG(34);
for(color1=0;color1<76800;color1++) //用黑色清屏
{
LCD_WR_Data(Black);
}
}
else{}
}
/*----------------------------------分割线-------------------------------*/
/*---------------------------------内部调用函数--------------------------*/
/*--------------写寄存器数据----------------*/
/*----command:寄存器地址,data:数据----------*/
void LCD_WR_CMD(uint16_t addr,uint16_t data)
{
*(volatile uint16_t *) (LCD_CMD)= addr;
*(volatile uint16_t *) (LCD_DATA)= data;
}
/*--------------写数据---------------------*/
/*--------------data:写入的数据------------*/
void LCD_WR_Data(uint16_t data)
{
*(volatile uint16_t *) (LCD_DATA)= data;
}
/*--------------读寄存器---------------------*/
/*-----------addr:写入地址,返回地址的内容----*/
uint16_t LCD_ReadRegister(uint16_t addr)
{
uint16_t temp = 0;
temp = (*(volatile uint16_t *) (LCD_DATA+addr));
return temp;
}
/*----------------写寄存器地址----------------*/
/*-------------addr:地址----------------------*/
void LCD_WR_REG(uint16_t addr)
{
*(volatile uint16_t *) (LCD_CMD)= addr;
}
/*------------------LCD复位----------------------*/
void LCD_Reset(void)
{
RST_HIGH;
Delay_Nclk(4000);
RST_LOW;
Delay_Nclk(4000);
RST_HIGH;
Delay_Nclk(4000);
}
/*-------------设置光标位置-------------------*/
/*-----Xpos:x轴坐标,Ypos:y轴坐标--------------*/
void LCD_SetCursor(uint16_t Xpos,uint16_t Ypos)
{
LCD_WR_CMD(R32, Xpos);
LCD_WR_CMD(R33, Ypos);
}
/*--------------写准备写RAM函数---------------*/
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(R34);
}
/*---------------次方运算---------------------*/
/*---------------M的N次方---------------------*/
uint32_t Num_power(uint8_t m,uint8_t n)
{
uint32_t result=1;
while(n--)result*=m;
return result;
}
/*------------------------汉字检索函数------------------------------*/
uint16_t findHzIndex(uint8_t *hz) /* 在自定义汉字库在查找所要显示 */
/* 的汉字的位置 */
{
uint16_t i=0;
FNT_GB16 *ptGb16 = (FNT_GB16 *)GBHZ_16;
while(ptGb16.Index[0] > 0x80) {
if ((*hz == ptGb16.Index[0]) && (*(hz+1) == ptGb16.Index[1]))
{
return i;
}
i++;
if(i > (sizeof((FNT_GB16 *)GBHZ_16) / sizeof(FNT_GB16) - 1)) /* 搜索下标约束 */
{
break;
}
}
return 0;
}
/*----------------------------------分割线-------------------------------*/
/*---------------------------------外部调用函数--------------------------*/
/*--------------清屏函数----------------------*/
void LCD_Clear(uint16_t Color)
{
uint32_t index=0;
colort=Color;
LCD_SetCursor(0x0000,0x0000); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(index=0;index<76800;index++)
{
LCD_WR_Data(Color);
}
}
/*--------------清屏函数升级版----------------*/
void LCD_Clear_Plus(uint16_t x,uint16_t y,uint16_t x0,uint16_t y0)
{
int i;
LCD_WR_CMD(R32,x);
LCD_WR_CMD(R33,y);
LCD_WR_REG(34);
for(i=0;i<((x0-x)*(y0-y));i++)
{
LCD_WR_Data(colort);
}
}
/*--------------打点函数----------------------*/
/*------x,y:坐标位置,color:打点颜色-----------*/
void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
LCD_SetCursor(x,y); //设置光标位置
LCD_WR_REG(R34); //开始写入GRAM
LCD_WR_Data(color);
}
/*---------------LCD窗口设置函数--------------*/
void LCD_SetDisplayWindow(uint8_t Xpos, uint16_t Ypos, uint8_t Height, uint16_t Width)
{
LCD_WR_CMD(R80, Xpos); //水平方向GRAM起始地址
LCD_WR_CMD(R81, Xpos+Height); //水平方向GRAM结束地址
LCD_WR_CMD(R82, Ypos); //垂直方向GRAM起始地址
LCD_WR_CMD(R83, Ypos+Width); //垂直方向GRAM结束地址
LCD_SetCursor(Xpos, Ypos); //设置光标位置
}
/*-------------------画线函数-------------------------*/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color)
{
uint16_t 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,color);//画点
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
/*------------------画圆函数---------------*/
void Draw_Circle(uint8_t x0,uint16_t y0,uint8_t r,uint16_t color)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判断下个点位置的标志
while(a<=b)
{
LCD_DrawPoint(x0-b,y0-a,color); //3
LCD_DrawPoint(x0+b,y0-a,color); //0
LCD_DrawPoint(x0-a,y0+b,color); //1
LCD_DrawPoint(x0-b,y0-a,color); //7
LCD_DrawPoint(x0-a,y0-b,color); //2
LCD_DrawPoint(x0+b,y0+a,color); //4
LCD_DrawPoint(x0+a,y0-b,color); //5
LCD_DrawPoint(x0+a,y0+b,color); //6
LCD_DrawPoint(x0-b,y0+a,color);
a++;
//使用Bresenham算法画圆
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
LCD_DrawPoint(x0+a,y0+b,color);
}
}
/*-----------------显示一个字符函数----------------------*/
/*----x,y:坐标位置,chars:显示的字符,size:显示字符大小(12或16),mode:覆盖0或叠加1------*/
void LCD_ShowChar(uint8_t x,uint16_t y,uint8_t chars,uint8_t size,uint8_t mode,uint16_t color)
{
uint8_t temp;
uint8_t pos,t;
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY) return;
LCD_SetDisplayWindow(x,y,(size/2-1),size-1); //设置窗口
LCD_WriteRAM_Prepare(); //开始写入GRAM
if(!mode) //非叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=ASCII_1206[chars-0x20][pos];//调用1206字体
else temp=ASCII_1608[chars-0x20][pos]; //调用1608字体
for(t=0;t<size/2;t++)
{
//if(temp&0x01) //先传低位,取模有关系
if((temp<<t)&0x80) //先传高位
{
LCD_WR_Data(color);
}
else
{
LCD_WR_Data(colort);
}
//temp>>=1; //如果先传低位,去掉屏蔽线
}
}
}
else//叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=ASCII_1206[chars-0x20][pos]; //调用1206字体
else temp=ASCII_1608[chars-0x20][pos]; //调用1608字体
for(t=0;t<size/2;t++)
{
if((temp<<t)&0x80)LCD_DrawPoint(x+t,y+pos,color); //画一个点
//temp>>=1; //如果先传低位,去掉屏蔽线
}
}
}
/* 恢复窗体大小 */
LCD_WR_CMD(R80, 0x0000); //水平方向GRAM起始地址
LCD_WR_CMD(R81, 0x00EF); //水平方向GRAM结束地址
LCD_WR_CMD(R82, 0x0000); //垂直方向GRAM起始地址
LCD_WR_CMD(R83, 0x013F); //垂直方向GRAM结束地址
}
/*-------------------显示字符串---------------------*/
void LCD_ShowString(uint8_t x,uint16_t y,uint8_t *p,uint8_t size,uint8_t mode,uint16_t color)
{
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,size,mode,color);
x+=8;
p++;
}
}
/*-------------------显示一个指定大小的汉字-------------*/
/*-----------pucMsk:指向当前子模,x0,y0:显示位置,color字体颜色---------------*/
uint16_t WriteOneHzChar(uint8_t *pucMsk,uint16_t x0,uint16_t y0,uint16_t color)
{
uint16_t i,j;
uint16_t mod[16]; /* 当前字模 */
uint16_t *pusMsk; /* 当前字库地址 */
uint16_t y;
pusMsk = (uint16_t *)pucMsk;
for(i=0; i<16; i++) /* 保存当前汉字点阵式字模 */
{
mod = *pusMsk++; /* 取得当前字模,半字对齐访问 */
mod = ((mod & 0xff00) >> 8) | ((mod & 0x00ff) << 8);/* 字模交换高低字节(为了显示 */
/* 需要) */
}
y = y0;
for(i=0; i<16; i++) /* 16行 */
{
#ifdef __DISPLAY_BUFFER /* 使用显存显示 */
for(j=0; j<16; j++) /* 16列 */
{
if((mod << j)& 0x8000) /* 显示字模 */
{
DispBuf[240*(y0+i) + x0+j] = color;
}
}
#else /* 直接显示 */
LCD_SetCursor(x0, y); /* 设置写数据地址指针 */
LCD_WriteRAM_Prepare(); /*开始写入GRAM */
for(j=0; j<16; j++) /* 16列 */
{
if((mod << j) & 0x8000) /* 显示字模 */
{
LCD_WR_Data(color);
}
else
{
LCD_WR_Data(colort); /* 用读方式跳过写空白点的像素 */
//LCD_ReadDat();
}
}
y++;
#endif
}
return (16); /* 返回16位列宽 */
}
/*------------------在指定位置开始显示一个字符串和一串汉字-------------*/
void WriteString(uint16_t x0, uint16_t y0,uint8_t *pcStr, uint16_t color)
{
uint16_t usIndex;
uint16_t usWidth = 0;
FNT_GB16 *ptGb16 = 0;
ptGb16 = (FNT_GB16 *)GBHZ_16;
while(1)
{
if(*pcStr == 0)
{
break; /* 字符串结束 */
}
x0 = x0 + (usWidth); /* 调节字符串显示松紧度 */
if(*pcStr > 0x80) /* 判断为汉字 */
{
if((x0 + 16) > LCD_W) /* 检查剩余空间是否足够 */
{
x0 = 0;
y0 = y0 + 16; /* 改变显示坐标 */
if(y0 > LCD_H) /* 纵坐标超出 */
{
y0 = 0;
}
}
usIndex = findHzIndex(pcStr);
usWidth = WriteOneHzChar((uint8_t *)&(ptGb16[usIndex].Msk[0]), x0, y0, color);
/* 显示字符 */
pcStr += 2;
}
else
{ /* 判断为非汉字 */
if (*pcStr == '\r') /* 换行 */
{
y0 = y0 + 16; /* 改变显示坐标 */
if(y0 > LCD_H) /* 纵坐标超出 */
{
y0 = 0;
}
pcStr++;
usWidth = 0;
continue;
}
else if (*pcStr == '\n') /* 对齐到起点 */
{
x0 = 0;
pcStr++;
usWidth = 0;
continue;
}
else
{
if((x0 + 8) > LCD_W) /* 检查剩余空间是否足够 */
{
x0 = 0;
y0 = y0 + 16; /* 改变显示坐标 */
if(y0 > LCD_H) /* 纵坐标超出 */
{
y0 = 0;
}
}
usWidth = WriteOneASCII((uint8_t *)&ASCII_1608[(*pcStr - 0x20)][0], x0, y0, color);
/* ASCII码表21H的值对应区位码3区*/
pcStr += 1;
}
}
}
}
/*------------------显示一个指定大小的字符---------------*/
uint16_t WriteOneASCII(uint8_t *pucMsk,uint16_t x0,uint16_t y0,uint16_t color)
{
uint16_t i,j;
uint16_t y;
uint8_t ucChar;
y = y0;
for(i=0; i<16; i++) { /* 16行 */
ucChar = *pucMsk++;
#ifdef __DISPLAY_BUFFER /* 使用显存显示 */
for(j=0; j<8; j++) { /* 8列 */
if((ucChar << j)& 0x80) { /* 显示字模 */
DispBuf[240*(y0+i) + x0+j] = color;
}
}
#else /* 直接显示 */
LCD_SetCursor(x0, y); /* 设置写数据地址指针 */
LCD_WriteRAM_Prepare(); /* 开始写入GRAM */
for(j=0; j<8; j++) { /* 8列 */
if((ucChar << j) & 0x80) { /* 显示字模 */
LCD_WR_Data(color);
} else {
LCD_WR_Data(colort);
//LCD_ReadDat();
}
}
y++;
#endif
}
return (8); /* 返回16位列宽 */
}
/*----------------------在指定位子显示一串数字-----------------------*/
void LCD_ShowNum(uint8_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size,uint8_t mode,uint16_t color)
{
uint8_t t,temp;
uint8_t enshow=0;
for(t=0;t<len;t++)
{
temp=(num/Num_power(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+(size/2)*t,y,' ',size,mode,color);
continue;
}else enshow=1;
}
LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode,color);
}
} |
|