STC12C5A60S2在12864上画圆

2019-03-24 17:51发布

12864 12864
之前在90C52上画圆的程序放到STC12C5A60S2上画圆,就多出了好多点,求教各位大神什么原因??在线等


//***********(给定坐标并打点的)任意位置打点函数
void lcd_set_dot(uchar x,uchar y)
{
uchar x_byte,x_bit;//确定在坐标的那一字节哪一位
uchar y_ping , y_bit;//确定在坐标的哪一屏哪一行
uchar tmph , tmpl;//定义两个临时变量,用于存放读出来的数据
write_com(EXTEND_SET);//扩展指令集
write_com(DRAW_OFF);//绘图显示关闭
x_byte = x / 16;//算出在哪一字节,注意一个地址是16位的
x_bit = x % 16;//& 0x0f;//算出在哪一位
y_ping = y / 32;//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏
y_bit = y % 32;//& 0x1f;//确定在第几行
write_com(0X80 + y_bit);//先写垂直地址(最高位必须)
write_com(0x80 + x_byte + 8 * y_ping);//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏
read_dat();//预读取数据
tmph = read_dat();//读取当前显示高8位数据
tmpl = read_dat();//读取当前显示低8位数据
delay(1);
write_com(0x80 + y_bit);//读操作会改变AC,所以重新设置一下
write_com(0x80 + x_byte + 8 * y_ping);
delay(1);
if(x_bit < 8)
{
  write_dat(tmph | (0x01 << (7 - x_bit)));//写高字节,因为坐标是从左向右的,GDRAM高位在昨,低位在右
  write_dat(tmpl);//原低位数据送回
}
else
{
  write_dat(tmph);//原高位数据送回
  write_dat(tmpl | (0x01 << (15 - x_bit)));
}
write_com(DRAW_ON); //打开绘图显示
write_com(BASIC_SET);//回到基本指令集
}


void gui_circle(uchar x0 , uchar y0 , uchar r)
{
char a , b;
char di;
if(r > 31 || r == 0)//圆大于液晶屏或者没半径则返回
  return;
a = 0;
b = r;
di = 3 - 2 * r;//判断下个点位置的标志
while(a <= b)
{
  lcd_set_dot( x0 - b , y0 - a);//3
  lcd_set_dot( x0 + b , y0 - a); //0
  lcd_set_dot( x0 - a , y0 + b); //1
  lcd_set_dot( x0 - b , y0 - a); //7
  lcd_set_dot( x0 - a , y0 - b); //2
  lcd_set_dot( x0 + b , y0 + a); //4
  lcd_set_dot( x0 + a , y0 - b); //5
  lcd_set_dot( x0 + a , y0 + b); //6
  lcd_set_dot( x0 - b , y0 + a);
  a ++;
  //***使用bresenham算法画圆*******
  if(di < 0)
   di += 4 * a + 6;
  else
  {
   di += 10 + 4 * (a - b);
   b --;
  }
  lcd_set_dot( x0 + a , y0 + b);
}
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。