找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2354|回复: 5
打印 上一主题 下一主题
收起左侧

关于12864画点函数的问题(求教)

[复制链接]
跳转到指定楼层
楼主
ID:184267 发表于 2017-7-19 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个常见的12864画点函数
我完全看不懂switch那部分啊,为什么要左移动7减Tier_bit。
哪位大佬可以给我讲讲
  1. void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
  2. {
  3.     unsigned char Row , Tier , Tier_bit    ;
  4.     unsigned char ReadOldH, ReadOldL ;
  5.         Tier = X >> 4 ;   
  6.     Tier_bit = X & 0x0f ;
  7.     if( Y < 32 )
  8.     {
  9.         Row = Y ;
  10.     }
  11.     else
  12.     {
  13.         Row = Y - 32 ;
  14.         Tier += 8 ;
  15.     }
  16.         wr_cmd(Row + 0x80);                //写入行坐标
  17.         wr_cmd(Tier + 0x80);        //写入列坐标
  18.         rd_dat();
  19.     ReadOldH = rd_dat() ;         //读出原始数据
  20.     ReadOldL = rd_dat() ;
  21.         wr_cmd(Row + 0x80);
  22.         wr_cmd(Tier + 0x80);
  23.     if( Tier_bit < 8 )
  24.     {
  25.         switch( Color)
  26.         {
  27.             case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ;        //不显示
  28.             case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;                //显示
  29.             case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit ))    ; break ;   //翻转
  30.             default : break ;   
  31.         }
  32.                 wr_dat(ReadOldH);  //写入新数据
  33.                 wr_dat(ReadOldL);
  34.     }
  35.     else
  36.     {
  37.         switch(Color)
  38.         {
  39.             case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;
  40.             case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit ))    ; break ;
  41.             case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
  42.             default : break ;
  43.         }
  44.                 wr_dat(ReadOldH);
  45.                 wr_dat(ReadOldL);
  46.     }
  47. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:184267 发表于 2017-8-9 21:51 | 只看该作者
这个问题我自己已经解决了。感觉现在没有任何生气,提问题没有一个回复,伤心

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:184267 发表于 2017-8-10 16:38 | 只看该作者
感谢管理员的回复,我现在来对自己提出的问题作出解答:
我当初不明白这句话的意思
case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;                //显示

其实是样的,12864每行有128个像素点,能够显示16个字节,即每个字节占8个像素点
假设我要第2个像素点亮,Tier_bit就会为1(因为第一位为0,故第二位为1),代入上面这句话,就会有0x01左移6位(由0000 0001变成0100 0000)
1当“或”上ReadOldH(这个为原来8位的情况),就会在原来的基础上点亮第二个像素点
2当“与”上ReadOldH,就会只点亮第二个像素点,而其他7个点置0不亮

以上就是我的解答,如有错误或者不足,请大家指正

评分

参与人数 2黑币 +115 收起 理由
taoran + 15 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

地板
ID:98618 发表于 2017-8-11 00:47 | 只看该作者
谢谢楼主的无私分享,能帮到很多人。
回复

使用道具 举报

5#
ID:83690 发表于 2018-5-1 06:43 | 只看该作者
楼主你好,请问我使用该函数时会直接造成清屏是什么原因?
回复

使用道具 举报

6#
ID:583647 发表于 2019-7-14 10:11 | 只看该作者
本帖最后由 日冕星 于 2019-7-14 11:24 编辑
MHNMHN 发表于 2017-8-10 16:38
感谢管理员的回复,我现在来对自己提出的问题作出解答:
我当初不明白这句话的意思
case 1 : ReadOldH |= ...

对楼主的解释做点补充:
3.当其取反后“与”上ReadOldH,由0100 0000变为1011 1111,会在原来的基础上熄灭第二个像素点(case 0);
4.当“异或”上ReadOldH,会在原来的基础上使第二个像素点状态反转(case 2);
以上是Tier_bit<8(每行16个字节分为8个区域,每个区域的高字节部分)时的情况;至于Tier_bit>=8时,情况类似,(15-Tier_bit)的目的是使移位控制在0~7范围内。
另外值得注意的是,传入的参数x指水平像素点坐标(0~127),y指垂直像素点坐标(0~63)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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