我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 2133|回复: 0

st7781r stm32 驱动

[复制链接]

该用户从未签到

1

主题

2

回帖

0

积分

一级逆天

积分
0

社区居民终身成就奖

QQ
发表于 2016-2-17 20:58:57 | 显示全部楼层 |阅读模式
#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);
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表