12864绘图时,图像周围有杂点,是不是绘图有特殊的设置?

2020-02-05 08:44发布

本帖最后由 paradisespace 于 2012-5-29 10:03 编辑

只显示字符很正常,添加绘图后就出现很多杂点。用的是st7820控制器的液晶显示。
20120528_002.jpg (662.73 KB, 下载次数: 0) 下载附件 2012-5-28 12:08 上传

程序是用模块写的 就直接上传文件了吧,贴出来太长了。
代码:
code.zip (129.77 KB, 下载次数: 34) 2012-5-29 10:02 上传 点击文件名下载附件


我把相关代码贴上来。大神帮我看看吧。什么时候需要清GDRAM,12864的绘图让人纠结。。。
  1. void main()
  2. {
  3.         
  4.         /********************DS1302初始值设置************************/
  5.         DS1302_Init();        
  6.         DS1302_Set_RTC();                                //设置时钟初值                                
  7.         /*************************定时器*****************************/
  8.         Init_Timer0();                                        //Timer0初始化                                
  9.         /***********************液晶初始化***************************/
  10.         Display_Init();
  11.         Display_Clear();        //清除屏幕                                                                                                               
  12.         
  13. //        interface_clock();

  14.         while(1)
  15.         {
  16.                 if(Read_RTC_Flag==1)                        //1S定时到
  17.                  {
  18.                         Read_RTC_Flag=0;                //清空1S定时到标志
  19.                  //        interface_two();                //使用界面2时需打开interface_clock
  20.                         interface_three();                                 
  21.                 }         
  22.         }               
  23. }


  24. void interface_clock()
  25. {

  26.         Display_Clear();
  27.                 /***********************绘制模拟时钟*************************/
  28.         Clean_12864_GDRAM();                                                        //填充GDRAM
  29.         GUI_Circle(96,32,31,1);                                                        //画圆
  30.         GUI_Point(96,32,1);                                                                //画圆心
  31.         //画刻度        
  32. //        GUI_RLine(96,1,4,1);                                                         //画垂直线

  33.         GUI_Line(112,5,110,8,1);
  34.         GUI_Line(123,17,120,18,1);
  35. //        GUI_HLine(123,127,32,1);                                                //画水平线        
  36.         GUI_Line(123,48,120,46,1);
  37.         GUI_Line(111,59,110,56,1);
  38. //        GUI_RLine(96,59,63,1);                                                         //画垂直线
  39.         GUI_Line(80,59,82,56,1);
  40.         GUI_Line(69,47,72,46,1);
  41. //        GUI_HLine(65,69,32,1);                                                        //画水平线        
  42.         GUI_Line(69,16,72,18,1);
  43.         GUI_Line(81,5,82,8,1);
  44.         //显示刻度3,6,9,12
  45.         GUI_Put_Area(94,3,(unsigned char *)NUM5x5_12,5,5,0);//显示12
  46.         GUI_Put_Area(95,55,(unsigned char *)NUM3x5_6,3,5,0);//显示6
  47.         GUI_Put_Area(68,30,(unsigned char *)NUM3x5_9,3,5,0);//显示9
  48.         GUI_Put_Area(122,30,(unsigned char *)NUM3x5_3,3,5,0);//显示3        
  49. }

  50. /*需要绘图显示的:时、分、秒--------------------------------------------------*/
  51. void displaytime(void)
  52. {
  53.         
  54. /*往液晶屏填写 小时 数据-----------------------------------------*/
  55. //        hour = read_clock(0x85);                                         //读取DS1302的 时
  56.         Write1632GDRAM(1,2,num1632[hour/10]);
  57.         Write1632GDRAM(2,2,num1632[hour%10]);
  58.         Write1632GDRAM(3,2,num1632[10]);        //时钟分隔符“:”

  59. /*往液晶屏填写 分钟 数据-----------------------------------------*/
  60. //        min = read_clock(0x83);                 //读取DS1302的 分                                
  61.         Write1632GDRAM(4,2,num1632[minute/10]);
  62.         Write1632GDRAM(5,2,num1632[minute%10]);
  63.         Write1632GDRAM(6,2,num1632[10]);        //时钟分隔符“:”

  64. /*往液晶屏填写 秒钟 数据-----------------------------------------*/
  65. //        sec= read_clock(0x81);                  //读取DS1302的 秒
  66.         Write1632GDRAM(7,2,num1632[second/10]);
  67.         Write1632GDRAM(8,2,num1632[second%10]);        
  68. }

  69. /**************************************************************************************
  70. //函数功能:显示16X32图形,适用于st7920型液晶
  71. //形式参数:uchar x,uchar y,uchar *bmp
  72. //行参说明:横坐标X列,纵坐标Y行,要显示的图形BMP
  73. //************************************************************************************/           
  74. void Write1632GDRAM(unsigned char x,unsigned char y,unsigned char *bmp)        
  75. {
  76.         unsigned char i,j,basex,basey;
  77.         switch(y)         //由y纵坐标定是上半屏还是下半屏
  78.         {
  79.           case 1: basex=0x80; break;  //上半屏
  80.           case 2: basex=0x80; break;  //先上半屏,下面再下半屏。
  81.           case 3: basex=0x88; break;  //下半屏
  82.           default:   return;   //别的则返回
  83.         }
  84.         basey=basex+x-1;
  85.         LcdWcom(0x36);  
  86.         if(y==1||y==3)        //如为第一第三行,则直接是在同一半屏,直接绘完32行点阵数据。
  87.         {
  88.                   for(i=0;i<32;i++)         //写入32行点阵
  89.                   {                                                                                                               
  90.                             LcdWcom(0x80+i);  //先写入垂直位址,选上下32行的哪一行,不管上下半屏,首行都为0X80
  91.                             LcdWcom(basey);     //再写入水平位址(选上下半屏)
  92.                             for(j=0;j<2;j++)           //2个8位元的数据,即16BIT宽度
  93.                                     LcdWdata(*bmp++);   
  94.                   }         
  95.         }
  96.         if(y==2)  //从第二行开始则画图将上下半屏都有,所以先画完上半屏16行,再画下半屏16行。
  97.         {                                       
  98.                   for(i=0;i<16;i++)         //写入上半屏16行点阵
  99.                   {                                                                                                               
  100.                             LcdWcom(0x90+i);  //先写入垂直位址,选上下32行的哪一行,不管上下半屏,首行都为0X80,第二行为0X90。
  101.                             LcdWcom(basey);    //(选上半屏)再写入水平位址
  102.                             for(j=0;j<2;j++)           //2个8位元的数据,即16BIT宽度
  103.                                     LcdWdata(*bmp++);   
  104.                   }
  105.                   for(i=0;i<16;i++)         //写入下半屏16行点阵
  106.                   {                                                                                                               
  107.                             LcdWcom(0x80+i);  //先写入垂直位址,选上下32行的哪一行,不管上下半屏,首行都为0X80
  108.                             LcdWcom(basey+8);   //(选下半屏)再写入水平位址
  109.                             for(j=0;j<2;j++)           //2个8位元的数据,即16BIT宽度
  110.                                     LcdWdata(*bmp++);   
  111.                   }         
  112.         }
  113.         LcdWcom(0x36);  //写完数据,开图片显示     
  114. }

  115. /**************************************************************************************
  116. //函数名称:Clean_12864_GDRAM(void)                                                
  117. //函数功能:清屏函数
  118. //使用说明:GDRAM填满0
  119. //************************************************************************************/
  120. void Clean_12864_GDRAM(void)
  121. {
  122.     unsigned char x,y;
  123.     LcdWcom(0x36);
  124.     init_12864_GDRAM();                //设置扩展指令集,按手册说明,仅设置了绘图位,
  125.      LcdWcom(0x36);        //需要两次,本次设置扩展指令集。
  126.     for (y=0;y<32;y++)
  127.     {
  128.          LcdWcom(0x80+y);  //设置y=1000+00xx,y+1则往下一行
  129.          LcdWcom(0x80);        //设置x=1000 0000
  130.         for (x=0;x<16;x++)
  131.         {
  132.              LcdWdata(0x00);   //高字节数据
  133.              LcdWdata(0x00);        //低字节数据
  134.         }
  135.     }
  136. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
36条回答
paradisespace
2020-02-08 05:09
BDXing6 发表于 2012-5-29 09:43
我不是要你的电路图。这样说吧,如果你是用连接线连接起来的,这些线又比较长的话,试着把线缩短些,一般不 ...

没加忙判断,线长上没有问题,液晶是直接插在板子上的排针接口上的。昨天加过忙判断,花屏更严重,感谢你们这么耐心的为我解答!!

一周热门 更多>