12864 液晶画点和画任意两点间直线原理、算法及程序原码 12864 液晶画点和画任意直线的原理和算法 程序原码经验证可行 12864 实际上是 256x64 二维显示空间,整个液晶屏分上下两个半屏。整个屏一共有 256 列,64 行。可以把它分成 16 大列,每一大列包含 16 列。图形 RAM 的起始址址为 0x80,设置读或写的地址时,要先写 Y 坐标,再写 X 坐标。要使用画图功能,就要设置扩允指令集。 画点原理:先确定坐标->读出数据->修改数据->数据写回原处。 程序原码: //画点函数 void Draw_Point(uchar x,uchar y,uchar color) { uchar row,tier,row_bit; uchar ReadOldH,ReadOldL; tier=x>>4; //把 256 列分成 16 大列,每大列包含 16 列 row_bit=x&0x0f; //计算所给坐标在某一大列中的哪一列 if(y<32) //分上下半屏显示 row=y; //上半屏 else { row=y-32; //下半屏 tier+=8; } WriteCommand(0x34); //8Bit 扩充指令集,即使是 36H 也要写两次 WriteCommand(0x36); //绘图 ON,基本指令集里面 36H 不能开绘图 WriteCommand(0x80+row); // 行位置 WriteCommand(0x80+tier); // 列位置 ReadData(); ReadOldH=ReadData(); //某大列的前8 列数据,低位在前,高位在后 ReadOldL=ReadData(); //某大列的后8 列数据 if( row_bit < 8 ) //修改读出的数据 { switch( color) { case 0 : ReadOldH &=( ~( 0x01 << ( 7 - row_bit ))) ; break ; case 1 : ReadOldH |= ( 0x01 << ( 7 - row_bit )) ; break ; case 2 : ReadOldH ^= ( 0x01 << ( 7 - row_bit )) ; break ; default : break ; } } else { switch(color) { case 0 : ReadOldL &= (~( 0x01 << ( 15 - row_bit ))) ; break ; case 1 : ReadOldL |= ( 0x01 << ( 15 - row_bit )) ; break ; case 2 : ReadOldL ^= ( 0x01 << ( 15 - row_bit )) ; break ; default : break ; } } WriteCommand(0x80+row); // 行位置 WriteCommand(0x80+tier); // 列位置 WriteData( ReadOldH ) ; //把修改后的数据写回原地址 WriteData( ReadOldL ) ; } 画任意两点间直线的原理和算法:采用Bresenham 画线算法。 设线段方程:ax+by+c=0(x1