找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10765|回复: 9
收起左侧

求大神讲解下12864的行和列,具体怎么定点显示

[复制链接]
ID:67818 发表于 2014-11-19 10:12 | 显示全部楼层 |阅读模式
本帖最后由 fujian2014 于 2014-11-19 18:13 编辑

我用的是jlx12864g-378不懂啊
  1. void lcd_address(uint page,uint column)
  2. {


  3.         transfer_command_lcd(0xb0+page);   /*设置页地址*/
  4.         transfer_command_lcd(0x10+(column>>4&0x0f));        /*设置列地址的高4位*/
  5.         transfer_command_lcd(column&0x0f);        /*设置列地址的低4位*/        
  6. }

  7. /*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
  8. void display_graphic_16x16(uint page,uint column,uchar *dp)
  9. {
  10.         uint i,j;
  11.         CS_12864=0;        
  12.         for(j=0;j<2;j++)j
  13.         {
  14.                 lcd_address(page+j,column);//设置显示位置命令
  15.                 for (i=0;i<16;i++)
  16.                 {        
  17.                         transfer_data_lcd(*dp);                                        /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
  18.                         dp++;
  19.                 }
  20.         }
  21.         CS_12864=1;
  22. }

  23. /*全屏清屏*/
  24. void clear_screen()
  25. {
  26.         unsigned char i,j;
  27.         CS_12864=0;
  28.         
  29.         for(i=0;i<9;i++)
  30.         {
  31.                 transfer_command_lcd(0xb0+i);
  32.                 transfer_command_lcd(0x10);
  33.                 transfer_command_lcd(0x00);
  34.                 for(j=0;j<132;j++)
  35.                 {
  36.                         transfer_data_lcd(0x00);
  37.                 }
  38.         }
  39.         CS_12864=1;
  40. }



  41. void display_text(uchar *s,page,column)
  42. {
  43.         uchar a;
  44.         for(a=0;s[a]!=0;a+=2)
  45.         {
  46.                 display_graphic_16x16(page,column+a*8,tep[a/2+page]);
  47.         }
  48. }
  49. void main()
  50. {
  51.         uchar i=0;
  52.         uchar j=0;
  53.         uchar k=0;
  54.         uint humi,gq;
  55.         P0=0;
  56.         CS_12864=0;
  57.         initial_lcd();        
  58.         clear_screen();
  59.         display_text("温度湿",0,0)        ;
  60.         display_text("湿度湿",3,0);
  61.         display_text("光照湿",6,0);
  62. }
复制代码
足下留步这是液晶的资料链接http://www.jlxlcd.cn/UpFile/201212895822.pdf

回复

使用道具 举报

ID:67992 发表于 2014-11-20 20:51 | 显示全部楼层
我没你这型号的12864.控制芯片不同,行列地址定义不一样。其实和LED点阵差不多。字库好象汉字为16*16,字母和数字8*8.横为行,竖为列。行64,列128.屏有分左右屏,上下屏,你这好象没分。你这屏分上下分为8块,即8页。每页为8*128.地址的设定决定了输入的位置,一个点的位置由行列地址共同决定。而输入地址并不是简单的如行0列0,它有自己的规定,说得好乱。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:67992 发表于 2014-11-20 22:41 | 显示全部楼层
本帖最后由 dgahz 于 2014-11-20 22:48 编辑

lcd_address(uint page,uint column)                       //这里决定输入点位置,共8页,每页8行,page范围0-7;列column范围0-127;
{                                                                           页(或行)决定了上下位置,列决定了左右位置。


        transfer_command_lcd(0xb0+page);                                          /*设置页地址*/  0xb0为规定的0页地址
        transfer_command_lcd(0x10+(column>>4&0x0f));                 /*设置列地址的高4位*/  column>>4&0x0f取列地址高4位,为和格式规定的
                                                                                                                 0x10组合,需右移4位变成低4位,原因0x10已占高4位



          transfer_command_lcd(column&0x0f);                                            /*设置列地址的低4位*/     取 列地址低4位  
}

                                                                                                               /*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
void display_graphic_16x16(uint page,uint column,uchar *dp)
{
        uint i,j;
        CS_12864=0;                                                                                        //片选选中芯片工作
        for(j=0;j<2;j++)j                                                                                  //因为是要生成16*16,所以占2页16列,每页16列循环2次,注:每页8行
        {
                lcd_address(page+j,column);                                                    //设置显示位置命令
                for (i=0;i<16;i++)                                                                         //16列
                {        
                        transfer_data_lcd(*dp);                                                      //每次写8位数据                /*写数据到LCD,每写完一个8位的数据后列地址自                                                                                                                       动加1*/
                        dp++;                                                                                   //写完数据列地址自加,页(行)不会自加,所以前面要加page+j这一条,                                                                                                                          而column不用加
                }                                                                                                  //dp++必需有,它不会自加
        }
        CS_12864=1;                                                                                     //停芯片
}

