找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5444|回复: 0
收起左侧

玩转12864,划线,画圆,汉字,图片程序

[复制链接]
ID:79544 发表于 2017-3-1 10:29 | 显示全部楼层 |阅读模式
12864并行显示
  1. /*********************************************************
  2.         功  能:12864并行驱动画任意线段和园以及图片.汉字程序
  3.         单片机:STC12C5A60S2
  4.         晶  振:11.0592M
  5.         时  间:2017-3-1
  6.         作  者:苏义江修改整理(感谢前辈的辛苦)
  7.         注  释:在多功能试验板成功显示
  8. *****************************************************/
  9. #include<stc12c5a60s2.h>
  10. #include<stdlib.h>
  11. #include<math.h>
  12. #define uint unsigned int
  13. #define uchar unsigned char
  14. #define pi 3.1415926
  15. #define LCDDATA P0
  16. sbit RS = P2^7;
  17. sbit RW = P2^6;
  18. sbit EN = P2^5;

  19. uchar code hanz[]= {"玩转12864!"};
  20. uchar code hanz2[]={"苏义江爱好单片机"};
  21. uchar code logo[]= {  
  22. //取模方式:纵向字节倒序
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  24. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  25. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  29. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  35. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  36. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  37. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  43. 0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,0x00,0x00,0x00,
  45. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0xFF,0xC3,
  46. 0xFC,0x00,0x30,0x00,0x06,0x00,0xE0,0x06,0x66,0x19,0x8C,0x31,
  47. 0x00,0x3F,0xFF,0xC3,0xFC,0x00,0x30,0x00,0x06,0x00,0xE0,0x06,
  48. 0x66,0x19,0x8C,0x31, 0x00,0x3F,0xFE,0x01,0xFE,0x02,0x39,0x00,
  49. 0x06,0x00,0xC0,0x0C,0x62,0x19,0x8C,0x31, 0x00,0x3F,0xF8,0x00,
  50. 0xFE,0x07,0x31,0x80,0xFC,0x00,0xC0,0x0C,0x62,0x19,0x8C,0x31,
  51. 0x00,0x3F,0xF0,0x00,0xFE,0x06,0x31,0x80,0x78,0x00,0xC0,0x0C,
  52. 0x66,0x1D,0xDC,0x31, 0x00,0x3F,0xE0,0x01,0xFE,0x06,0x31,0x80,
  53. 0x30,0x00,0xC0,0x0C,0x00,0x19,0xCC,0x30, 0x00,0x3F,0xC0,0x03,
  54. 0xFE,0x07,0x39,0x80,0x38,0x00,0xC0,0x1F,0x00,0x18,0x8C,0x00,
  55. 0x00,0x3F,0xC0,0x03,0xFE,0x07,0x39,0x80,0x38,0x00,0xC0,0x1F,
  56. 0x00,0x18,0x8C,0x00, 0x00,0x3F,0xC0,0x3F,0xFE,0x06,0x31,0x80,
  57. 0x38,0x00,0xC0,0x3D,0x18,0x19,0x8C,0x0C, 0x00,0x3F,0x80,0x7F,
  58. 0xFE,0x06,0x31,0x80,0x38,0x00,0xE0,0x3D,0x18,0x19,0x8C,0x1C,
  59. 0x00,0x3F,0x80,0xFF,0xFE,0x06,0x31,0x80,0x18,0x00,0xE0,0x3D,
  60. 0x18,0x19,0x8C,0x3C, 0x00,0x3F,0x81,0xF3,0xFE,0x07,0x31,0x80,
  61. 0x38,0x00,0xE0,0x3F,0x18,0x19,0xD8,0x0C, 0x00,0x3F,0x81,0xF3,
  62. 0xFE,0x07,0x31,0x80,0x38,0x00,0xE0,0x3F,0x18,0x19,0xD8,0x0C,
  63. 0x00,0x3F,0x03,0xC1,0xFE,0x00,0x30,0x00,0x30,0x00,0xE0,0x3F,
  64. 0x18,0x18,0x00,0x0C, 0x00,0x3F,0x03,0xC0,0xFE,0x00,0x30,0x01,
  65. 0xF0,0x00,0xE0,0x35,0x18,0x1C,0x00,0x0C, 0x00,0x3F,0x03,0x80,
  66. 0xFE,0x00,0x3C,0x80,0x00,0x00,0xE0,0x0C,0x18,0x0C,0x00,0x18,
  67. 0x00,0x3F,0x03,0x80,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  68. 0x00,0x00,0x00,0x00, 0x00,0x3F,0x03,0x80,0xFE,0x00,0x00,0x00,
  69. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0x03,0xC0,
  70. 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  71. 0x00,0x3F,0x01,0xC1,0xFE,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  72. 0xFF,0xFF,0xFF,0xFF, 0x00,0x3F,0x81,0xFF,0xFE,0x00,0x00,0x00,
  73. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0x80,0xFF,
  74. 0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  75. 0x00,0x3F,0x80,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  76. 0x00,0x00,0x00,0x00, 0x00,0x3F,0x80,0x7F,0xFE,0x00,0x00,0x00,
  77. 0x00,0x00,0x08,0x08,0x00,0x00,0x00,0x00, 0x00,0x3F,0xC0,0x0F,
  78. 0xFE,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
  79. 0x00,0x3F,0xE0,0x01,0xFE,0x01,0x01,0x80,0x00,0x60,0x10,0xD0,
  80. 0x00,0x00,0x00,0x00, 0x00,0x3F,0xF0,0x01,0xFE,0x04,0x44,0x4C,
  81. 0x89,0xB1,0x93,0x70,0x00,0x00,0x00,0x00, 0x00,0x3F,0xF8,0x00,
  82. 0xFE,0x0C,0x4C,0x4D,0xD3,0x1B,0x12,0x30,0x78,0xE3,0xF8,0x3C,
  83. 0x00,0x3F,0xF8,0x00,0xFE,0x0C,0x4C,0x4D,0xD3,0x1B,0x12,0x30,
  84. 0x78,0xE3,0xF8,0x3C, 0x00,0x3F,0xFC,0x01,0xFE,0x0F,0xCF,0xC5,
  85. 0xF2,0x12,0x24,0x30,0x81,0x16,0x48,0x60, 0x00,0x3F,0xFF,0x01,
  86. 0xFE,0x08,0x08,0x06,0x62,0x12,0x24,0x20,0x82,0x14,0x88,0x40,
  87. 0x00,0x3F,0xFF,0xFF,0xFE,0x08,0x08,0x06,0x63,0x26,0x26,0x60,
  88. 0x83,0x24,0x88,0x40, 0x00,0x0F,0xFF,0xFF,0xFE,0x07,0x07,0x04,
  89. 0x41,0xC4,0x63,0xE4,0x71,0xC0,0x92,0x39, 0x00,0x0F,0xFF,0xFF,
  90. 0xFE,0x07,0x07,0x04,0x41,0xC4,0x63,0xE4,0x71,0xC0,0x92,0x39,
  91. 0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  94. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  95. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  96. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  97. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  98. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  99. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  100. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  101. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  102. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  103. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  104. 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  105. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
  106. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  107. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  108. 0x00,0x00,0x00,0x00   };           //图像数据


  109. void delay(uchar i)
  110. {
  111.         for(;i>0;i--);
  112. }
  113. void delayms( uint i)
  114. {
  115.         uint j;       
  116.         for(;i>0;i--)       
  117.         { for(j=1000;j>0;j--);}
  118. }
  119. //写指令
  120. void writecmd(uchar cmd)//写指令
  121. {

  122.         LCDDATA=0x00;       
  123.         RW=0;       
  124.         RS=0;       
  125.         EN=0;       
  126.         LCDDATA=cmd;       
  127.         delay(2);       
  128.         EN=1;       
  129.         delay(20);       
  130.         EN=0;
  131.         delay(20);
  132. }
  133. //写数据
  134. void writedate(uchar date)
  135. {
  136. //while((readstatus() &0x80 )!=0x00);
  137.         LCDDATA=0x00;       
  138.         RW=0;       
  139.         RS=1;       
  140.         EN=0;       
  141.         LCDDATA=date;       
  142.         delay(2);       
  143.         EN=1;       
  144.         delay(20);       
  145.         EN=0;
  146.         delay(20);
  147. }
  148. //读12864内部数据
  149. uchar readdate()
  150. {
  151.         uchar i;
  152. //while((readstatus() &0x80 )!=0x00);
  153.        
  154.         RW=1;       
  155.         RS=1;       
  156.         EN=0;
  157.         delay(10);
  158.         EN=1;
  159.         LCDDATA=0xff;
  160.         delay(10);
  161.         EN=0;       
  162.                
  163.         EN=1;
  164.         LCDDATA=0;               
  165.         delay(10);       
  166.                
  167.         delay(10);       
  168.         EN=0;
  169.         i=LCDDATA;       
  170.         return i;
  171. }
  172. /*******************************************

  173. 函数名称:LCD_init

  174. 功 能: 初始化LCD

  175. 参 数:无

  176. 返回值 :无

  177. ********************************************/

  178. void LCD_init()

  179. {
  180.         delayms(30);
  181.         writecmd(0x30);
  182.        
  183.         delay(20);
  184.        
  185.         writecmd(0x30);
  186.         delay(20);
  187.        
  188.         writecmd(0x0c);
  189.        
  190.         delay(20);
  191.        
  192.         writecmd(0x01);
  193.        
  194.         delay(20);
  195.        
  196.         writecmd(0x06);
  197.        
  198.         delay(20);

  199. }
  200. //功 能:指定地址输入指定个数的字
  201. //addr表示地址 * pt表示数据 num表示数据或汉字个数
  202. void Disp_HZ(uchar addr,const uchar * pt,uchar num)
  203. {
  204.         uchar i;       
  205.         writecmd(addr);       
  206.         for(i = 0;i < (num*2);i++)       
  207.         {       
  208.                 writedate(*(pt++));               
  209.                 delayms(1);       
  210.         }
  211. }
  212. //清内部随机数据
  213. void Clear_GDRAM(void)
  214. {
  215.         uchar x,y,i,j;       
  216.         writecmd(0x34); //打开扩展指令集       
  217.         y=0x80;       
  218.         x=0x80;       
  219.         for(i=0;i<32;i++)       
  220.         {       
  221.                 writecmd(y);       
  222.                 writecmd(x);       
  223.                 for(j=0;j<16;j++)       
  224.                 {       
  225.                         writedate(0x00);
  226.                         delay(30);
  227.                 }       
  228.                 y++;
  229.         }
  230.         y=0x80;       
  231.         x=0x88;
  232.         for(i=0;i<32;i++)       
  233.         {       
  234.                 writecmd(y);               
  235.                 writecmd(x);               
  236.                 for(j=0;j<16;j++)               
  237.                 {               
  238.                         writedate(0x00);
  239.                         delay(30);
  240.                 }       
  241.                 y++;
  242.         }
  243.         writecmd(0x30); //回到基本指令集
  244.        
  245. }
  246. //画图片
  247. void Draw_PM(uchar *ptr)
  248. {
  249.         uint x=0;
  250.         uchar i,j;
  251.         writecmd(0x34);                 //扩展指令动作
  252.         writecmd(0x36);                 //扩展指令动作

  253.         for(i=0;i<32;i++)                   //上半屏显示
  254.         {
  255.                   writecmd(0x80|i);             //列位置
  256.                   writecmd(0x80);               //行位置
  257.                 for(j=0;j<16;j++)                 //256/8=32 byte
  258.                 {                           //列位置每行自动增加
  259.                           writedate(*ptr);
  260.                           ptr++;
  261.                 }
  262.         }

  263.         for(i=0;i<32;i++)                   //下半屏显示
  264.         {
  265.                 writecmd(0x80|i);               //列位置
  266.                 writecmd(0x88);               //行位置
  267.                 for(j=0;j<16;j++)                 //256/8=32 byte
  268.                 {
  269.                           writedate(*ptr);
  270.                           ptr++;
  271.                 }
  272.         }
  273.         writecmd(0x30);

  274. }

  275. /*************************************
  276. 功能描述: 读取绘图RAM中指定坐标的数据
  277. ** 说    明: 参数输入坐标地址,
  278. 读取后从坐标地址参数位返回数据,所以,
  279. 地址参数在输入前须使用
  280. ****************************************
  281. void LCD_Read_dat_I(uchar *xp,uchar *yp)
  282. {
  283. writecmd(*yp);     //写竖坐标(0x80-0x9f)
  284. writecmd(*xp);     //写横坐标(AC地址) 上半屏(0x80-0x87) 下半屏(0x88-0x90)
  285. readdate();            //试读
  286. *xp=readdate();        //读高字节并返回给xp
  287. *yp=readdate();        //读低字节并返回给yp
  288. }
  289. */
  290. /*************************************
  291. //画点 在整个屏幕上画一个点 X 0~127 Y 0~63
  292. 功能描述: 指定坐标点画点
  293. ** 输   入: unsigned char xp,unsigned char yp,bit dat  
  294. X,Y行列坐,dat 1写或0擦除
  295. *******************************************/
  296. /*
  297. void Draw_point(uchar xp,uchar yp,bit dat)
  298. {
  299.     uchar xd,rx,ry;
  300.        
  301.     xd=xp/0x10;               //计算横坐标AC步进
  302.     xp%=0x10;                //计算AC地址位偏移
  303.         xp++;
  304.         writecmd(0x34);
  305.         writecmd(0x36);
  306.     if(yp>31)
  307.     {                               //如果yp大于31选下半屏
  308.         yp-=32;                     //计算yp在下半屏的竖向坐标
  309.         yp+=0x80;                   //地址命名
  310.         xd+=0x88;                  //下半屏起点地址是0x88,地址命名
  311.     }
  312.     else
  313.     {                          //选上半屏
  314.         yp+=0x80;                      //地址命名
  315.         xd+=0x80;                     //上半屏起点地址是0x80,地址命名
  316.     }
  317.     rx=xd;ry=yp;                     //取AC数据函数需要两个参数返回数据,且参数公用地址,所以使用零时变量
  318.     LCD_Read_dat_I(&rx,&ry);          //取当前字节数据
  319.     writecmd(yp);                        //重指定当前y地址
  320.     writecmd(xd);                        //重指定当前x地址
  321.     if(dat)
  322.     {                                   //如果是画点
  323.         if(xp<=8)
  324.         {  //如果当前画点坐标在AC地址数据对应的高字节(取余计算结果与字节移位方向相反)
  325.             writedate(rx|(0x01<<(8-xp)));//读取的高位数据与翻转的指定位进行与操作后写入高位
  326.             writedate(ry);        //读取的低位数据原样写回
  327.   }
  328.   else
  329.         {                             //如果当前画点坐标在AC地址数据对应的低字节(取余计算结果与字节移位方向相反)
  330.             writedate(rx);                   //读取的高位数据原样写回
  331.             writedate(ry|(0x01<<(16-xp)));   //读取的低位数据与指定位进行或操作后写入低位
  332.         }
  333.     }
  334.     else
  335.     {                                   //如果是擦除图像
  336.         if(xp<=8)
  337.         {   //如果当前画点坐标在AC地址数据对应的高字节(取余计算结果与字节移位方向相反)
  338.             writedate(rx&~(0x01<<(8-xp)));//读取的高位数据与翻转的指定位进行与操作后写入高位
  339.             writedate(ry);          //读取的低位数据原样写回
  340.         }
  341.         else
  342.         {    //如果当前画点坐标在AC地址数据对应的低字节(取余计算结果与字节移位方向相反)
  343.             writedate(rx);                    //读取的高位数据原样写回
  344.             writedate(ry&~(0x01<<(16-xp)));   //读取的低位数据与翻转的指定位进行与操作后写入低位
  345.         }
  346.     }
  347.         writecmd(0x30);
  348. }
  349. */

  350. void Draw_point(uchar X,uchar Y,uchar clour)
  351. // X行 Y列 clour为0时画点 为其它清除这个点
  352. {
  353.         uchar x_pos,y_pos,x_bit;       
  354.         uint read_data1,read_data2,dat1,dat2;       
  355.         //计算LCD位置
  356.         writecmd(0x34);
  357.         writecmd(0x36);               
  358.         x_pos=X/16; //取16*16首地址       
  359.         if(Y>31)       
  360.         x_pos+=8; //计算该点所属LCD液晶中X坐标位置,上半屏0-7,下半屏8-15       
  361.         x_bit=X%16; //该点位于所在16bit中的第几位       
  362.         y_pos=Y%32;       
  363. //        writecmd(0x34);       
  364.         writecmd(0x36);
  365.         writecmd(0x80+y_pos);       
  366.         writecmd(0x80+x_pos);       
  367.         readdate(); //此处为什么要中上不知道为什么????       
  368.         read_data1 = readdate(); //高八位!       
  369.         read_data2 = readdate(); //低八位!       
  370.         if(x_bit<8)       
  371.         {       
  372.                 if(clour==0)       
  373.                 {       
  374.                         dat1=read_data1|(1<<(7-x_bit));       
  375.                 }       
  376.                 else       
  377.                 {       
  378.                         dat1=read_data1&~(1<<(7-x_bit));       
  379.                 }       
  380.                 dat2=read_data2;       
  381.         }
  382.         else       
  383.         {       
  384.                 dat1=read_data1;       
  385.                 if(clour==0)       
  386.                 {       
  387.                         dat2=read_data2|(1<<(15-x_bit));       
  388.                 }
  389.        
  390.                 else       
  391.                 {       
  392.                         dat2=read_data2&~(1<<(15-x_bit));       
  393.                 }       
  394.         }

  395.         writecmd(0x36);       
  396.         writecmd(0x80+y_pos);       
  397.         writecmd(0x80+x_pos);       
  398.         writedate(dat1);       
  399.         writedate(dat2);               
  400.         writecmd(0x30);       
  401. }

  402. //画直线X1行起点X2行终点 Y列 clour为0时画点 为其它清除这个点
  403. void Draw_zhi(uchar X1,uchar X2,uchar Y,uchar clour)
  404. {
  405.         uchar i,temp ;
  406.         if(X1>X2) //X轴上,起点大于终点,交换数据
  407.         {
  408.                 temp=X2;
  409.                 X2=X1;
  410.                 X1=temp;
  411.         }
  412.         for(i=X1;i<=X2;i++)
  413.         {
  414.                 Draw_point(i,Y,clour);
  415.         }
  416. }
  417. //画竖线 X行 Y1列起点点 Y2列终点 clour为0时画点 为其它清除这个点
  418. void Draw_shu(uchar X,uchar Y1,uchar Y2,uchar clour)
  419. {
  420.         uchar i ,temp;
  421.         if(Y1>Y2) //X轴上,起点大于终点,交换数据
  422.         {
  423.                 temp=Y2;
  424.                 Y2=Y1;
  425.                 Y1=temp;
  426.         }
  427.         for(i=Y1;i<=Y2;i++)
  428.         {
  429.                 Draw_point(X,i,clour);
  430.         }
  431. }

  432. /*******************************************
  433. 函数名称:Draw_line
  434. 功 能:在整个屏幕上画一条线 任一的角度都可以画线!!!!
  435. 参 数:ptr--指向保存图片位置的指针
  436. 返回值 :无
  437. clour为0时画点 为其它清除这个点
  438. ********************************************/

  439. void Draw_line(uchar x0,uchar y0,uchar x1,uchar y1,uchar clour)
  440. {
  441.         int dx,dy; //定义X.Y轴上增加的变量值
  442.         int sub;
  443.         int temp; //起点、终点大小比较,交换数据时的中间变量
  444.         uchar flag;
  445.         if(x0>x1) //X轴上,起点大于终点,交换数据
  446.         {
  447.                 temp=x1;
  448.                 x1=x0;
  449.                 x0=temp;
  450.                 temp=y1;
  451.                 y1=y0;
  452.                 y0=temp;
  453.         }
  454.         dx=x1-x0; //X轴方向上的增量
  455.         dy=y1-y0; //Y轴方向上的增量
  456.         if(dx==0)
  457.         Draw_shu(x0,y0,y1,clour);
  458.         if(dy==0)
  459.         Draw_zhi(x0,x1,y0,clour);
  460.         if(dy>0)
  461.         flag=1;
  462.         else
  463.         flag=0;
  464.         if((dx!=0)&&(dy!=0))
  465.         {
  466.                 /* 布兰森汉姆(Bresenham)算法画线 */
  467.                 if(flag==1)
  468.                 {
  469.                         if(dx>=dy) //靠近X轴
  470.                         {
  471.                                 sub=2*dy-dx; //计算下个点的位置
  472.                                 while(x0!=x1)
  473.                                 {
  474.                                         Draw_point(x0,y0,clour); //画起点
  475.                                         x0++; // X轴上加1
  476.                                         if(sub>0) // 判断下下个点的位置
  477.                                         {
  478.                                                 y0++; // 为右上相邻点,即(x0+1,y0+1)
  479.                                                 sub+=2*dy-2*dx;
  480.                                         }
  481.                                         else
  482.                                         sub+=2*dy; // 判断下下个点的位置
  483.                                 }
  484.                                 Draw_point(x0,y0,clour);
  485.                         }
  486.                         else
  487.                         {
  488.                                 sub=2*dy-dx; //靠近Y轴
  489.                                 while(y0!=y1)
  490.                                 {
  491.                                         Draw_point(x0,y0,clour); //画起点
  492.                                         y0++;
  493.                                         if(sub>0) //判断下下个点的位置
  494.                                         {
  495.                                                 x0++;
  496.                                                 sub+=2*dx-2*dy;
  497.                                         }
  498.                                         else
  499.                                         sub+=2*dx;
  500.                                 }
  501.                                 Draw_point(x0,y0,clour);
  502.                         }
  503.                 }
  504.                 else
  505.                 {
  506.                         dy=y0-y1;
  507.                         if(dx>=dy) //靠近X轴
  508.                         {
  509.                                 sub=2*dy-dx; //计算下个点的位置
  510.                                 while(x0!=x1)
  511.                                 {
  512.                                         Draw_point(x0,y0,clour); //画起点
  513.                                         x0++; // X轴上加1
  514.                                         if(sub>0) // 判断下下个点的位置
  515.                                         {
  516.                                                 y0--; // 为右上相邻点,即(x0+1,y0+1)
  517.                                                 sub+=2*dy-2*dx;
  518.                                         }
  519.                                         else
  520.                                         sub+=2*dy; // 判断下下个点的位置
  521.                                 }
  522.                                 Draw_point(x0,y0,clour);
  523.                         }
  524.                         else
  525.                         {
  526.                                 sub=2*dx-dy; //靠近Y轴
  527.                                 while(y0!=y1)
  528.                                 {
  529.                                         Draw_point(x0,y0,clour); //画起点
  530.                                         y0--;
  531.                                         if(sub>0) //判断下下个点的位置
  532.                                         {
  533.                                                 x0++;
  534.                                                 sub+=2*dx-2*dy;
  535.                                         }
  536.                                         else
  537.                                         sub+=2*dx;
  538.                                 }
  539.                                 Draw_point(x0,y0,clour);
  540.                         }
  541.                 }
  542.         }
  543. }

  544. /****************************
  545. //画任意线
  546. 功能:任意两点间的直线。根据硬件特点,实现加速。
  547. * 入口参数:x0       直线起点所在行的位置
  548. *         y0       直线起点所在列的位置
  549. *         x1     直线终点所在行的位置
  550. ‘       y1     直线终点所在列的位置
  551. 说明:操作失败原因是指定地址超出缓冲区范围。
  552. ******************************
  553. void GUI_Line8(uchar x0,uchar y0,uchar x1,uchar y1)
  554. {
  555. int temp;
  556. int dx,dy;               //定义起点到终点的横、纵坐标增加值
  557. int s1,s2,status,i;
  558. int Dx,Dy,sub;

  559. dx=x1-x0;
  560. if(dx>=0)                 //X的方向是增加的
  561.   s1=1;
  562. else                     //X的方向是降低的
  563.   s1=-1;     
  564. dy=y1-y0;                 //判断Y的方向是增加还是降到的
  565. if(dy>=0)
  566.   s2=1;
  567. else
  568.   s2=-1;
  569.   
  570. Dx=fabs(x1-x0);             //计算横、纵标志增加值的绝对值
  571. Dy=fabs(y1-y0);
  572. if(Dy>Dx)                 //               
  573.   {                     //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0
  574.   temp=Dx;
  575.   Dx=Dy;
  576.   Dy=temp;
  577.   status=1;
  578.   }
  579. else
  580.   status=0;

  581. //////////判断垂直线和水平线////////////
  582. if(dx==0)                   //横向上没有增量,画一条水平线
  583.   Draw_zhi(x0,y0,y1,1);
  584. if(dy==0)                   //纵向上没有增量,画一条垂直线
  585.   Draw_shu(x0,y0,x1,1);


  586. //////////Bresenham算法画任意两点间的直线//////////
  587.   sub=2*Dy-Dx;                 //第1次判断下个点的位置
  588.   for(i=0;i<Dx;i++)
  589.   {
  590.     Draw_point(x0,y0,1);           //画点
  591.     if(sub>=0)                              
  592.     {
  593.     if(status==1)               //在靠近Y轴区,x值加1
  594.       x0+=s1;
  595.     else                     //在靠近X轴区,y值加1               
  596.       y0+=s2;
  597.     sub-=2*Dx;                 //判断下下个点的位置
  598.     }
  599.     if(status==1)
  600.   y0+=s2;
  601.     else      
  602.     x0+=s1;
  603.     sub+=2*Dy;
  604.         
  605.   }
  606. }
  607. */
  608. /*********************************************************

  609. 画圆算法
  610. x0表示行的地址 y0表示列的地址 r表示圆的半径
  611. ****************************************/

  612. void Draw_yuan(uchar x0,uchar y0,uchar r)

  613. {

  614. int a,b;

  615. int di;

  616. a=0;

  617. b=r; //a=0,与b=r为圆的起始点!!然后往下走!!

  618. di=3-2*r; //判断下个点位置的标志 ??

  619. while(a<=b) //里面执行完了说明八分之一个圆画完啦!

  620. {

  621. Draw_point(x0-b,y0-a,0); //3

  622. Draw_point(x0+b,y0-a,0); //0

  623. Draw_point(x0-a,y0+b,0); //1

  624. Draw_point(x0-b,y0-a,0); //7

  625. Draw_point(x0-a,y0-b,0); //2

  626. Draw_point(x0+b,y0+a,0); //4

  627. Draw_point(x0+a,y0-b,0); //5

  628. Draw_point(x0+a,y0+b,0); //6

  629. Draw_point(x0-b,y0+a,0);

  630. a++;

  631. /***使用Bresenham算法画圆**/

  632. if(di<0)

  633. di +=4*a+6;

  634. else

  635. {

  636. di+=10+4*(a-b);

  637. b--;

  638. }

  639. Draw_point(x0+a,y0+b,0); //可在此处做想法!!!

  640. }

  641. }


  642. void main()
  643. {
  644.         delayms(100);
  645.         LCD_init();
  646.         Clear_GDRAM();//必须清2遍彻底清除RAM内数据
  647.         delayms(50);
  648.         Clear_GDRAM();//必须清2遍彻底清除RAM内数据
  649.         delayms(50);
  650.         writecmd(0x01);//加上清楚命令
  651.         delayms(50);       
  652.         while(1)
  653.         {
  654.                 Draw_zhi(65,126,60,0);//直线
  655.                 Draw_shu(65,124,0,0);//竖线
  656.                 Draw_line(66,0,120,63,0);//画任意线
  657.                 Draw_line(66,0,120,30,0);//画任意线
  658.                 Draw_yuan(31,31,30);//左半屏画圆
  659.                 delayms(6000);
  660.                 Clear_GDRAM();
  661.                 delayms(60);
  662.                 Disp_HZ(0x90+2,hanz,5);//显示汉字
  663.                 Disp_HZ(0x98,hanz2,8);//显示汉字
  664.                 delayms(6000);
  665.                 writecmd(0x01);//加上清楚命令
  666.                 delayms(50);
  667.                 Draw_PM(logo);//显示图片
  668.                 delayms(6000);
  669.                 Clear_GDRAM();
  670.                 delayms(60);
  671.         }       
  672. }
复制代码


评分

参与人数 1黑币 +5 收起 理由
czjlovezy + 5

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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