搜索
bottom↓
回复: 3

LCD中文字符显示,摸索学习,欢迎交流

[复制链接]

出0入0汤圆

发表于 2018-1-19 12:34:09 | 显示全部楼层 |阅读模式
以下程序与硬件有关,LCD屏从左到右从上到下编码.
本贴point是keil编译环境下,字符串指针与数组的结合应用,我从新学习了c语言指针这部分内容,操作方法如下:

函数形参是指针类型,赋值为字符串,后面是字符串横纵坐标地址
void LCDGB2312_X_Ydisplay(uint8_t *String , uint8_t x, uint8_t y)

赋值为字符串操作例:
LCDGB2312_X_Ydisplay("您好中国年",0,0);

中文字符用引号,字符串转换成编码,GB2312编码方式
调用内容:
LCDGB2312_X_Ydisplay("您好中国年",0,0);



函数内容如下:
void LCDGB2312_X_Ydisplay(uint8_t *String , uint8_t x, uint8_t y)
{
       
        uint8_t i=0,j=0,StringAdd[32]={0};
       
        uint32_t Address ;
        uint16_t BaseAdd=0;
       
        for (i=0 ;String[i*2] != '\0'; i++)
        {
if(String[i*2] ==0xA9 && String[i*2+1] >=0xA1)
Address = (282 + (String[i*2+1] - 0xA1 ))*32+BaseAdd;
else if(String[i*2] >=0xA1 && String[i*2] <= 0xA3 && String[i*2+1] >=0xA1)
Address =( (String[i*2] - 0xA1) * 94 + (String[i*2+1] - 0xA1))*32+ BaseAdd;
else if(String[i*2] >=0xB0 &&String[i*2] <= 0xF7 && String[i*2+1] >=0xA1)
Address = ((String[i*2] - 0xB0) * 94 + (String[i*2+1] - 0xA1)+ 846)*32+ BaseAdd;
                        StringAdd[i*4] = 0X03;                       
                        StringAdd[i*4+3] = Address;
                        StringAdd[i*4+2] = Address>>8;
                        StringAdd[i*4+1] = Address>>16;
        }       
       
       
        for( i = 0; StringAdd [i*4] != 0x00; i++)
        {
        uint8_t StringAdd1[4] = {0};
        uint8_t SPIrecebuffer[32] = {0};
        StringAdd1[0] = StringAdd[i*4];
        StringAdd1[1] = StringAdd[i*4+1];
        StringAdd1[2] = StringAdd[i*4+2];
        StringAdd1[3] = StringAdd[i*4+3];
               
        HAL_GPIO_WritePin(ROM_CS_GPIO_Port, ROM_CS_Pin, GPIO_PIN_RESET);
        HAL_SPI_Transmit(&hspi1,StringAdd1,4,10);               
        HAL_SPI_Receive(&hspi1,SPIrecebuffer,32,10);               
        HAL_GPIO_WritePin(ROM_CS_GPIO_Port, ROM_CS_Pin, GPIO_PIN_SET);
       

        if (y%8 == 0)  //two page situation
        {
                for(j=0 ;j<16; j++)
                {
                lcdMem[(7-y/8-1)*128+x+j+ 16*i] =SPIrecebuffer[j];
                lcdMem[(7-y/8)*128+x+j+ 16*i] = SPIrecebuffer[j+16];
                }
        }
        else        //three page sityation
        {
                for(j=0 ;j<16; j++)
                {
                        lcdMem[(7-y/8-2)*128+x+j+ 16*i] &= 0xff>>(y%8+1);
                        lcdMem[(7-y/8-2)*128+x+j+ 16*i]        ^= SPIrecebuffer[j] << (7-y%8);       
                        lcdMem[(7-y/8-1)*128+x+j+ 16*i] &= 0x00;
                        lcdMem[(7-y/8-1)*128+x+j+ 16*i] ^= ((SPIrecebuffer[j]>>(y%8+1))^(SPIrecebuffer[j+16]<<(7-y%8)));
                        lcdMem[(7-y/8)*128+x+j+ 16*i] &=        0xff<<(7-y%8);
                        lcdMem[(7-y/8)*128+x+j+ 16*i] ^= SPIrecebuffer[j+16]>>(y%8+1);
                }
        }               
        }
}

出0入0汤圆

 楼主| 发表于 2018-2-1 18:42:07 | 显示全部楼层
本帖最后由 qianhongyuan 于 2018-2-1 18:48 编辑

lcdMem[(7-y/8-2)*128+x+j+ 16*i] &= 0xff>>(y%8+1);  
lcdMem[(7-y/8-2)*128+x+j+ 16*i]        ^= SPIrecebuffer[j] << (7-y%8);                              
lcdMem[(7-y/8-1)*128+x+j+ 16*i] &= 0x00;                        
lcdMem[(7-y/8-1)*128+x+j+ 16*i] ^= ((SPIrecebuffer[j]>>(y%8+1))^(SPIrecebuffer[j+16]<<(7-y%8)));                        
lcdMem[(7-y/8)*128+x+j+ 16*i] &=        0xff<<(7-y%8);                        
lcdMem[(7-y/8)*128+x+j+ 16*i] ^= SPIrecebuffer[j+16]>>(y%8+1);


调整坐标原点和调整跨页情况的位操作,个人喜欢数学那样定义坐标原点 所以做了些数据处理
里面有个错误,一个是 lcdMem[(7-y/8-2)*128+x+j+ 16*i] &= 0xff>>(y%8+1);  括号中的应为y%8  不需要减一下面同理
另一个 lcdMem[(7-y/8-2)*128+x+j+ 16*i]        ^= SPIrecebuffer[j] << (7-y%8);       括号内应该用8-y%8

出0入0汤圆

发表于 2018-2-1 20:50:12 | 显示全部楼层
qianhongyuan 发表于 2018-2-1 18:42
lcdMem[(7-y/8-2)*128+x+j+ 16*i] &= 0xff>>(y%8+1);  
lcdMem[(7-y/8-2)*128+x+j+ 16*i]        ^= SPIr ...

8,128,16什么的都用移位替换
而且总感觉计算可以更简单点

出0入0汤圆

 楼主| 发表于 2018-4-22 17:36:07 | 显示全部楼层
shower.xu 发表于 2018-2-1 20:50
8,128,16什么的都用移位替换
而且总感觉计算可以更简单点

虚心接受,感谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 09:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表