[STM32F4]

月末了,分享个lcd的电子指针式时钟挺酷的。

[复制链接]
楼主: 一路向北lm
手机看帖
扫描二维码
随时随地手机跟帖
一路向北lm|  楼主 | 2017-11-29 12:11 | 显示全部楼层
接下面我们可以画十字标志了
void GUI_DrowSign(uint16_t x, uint16_t y, uint16_t color)
{
    uint8_t i;

    /* 画点 */
    TFT_SetWindow(x-1, y-1, x+1, y+1);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }

    /* 画竖 */
    TFT_SetWindow(x-4, y, x+4, y);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }

    /* 画横 */
    TFT_SetWindow(x, y-4, x, y+4);
    for(i=0; i<9; i++)
    {
        TFT_WriteData_Color(color);   
    }
}

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-29 12:13 | 显示全部楼层
参数跟画点参数一样,参考便可以。

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-29 12:14 | 显示全部楼层
接下来就该绘制表盘的了,精彩晚上继续。

使用特权

评论回复
mcuzone| | 2017-11-29 13:09 | 显示全部楼层
走时准不准得放个几天甚至几个月来判断

使用特权

评论回复
Larm1| | 2017-11-29 13:10 | 显示全部楼层
好东西,不错...

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-29 14:45 | 显示全部楼层
mcuzone 发表于 2017-11-29 13:09
走时准不准得放个几天甚至几个月来判断

主要看定时器的代码了,系统定时器还行吧

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-29 14:46 | 显示全部楼层
Larm1 发表于 2017-11-29 13:10
好东西,不错...

相互学习,好东西大家一块分享。

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 11:49 | 显示全部楼层
写12号ASCII码
void GUI_Show12ASCII(uint16_t x, uint16_t y, uint8_t *p,
                     uint16_t wordColor, uint16_t backColor)
{
        uint8_t i, wordByte, wordNum;
        uint16_t color;

        while(*p != '\0')   //检测是否是最后一个字
        {
        /* 在字库中的ASCII码是从空格开始的也就是32开始的,所以减去32 */
                wordNum = *p - 32;
               
        TFT_SetWindow(x, y, x+7, y+15);           //字宽*高为:8*16
                for (wordByte=0; wordByte<16; wordByte++) //每个字模一共有16个字节
                {
                        color = ASCII8x16[wordNum][wordByte];
                        for (i=0; i<8; i++)
                        {
                                if ((color&0x80) == 0x80)
                                {
                                        TFT_WriteData_Color(wordColor);
                                }                                                
                                else
                                {
                                        TFT_WriteData_Color(backColor);
                                }        
                                color <<= 1;
                        }
                }

                p++;    //指针指向下一个字
               
        /* 屏幕坐标处理 */
        x += 8;
        if(x > 233)   //TFT_XMAX -8
        {
            x = 0;
            y += 16;   
        }
        }
}

