打印
[AVR单片机]

st7920控制的12864打点(注释很详细)

[复制链接]
5686|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangwo|  楼主 | 2009-11-21 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以在任意位置打点了,在这里谢谢那些好心的人,把易于出现问题的地方给大家说明下,一定要仔细阅读DATESHEET,方便后人。
      1、打点位置的定位
      2、读取当前显示的数据
      3、或和移位,即重新写人的新数据
程序如下:
void GUI_Point(uchar x,uchar y,uchar flag)
{     
  uchar x_Dyte,x_byte;               //定义列地址的字节位,及在字节中的哪1位
  uchar y_Dyte,y_byte;               //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
  Write_command(0x36);               //绘图模式命令
  /***X,Y坐标互换,即普通的X,Y坐标***/
  x_Dyte=y/16;                     //计算在16个字节中的哪一个
  x_byte=y&0x0f;                   //计算在该字节中的哪一位
  y_Dyte=x/32;                     //0为上半屏,1为下半屏
  y_byte=x&0x1f;                   //计算在0~31当中的哪一行
  
  Write_command(0x80+y_byte);           //设定行地址(y坐标)
  Write_command(0x80+x_Dyte+8*y_Dyte);     //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
              
  Read_data();
  GDRAM_hbit=Read_data();             //读取当前显示高8位数据
  GDRAM_lbit=Read_data();             //读取当前显示低8位数据
  delay_us(5);
  
  if(flag==1)
  {
  Write_command(0x80+y_byte);           //设定行地址(y坐标)
  Write_command(0x80+x_Dyte+8*y_Dyte);     //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
  delay_us(5);
    if(x_byte<8)                       //判断其在高8位,还是在低8位
  {
    Write_data(GDRAM_hbit|(0X01<<(7-x_byte)));   //显示GDRAM区高8位数据
    Write_data(GDRAM_lbit);               //显示GDRAM区低8位数据
    }
    else
    {
    Write_data(GDRAM_hbit);
    Write_data(GDRAM_lbit|(0x01<<(15-x_byte)));
    }
  }
  else
  {
  Write_data(0x00));                   //清除GDRAM区高8位数据
  Write_data(0x00));                   //清除GDRAM区低8位数据
  }   
}


/**********读取当前地址的LCD显示数据**********/
uchar Read_data()
{
uchar shuju;
LCD_DATA_set_in;                     //端口PB设置为输入
LCD_DATA_PORT=0xff;
SET_DI;                           // D/I=1,代表数据
SET_RW;                           // R/W=1.读取
delay_us(10);
SET_E;
delay_us(100);
shuju=PINB;                   //读取当前显示的数据
CLR_E;
return(shuju);   
}

相关帖子

沙发
Karlshen| | 2009-11-21 22:55 | 只看该作者
踩踩,:)

使用特权

评论回复
板凳
wangwo|  楼主 | 2009-11-23 19:03 | 只看该作者
看帖给分!:P

使用特权

评论回复
地板
wangwo|  楼主 | 2009-12-17 21:20 | 只看该作者
顶起!

使用特权

评论回复
5
huamunv| | 2009-12-18 22:53 | 只看该作者
注释果然很详细

使用特权

评论回复
6
god_like| | 2009-12-19 00:50 | 只看该作者
写程序的风格我喜欢

使用特权

评论回复
7
linhai2009| | 2009-12-19 10:05 | 只看该作者
注释写的不错,写程序就要这样

使用特权

评论回复
8
hf5542| | 2011-2-27 14:39 | 只看该作者
PINB这个变量是什么  麻烦群主完整把程序贴出来

使用特权

评论回复
9
黄jiajia| | 2011-3-6 20:21 | 只看该作者
:)

使用特权

评论回复
10
疯子8972| | 2011-3-6 21:47 | 只看该作者
这样写也是可以的
但是更建议,像这样用命令来控制的液晶模块别这么用
用全内存缓冲更合理,因为屏幕不大,内存用得不多
计算图形运算全在内存中进行,在必要的时候对必要的区域进行刷新
这样调用液晶的命令次数减少,运行速度可以提高
如果驱动大的液晶可以使用动态内存块

使用特权

评论回复
11
三号巧妹| | 2013-7-19 22:24 | 只看该作者
大神,我想问下这个具体是怎么算的啊?在此谢过大神~~~
x_Dyte=y/16;                     //计算在16个字节中的哪一个
x_byte=y&0x0f;                   //计算在该字节中的哪一位

使用特权

评论回复
12
aifang| | 2013-7-24 21:53 | 只看该作者
给看看我的画图程序那里出错了呗!
先谢谢了。




void LCD12864_Show_Picture(uchar *Picture){
    uchar i,j;
    LCD12864_Write_Command(0x34);                 //RE = 1,扩充指令集动作;G = 0,关闭绘图模式
    for(i = 0;i < 32;i++){                        //写上半屏
        LCD12864_Write_Command(0x80 + i);         //设置垂直方向地址
        LCD12864_Write_Command(0x80);             //设置水平方向地址
        for(j = 0;j < 16;j++)
            LCD12864_Write_Data(*(Picture++));   //连续写入一行数据,偶数为高位数据,奇数为低位数据
    }
    for(i = 0;i < 32;i++){                        //写下半屏
        LCD12864_Write_Command(0x80 + i);         //设置垂直方向地址
        LCD12864_Write_Command(0x88);             //设置水平方向地址
        for(j = 0;j < 16;j++)
            LCD12864_Write_Data(*(Picture++));//连续写入一行数据,偶数为高位数据,奇数为低位数据
    }
    LCD12864_Write_Command(0x36);                //RE = 1,扩充指令集动作;G = 1,打开绘图模式
    LCD12864_Write_Command(0x30);                //RE = 0,基本指令集动作;G = 0,关闭绘图模式
}

使用特权

评论回复
13
2318809119| | 2013-8-31 07:58 | 只看该作者
你如果很复杂的以点描绘的图形,显示的时候会不会刷新的太慢,显示速度感觉很慢????

使用特权

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

本版积分规则

99

主题

806

帖子

2

粉丝