/*全屏清屏*/
void clear_screen()
{
        unsigned char i,j;
        CS_12864=0;
        
        for(i=0;i<9;i++)                                                                                          //为什么是9页,猜可能页地址储存器多出一页,清的是储存器
        {
                transfer_command_lcd(0xb0+i);
                transfer_command_lcd(0x10);
                transfer_command_lcd(0x00);
                for(j=0;j<132;j++)                                                                                 //列地址存储器说明书上是83H  即0-131
                {
                        transfer_data_lcd(0x00);                                                                //各点写入0
                }
        }
        CS_12864=1;
}



void display_text(uchar *s,page,column)                                                                  //定点输入16*16
{
        uchar a;
        for(a=0;s[a]!=0;a+=2)                                                                                         //选偶数,a*8刚好为0,16,32,为16倍数,16为一个字占位                                                                                                                                               置。a/2自己分析
        {
                display_graphic_16x16(page,column+a*8,tep[a/2+page]);                             //调用前面显示16*16函数,写完一个字,向右挪一个字位置,
        }                                                                                                                                 //即列地址加16,而数据加1递增
}
void main()
{
        uchar i=0;
        uchar j=0;
        uchar k=0;
        uint humi,gq;
        P0=0;
        CS_12864=0;
        initial_lcd();        
        clear_screen();
        display_text("温度湿",0,0)        ;
        display_text("湿度湿",3,0);
        display_text("光照湿",6,0);
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

ID:51088 发表于 2014-11-20 23:15 来自手机 | 显示全部楼层
楼上老大的解释太给力了。非常详细非常感谢,我先好好消化一下。
回复

使用道具 举报

ID:67818 发表于 2014-11-21 23:51 | 显示全部楼层
嗯谢谢啦
回复

使用道具 举报

ID:220665 发表于 2017-7-18 22:07 | 显示全部楼层
dgahz 发表于 2014-11-20 22:41
lcd_address(uint page,uint column)                       //这里决定输入点位置,共8页,每页8行,page ...

你好,请教下。调用显示16X16的函数的时候,里面的数学运算看不懂啊~能不能解释下
回复

使用道具 举报

ID:220665 发表于 2017-7-18 22:19 | 显示全部楼层
dgahz 发表于 2014-11-20 22:41
lcd_address(uint page,uint column)                       //这里决定输入点位置,共8页,每页8行,page ...

还有那个a是用来干嘛的呢
回复

使用道具 举报

ID:265426 发表于 2018-2-5 19:15 | 显示全部楼层
菜鸟请教 为什么可以直接写汉字?       display_text("温度湿",0,0)        ;
                                                     display_text("湿度湿",3,0);
                                                     display_text("光照湿",6,0);
回复

使用道具 举报

ID:461428 发表于 2019-1-14 11:28 | 显示全部楼层
dgahz 发表于 2014-11-20 22:41
lcd_address(uint page,uint column)                       //这里决定输入点位置,共8页,每页8行,page ...

transfer_command_lcd(0x10+(column>>4&0x0f));                 /*设置列地址的高4位*/  column>>4&0x0f取列地址高4位,为和格式规定的
这句是否可以直接写成0xf0&column.也是取高四位么?
回复

使用道具 举报

ID:409988 发表于 2019-4-8 18:09 | 显示全部楼层
qihuaman 发表于 2018-2-5 19:15
菜鸟请教 为什么可以直接写汉字?       display_text("温度湿",0,0)        ;
                          ...

12864有自带字库
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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