#else

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 11:52 | 显示全部楼层
这个函数只能写入字符,不能写入汉子哦
参数:
        x:起始X坐标
        y:起始Y坐标
        p:字符串首地址
        wordColor:字体颜色
        backColor:背景颜色

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 11:56 | 显示全部楼层
通过FLASH字库显示12号字母和汉字
void GUI_Show12Char(uint16_t x, uint16_t y, uint8_t *ch,
                    uint16_t wordColor, uint16_t backColor)
{
    uint8_t i, j, color, buf[32];
    uint16_t asc;
    uint32_t wordAddr = 0;

    while(*ch != '\0')
    {
        /*显示字母 */
        if(*ch < 0x80)  //ASCII码从0~127
        {
            /* 在字库中的ASCII码是从空格开始的也就是32开始的,所以减去32 */
                    wordAddr = *ch - 32;
            wordAddr *= 16;
            wordAddr += GUI_FLASH_ASCII_ADDR;
            
            /* 读取FLASH中该字的字模 */
            FLASH_ReadData(buf, wordAddr, 16);
            
            /* 显示该文字 */               
            TFT_SetWindow(x, y, x+7, y+15);           //字宽*高为:8*16
                    for (j=0; j<16; j++) //每个字模一共有16个字节
                    {
                            color = buf[j];
                            for (i=0; i<8; i++)
                            {
                                    if ((color&0x80) == 0x80)
                                    {
                                            TFT_WriteData_Color(wordColor);
                                    }                                                
                                    else
                                    {
                                            TFT_WriteData_Color(backColor);
                                    }        
                                    color <<= 1;
                            }
                    }
   
                    ch++;    //指针指向下一个字
                   
            /* 屏幕坐标处理 */
            x += 8;
            if(x > 233)   //TFT_XMAX -8
            {
                x = 0;
                y += 16;   
            }            
        }
        /* 显示汉字 */
        else
        {
            /* 将汉字编码转换成在FLASH中的地址 */
            asc = *ch - 0x81;     //高字节是表示分区,分区是从0x81到0xFE,所以转换成地址-0x80
            wordAddr = asc * 190; //每个分区一共有190个字
   
            asc = *(ch + 1); //低字节代表每个字在每个分区的位置,它是从0x40到0xFF
            if(asc < 0x7F)   //在0x7F位置有个空位,但是我们取模不留空,所以大于0x7F之后多减一
            {
                asc -= 0x40;
            }
            else
            {
                asc -= 0x41;
            }
            
            wordAddr += asc; //求出在GBK中是第几个字
            wordAddr *= 32;  //将字位置转换位FLASH地址
            wordAddr += GUI_FLASH_12CHAR_ADDR; //加上首地址
   
            /* 读取FLASH中该字的字模 */
            FLASH_ReadData(buf, wordAddr, 32);
   
            /* 在彩屏上面显示 */
            TFT_SetWindow(x, y, x+15, y+15);
            for(i=0; i<32; i++)
            {
                 
                color = buf[i];            
                for(j=0; j<8; j++)
                        {
                                if((color & 0x80) == 0x80)
                                {
                                        TFT_WriteData_Color(wordColor);
                                }                                                
                                else
                                {
                                        TFT_WriteData_Color(backColor);
                                }
                                color <<= 1;
                        }//for(j=0;j<8;j++)结束
            }
   
            /* 屏幕坐标处理 */
            x += 16;
            if(x > 225)   //TFT_XMAX -15
            {
                x = 0;
                y += 16;   
            }
   
            /* 写下一个字,每个汉字占两个字节所以+2 */
            ch += 2;            
        }
    }   
}

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 11:57 | 显示全部楼层
本帖最后由 一路向北lm 于 2017-11-30 12:04 编辑

这个函数可以写入汉子和字母
参数 :
            x:起始X坐标
            y:起始Y坐标
            ch:字符串首地址
            wordColor:字体颜色
            backColor:背景颜色

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 12:05 | 显示全部楼层
通过FLASH字库显示12号汉字
void GUI_Show16Chinese(uint16_t x, uint16_t y, uint8_t *cn,
                       uint16_t wordColor, uint16_t backColor)
{   
    uint8_t i, j, color, buf[63];
    uint16_t asc;
    uint32_t wordAddr = 0;   
    while(*cn != '\0')
    {  
        /* 将汉字编码转换成在FLASH中的地址 */
        asc = *cn - 0x81;     //高字节是表示分区,分区是从0x81到0xFE,所以转换成地址-0x80
        wordAddr = asc * 190; //每个分区一共有190个字

        asc = *(cn + 1); //低字节代表每个字在每个分区的位置,它是从0x40到0xFF
        if(asc < 0x7F)   //在0x7F位置有个空位,但是我们取模不留空,所以大于0x7F之后多减一
        {
            asc -= 0x40;
        }
        else
        {
            asc -= 0x41;
        }
        
        wordAddr += asc; //求出在GBK中是第几个字
        wordAddr *= 63;  //将字位置转换位FLASH地址
        wordAddr += GUI_FLASH_16CHAR_ADDR; //加上首地址

        /* 读取FLASH中该字的字模 */
        FLASH_ReadData(buf, wordAddr, 63);

        /* 在彩屏上面显示 */
        TFT_SetWindow(x, y, x+23, y+20);
        for(i=0; i<63; i++)
        {
            color = buf[i];            
            for(j=0; j<8; j++)
                    {
                            if((color & 0x80) == 0x80)
                            {
                                    TFT_WriteData_Color(wordColor);
                            }                                                
                            else
                            {
                                    TFT_WriteData_Color(backColor);
                            }
                            color <<= 1;
                    }//for(j=0;j<8;j++)结束
        }

        /* 屏幕坐标处理 */
        x += 21;
        if(x > 218)   //TFT_XMAX -21
        {
            x = 0;
            y += 21;   
        }

        /* 写下一个字,每个汉字占两个字节所以+2 */
        cn += 2;      
    }   
}

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 12:05 | 显示全部楼层
这个函数只能显示汉字哦
x:起始X坐标
y:起始Y坐标
cn:字符串首地址
wordColor:字体颜色
backColor:背景颜色

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 12:07 | 显示全部楼层
还有一个关于字库更新的,晚上再分享

