OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8403|回复: 9

求stm32驱动12864液晶屏显示5行汉字程序

[复制链接]

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
发表于 2016-3-7 20:04:04 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

显示效果不好, 且字体只能是12X12的, 在12864上显示不好看, 实现的方法用画点的方式, 不能用写字节的方法, 因为一般这个屏都是以字节写的, 以下代码是用于 19264的液晶显示屏的, 你自已看看 /********************************************************************************************* 函数名:PutPixel LCD描点函数 调 用:PutPixel(x,y,d); 参 数:x,y坐标, d清点或置点标志 返回值:无 结 果: ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-3-7 20:04:05 | 显示全部楼层
本帖最后由 likunxue 于 2016-3-7 20:59 编辑

显示效果不好, 且字体只能是12X12的, 在12864上显示不好看,
实现的方法用画点的方式, 不能用写字节的方法, 因为一般这个屏都是以字节写的,
以下代码是用于 19264的液晶显示屏的, 你自已看看


/*********************************************************************************************
函数名:PutPixel  LCD描点函数
调  用:PutPixel(x,y,d);
参  数:x,y坐标, d清点或置点标志
返回值:无
结  果: 在LCD屏的指定坐标上绘一个点或清一个点
**********************************************************************************************/
void PutPixel(unsigned char x,unsigned char y,unsigned char d){
     unsigned char const h[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
     unsigned char const l[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
     unsigned char temp,m;
     temp = ReadData(x,y/8); //取当前坐标位置的LCD的显示参数
     m=y&0x07; //取当前点在当前字节的位置
     if(d)temp|=h[m];
     else temp&=l[m];
     WriteData(x,y/8,temp);   //写入数据
     }
/********************************************************************************************
函数名称: Write_Dot_LCD(x,y,d)图形绘制函数
功    能: 将图形数据写入到指定的显示坐标上
参    数: x列坐标,Y横坐标,m,真实的坐标点,GB_Dat要写入的数据
修改日期: 2012.11.18
编 写 人: likunxue
********************************************************************************************/
void Write_Dot_LCD(u8 x,u8 y,u8 GB_Dat){
     u8 const h[]={0,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
     u8 const l[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0};
     u8 m,temp, temp1;
     m=y&0x07; //取Y向坐标点除8的余数
     y/=8; //计算显示Y坐标值
     if(CharImageReverse!=0)GB_Dat=~GB_Dat; //如果是反显,数据取反
     if(m==0)WriteData(x,y,GB_Dat);//直接写入字符参数
     else{
         temp  = GB_Dat;
         temp1 = ReadData(x,y);  //读出数据
         temp<<=m;
         temp1&=h[m];
         temp|=temp1; //合并数据
         WriteData(x,y,temp); //写入上半字节
         temp  = GB_Dat;
         temp1 = ReadData(x,y+1);  //读出下半字节数据
         temp>>=(8-m);
         temp1&=l[m];
         temp|=temp1; //合并数据
         WriteData(x,y+1,temp);//写入下半字节
         }
     }
/*********************************************************************************************
函数名:任意位置显示单个汉字或字符函数
调  用:LCD_ZiFuXianShi(u8 x,u8 y,u8 size,u8 tem,u8 *str)
参  数:x,y  显示坐标
        size 字体
        tem  汉字或字符(1汉字,2字符)
        *str 点陈数据
返回值:无
*********************************************************************************************/
void LCD_ZiFuXianShi(u8 x,u8 y,u8 size,u8 tem,u8 *str) //任意行写入一个汉字
     {
     u8 m,i,k,Cnt,SET,CLR;
     if(CharImageReverse!=0){SET =0;CLR =1;} //如果是反显,数据取反
     else{SET =1;CLR =0;}
     Cnt = size/tem; //计算X向所需要的字节数
     for(i=0;i<Cnt;i++){Write_Dot_LCD(x+i,y,*str);str++;}//上行
     y+=8;
     for(i=0;i<Cnt;i++) //下行
        {
        if(size ==16)Write_Dot_LCD(x+i,y,*str);
        else{  //用描点的方式完成余下数据的写入
            k= *str;//读取数据
            for(m =0;m<4;m++)
               {
               if((k>>m)&0x01)PutPixel(x+i,y+m,SET);//画点
               else PutPixel(x+i,y+m,CLR);//清定点
               }
            }
        str++;
        }
    }
/*********************************************************************************************
函数名:LCD_word 任意位置汉字及字符显示函数
调  用:LCD_word(x,y,*s);
参  数:x轴座标,y轴座标,s 数据指针
返回值:无
结  果:显示数组指针处的汉字const char *BiaoTi
*********************************************************************************************/
void LCD_word (u8 x,u8 y,u8 size, const char *str) //任意行写入一个汉字
     {
     const unsigned char *SII;     
     u32 k,FoaSize; //汉字库字模存放地址及,ASCII字符字模存放地址
     u8 tem,Br[32];
     if(size ==12){FoaSize = ftinfo.f12addr;SII = ASII_12;}//字模首地址
     else{FoaSize = ftinfo.f16addr;SII = ASII_16;}
     while(*str>0)
          {
          tem = *str;//取高8位字形码
          if(tem <0x7f)
            {
            k= (tem-32)* size;//计算了模地址
            LCD_ZiFuXianShi(x,y,size,2,(u8*)SII+k);
            tem = size/2;  //ASCII 字符只主半个汉字宽
            str ++;
            }//如果是字符,计算字模地址,置字符标志位8
          else{
              GET_FONT((u8 *)str,Br,size*2,FoaSize); //得到字模点阵数据
              str+=2;     //字符串指针加2指向下一个汉字编码
              tem = size;    //置汉字标志位(汉字16位)
              LCD_ZiFuXianShi(x,y,size,1,Br);
              }
          x += tem;//计算x坐标,
          }
      }










回复

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
 楼主| 发表于 2016-3-7 20:22:56 | 显示全部楼层
yklstudent 发表于 2016-3-7 20:10
汉子字体取12X12好了

无字库的液晶只有8页,如果显示五行,需要10页啊
回复

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
 楼主| 发表于 2016-3-9 12:48:58 | 显示全部楼层
likunxue 发表于 2016-3-7 20:54
显示效果不好, 且字体只能是12X12的, 在12864上显示不好看,
实现的方法用画点的方式, 不能用写字节的 ...

所有的12864通用吗
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-3-9 12:51:51 | 显示全部楼层
LOVESTM32 发表于 2016-3-9 12:48
所有的12864通用吗

这要看你的液晶屏使用的驱动芯片来决定, 但原理是一样的
回复

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
 楼主| 发表于 2016-3-9 13:28:41 | 显示全部楼层
likunxue 发表于 2016-3-9 12:51
这要看你的液晶屏使用的驱动芯片来决定, 但原理是一样的

我的12864 直接对页操作啊  ,具体的行地址并没有给出啊
回复

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2015-7-5
在线时间
484 小时
发表于 2016-3-9 18:13:27 | 显示全部楼层
对于那些页类型的LCD模块,先设置一个显示RAM,对显示RAM进行操作,然后根据RAM变化的情况,把相应RAM区刷新到LCD
回复

使用道具 举报

3

主题

72

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1305
金钱
1305
注册时间
2015-12-3
在线时间
160 小时
发表于 2016-6-8 21:12:37 | 显示全部楼层
likunxue 发表于 2016-3-7 20:54
显示效果不好, 且字体只能是12X12的, 在12864上显示不好看,
实现的方法用画点的方式, 不能用写字节的 ...

请问你用的12864是st7920的芯片吗
。。。。
回复

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1903
金钱
1903
注册时间
2015-7-5
在线时间
484 小时
发表于 2016-6-8 21:21:37 | 显示全部楼层
建立一个显示RAM吧,先往RAM里面堆东西,再把相关的  写到显示器
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-6-13 21:42:52 | 显示全部楼层
koenlee93 发表于 2016-6-8 21:12
请问你用的12864是st7920的芯片吗

我没有注意芯片是什么型号,时间太久了,计不起来了! 但屏是192X64的,没有错!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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