使用特权

评论回复
stm32jy| | 2017-11-30 12:22 | 显示全部楼层
不错呦,界面很美。

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 22:13 | 显示全部楼层
更新字库
void GUI_FontUpdate(uint8_t updateState)
{
    FRESULT res;
        FIL fsrc;
        UINT  br;
    uint32_t wordAddr, i, j;

#ifdef __MALLOC_H       
    uint8_t *p;
    p = malloc(4096);                  //开辟一个内存块
    if(p == 0)
    {
        return;
    }
#else
        uint8_t buffer[512];
#endif           

    /* 更新ASCII字库 */
    if((updateState & GUI_UPDATE_ASCII) == GUI_UPDATE_ASCII)
    {
        /* 设置写入起始地址 */
        wordAddr = GUI_FLASH_ASCII_ADDR;
        j = 0;

        /* 打开读取文件 */
        res = f_open(&fsrc, GUI_ASCII_FILE, FA_READ);       
            if(res == FR_OK)  //打开成功
        {
                 for (;;)      //开始读取数据
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加

#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#endif
                j += br;
                i = j * 100 / 1456;
                GUI_Box(0, 80, i, 90, RED);   

                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
             
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }

    /* 更新12号汉字库 */
    if((updateState & GUI_UPDATE_12CHAR) == GUI_UPDATE_12CHAR)
    {
        wordAddr = GUI_FLASH_12CHAR_ADDR;
        j = 0;

        res = f_open(&fsrc, GUI_12CHAR_FILE, FA_READ);
           
            if(res == FR_OK)
        {  
                 for (;;)  
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;
#endif
                j += br;
                i = j * 100 / 766080;
                GUI_Box(0, 95, i, 105, RED);   

   
                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }
   
    /* 更新16号汉字库 */
    if((updateState & GUI_UPDATE_16CHAR) == GUI_UPDATE_16CHAR)
    {
        
        wordAddr = GUI_FLASH_16CHAR_ADDR;
        j = 0;

        res = f_open(&fsrc, GUI_16CHAR_FILE, FA_READ);       
            if(res == FR_OK)
        {
                 for (;;)  
                 {      
#ifdef __MALLOC_H       
                res = f_read(&fsrc, p, 4096, &br);
   
                /* 将读取到的数据写入FLASH */
                FLASH_WriteData(p, wordAddr, br);
                      wordAddr += br;   //写入地址增加
#else
                res = f_read(&fsrc, buffer, sizeof(buffer), &br);
   
                FLASH_WriteData(buffer, wordAddr, br);
                      wordAddr += br;
#endif
                j += br;
                i = j * 100 / 1508220;
                GUI_Box(0, 110, i, 120, RED);   

   
                if (res || br == 0)
                            {
                                    break;    // error or eof
                            }
            }
        }
             
        f_close(&fsrc);  //不论是打开,还是新建文件,一定记得关闭
    }
#ifdef __MALLOC_H       
    free(p);
#endif
}

#endif

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 22:15 | 显示全部楼层
很长的更新字库的函数代码,这个我没仔细看过,只是拿来用。

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 22:17 | 显示全部楼层
下面开始绘制我们的表盘函数,精彩即将开始

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 22:17 | 显示全部楼层
void get_circle(int x,int y,int r,int col)
{
        int xc=0;
        int yc,p;
        yc=r;
        p=3-(r<<1);       
        while(xc <= yc)
        {
                GUI_Dot(x+xc,y+yc,col);
                GUI_Dot(x+xc,y-yc,col);       
                GUI_Dot(x-xc,y+yc,col);
                GUI_Dot(x-xc,y-yc,col);
                GUI_Dot(x+yc,y+xc,col);       
                GUI_Dot(x+yc,y-xc,col);
                GUI_Dot(x-yc,y+xc,col);
                GUI_Dot(x-yc,y-xc,col);
                if(p<0)
                {
                        p += (xc++ << 2) + 6;       
                }
                else
                        p += ((xc++ - yc--)<<2) + 10;
        }
}

使用特权

评论回复
一路向北lm|  楼主 | 2017-11-30 22:18 | 显示全部楼层
有了这个函数我们就可以开始画圆了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则