找回密码
 立即注册

QQ登录

只需一步,快速开始

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

SMG12864A标准图形点阵型液晶显示模块的演示程序(MCS51模拟口线接口方式)

[复制链接]
跳转到指定楼层
楼主
ID:75926 发表于 2015-4-4 01:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //SMG12864A标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51模拟口线接口方式]
  2. //应用产品: SMG12864A SMG12864BV SMG12864C SMG12864D3 标准图形点阵型液晶显示模块
  3. //  本演示程序适用于SMG12864A液晶显示模块与MCS51系列单片机采用MCS51模拟口线的
  4. //硬件连线方式。
  5. //  本演示程序包括KS0108B兼容芯片的MCS51模拟口线接口子程序集,KS0108B兼容芯片的12864
  6. //液晶显示模块的基本子程序,12864系列绘图子程序集,12864系列图形子程序集,12864系列
  7. //精简中英文字库子程序集,以及SMG12864A系列标准图形点阵型液晶显示的演示子程序.
  8. //  本演示的内容为,在128列X64行的点阵液晶显示屏上清屏,图片演示,英文字符串演示,
  9. //中文字符串演示,反白显示字符串,绘制矩形,写点,绘制直线,全屏显示.
  10. //-------------------------------------------------------------------------------
  11. //创建日期: 2009.10.30
  12. //软件环境: VW For Windows
  13. //硬件环境: AT89C52 MCU,MCS-51系列 MCU,etc.
  14. //-------------------------------------------------------------------------------
  15. #include <reg51.h>
  16. #include <intrins.h>
  17. //以下为演示程序的函数定义
  18. void exsample(void);                    //演示程序
  19. void exdelay(void);                     //演示延时子程序
  20. void putchar(unsigned int c);           //定位写字符子程序
  21. void putstr(unsigned char code *s);     //显示字符串子程序,字符码为0时退出
  22. unsigned char code *getchinesecodepos(unsigned int ac);
  23. unsigned char code *getenglishcodepos(unsigned char ac);
  24. void putimage(unsigned char code *s);   //显示图形子程序
  25. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s);
  26.                                         //显示指定大小的图形子程序
  27. void point(bit b);
  28. void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
  29. void lineto(unsigned char x1,unsigned char y1,bit b);//绘制(XPOS,YPOS)-(X1,Y1)的直线
  30. void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b);
  31. void lcdfill(unsigned char d);          //整屏显示d代表的字节数据子程序
  32. void lcdpos(void);                      //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
  33. void lcdreset(void);                    //液晶显示控制器初始化子程序
  34. void setlcdvoltage(unsigned char vol);   //LCD电压设置
  35. void lcdwd(unsigned char d);            //送图形数据子程序
  36. unsigned char lcdrd(void);              //读图形数据子程序
  37. void lcdwc(unsigned char c);            //送指令子程序
  38. void lcdwaitidle(void);                 //忙检测子程序

  39. void lcdwd1(unsigned char d);           //送图形数据子程序
  40. unsigned char lcdrd1(void);             //读图形数据子程序
  41. void lcdwc1(unsigned char c);           //送指令子程序
  42. void lcdwaitidle1(void);                //忙检测子程序
  43. void lcdwd2(unsigned char d);           //送图形数据子程序
  44. unsigned char lcdrd2(void);             //读图形数据子程序
  45. void lcdwc2(unsigned char c);           //送指令子程序
  46. void lcdwaitidle2(void);                //忙检测子程序
  47. //-------------------------------------------------------------------------------
  48. //SMG12864A产品引脚说明及演示连线
  49. //PIN1: VSS  [电源地]
  50. //PIN2: VDD  [电源正极]
  51. //PIN3: Vo   [LCD偏压输入]
  52. //PIN4: RS   [数据/命令选择端 1:数据 0:命令]
  53. //PIN5: RW   [读写信号选择端 1:读操作 0:写操作]
  54. //PIN6: E    [使能信号输入 高有效]
  55. //PIN7: DB0  [Data I/O]
  56. //PIN8: DB1  [Data I/O]
  57. //PIN9: DB2  [Data I/O]
  58. //PIN10:DB3  [Data I/O]
  59. //PIN11:DB4  [Data I/O]
  60. //PIN12:DB5  [Data I/O]
  61. //PIN13:DB6  [Data I/O]
  62. //PIN14:DB7  [Data I/O]
  63. //PIN15:CS1  [片选1信号输入 高有效]
  64. //PIN16:CS2  [片选2信号输入 高有效]
  65. //PIN17:RST  [复位信号输入(H:正常工作,L:复位)]
  66. //PIN18:VEE  [LCD驱动负压输出(-5V)]
  67. //PIN19:BLA  [背光源正极]
  68. //PIN20:BLK  [背光源负极]
  69. //注:8031的晶振频率为12MHz.
  70. //请参见http://download.sunman.cn/lcm/product/1/SMG12864A.pdf
  71. //-------------------------------------------------------------------------------
  72. //以下为产品接口引脚在演示程序中的预定义
  73. //用户在编写应用程序时,需按自己的实际硬件连线来重新定义
  74. sbit RSPIN=P3^0;                        // RS对应单片机引脚
  75. sbit RWPIN=P3^3;                        // RW对应单片机引脚
  76. sbit EPIN =P3^4;                        // E对应单片机引脚
  77. sbit CS1PIN=P3^1;                       // CS1对应单片机引脚
  78. sbit CS2PIN=P3^2;                       // CS2对应单片机引脚
  79. //-------------------------------------------------------------------------------
  80. //以下XPOS,YPOS变量用于指示当前操作点的位置的预定义
  81. //用户在编写应用程序时,需按自己的实际软件程序需要来重新定义
  82. unsigned char XPOS;                     //列方向LCD点阵位置指针
  83. unsigned char YPOS;                     //行方向LCD点阵位置指针
  84. bit CharImageReverse;                   //字符及图形的反显控制,0(正常显示),1(反显)

  85. #define XDOTS   128                     //图形空间X方向大小
  86. #define YDOTS   64                      //图形空间X方向大小
  87. //-------------------------------------------------------------------------------
  88. //以下为精简版中英文字库
  89. //实际使用时请包含由Sunman精简版中英文字符库代码生成器.exe自动生成的charlib.c文
  90. //文件来替换该部分
  91. #define ENGLISHCHARNUMBER  5       //精简版英文字符库中的英文字符的个数
  92. #define CHINESECHARNUMBER  5       //精简版中文字符库中的中文字符的个数
  93. #define ENGLISHCHARSIZE    8       //英文字符X方向显示点的个数
  94. #define CHINESECHARSIZE    16      //中文字符X方向及中英文字符Y方向显示点的个数
  95. #define ENGLISHCHARDOTSIZE 16      //单个英文字符点阵的字节数
  96. #define CHINESECHARDOTSIZE 32      //单个中文字符点阵的字节数

  97. unsigned int code EnglishCode[]={
  98. 0x41,    //字符001:[A]
  99. 0x4d,    //字符002:[M]
  100. 0x4e,    //字符003:[N]
  101. 0x53,    //字符004:[S]
  102. 0x55     //字符005:[U]
  103. };

  104. unsigned int code ChineseCode[]={
  105. 0xb5e7,  //字符001:[电]
  106. 0xc8cb,  //字符002:[人]
  107. 0xccab,  //字符003:[太]
  108. 0xd1f4,  //字符004:[阳]
  109. 0xd7d3   //字符005:[子]
  110. };

  111. unsigned char code EnglishCharDot[]={
  112. 0x00,0x20,0x00,0x3c,0xc0,0x23,0x38,0x02,   //字符001:[A]
  113. 0xe0,0x02,0x00,0x27,0x00,0x38,0x00,0x00,
  114. 0x08,0x20,0xf8,0x3f,0xf8,0x00,0x00,0x3f,   //字符002:[M]
  115. 0xf8,0x00,0xf8,0x3f,0x08,0x20,0x00,0x00,
  116. 0x08,0x20,0xf8,0x3f,0x30,0x20,0xc0,0x00,   //字符003:[N]
  117. 0x00,0x07,0x08,0x18,0xf8,0x3f,0x00,0x00,
  118. 0x00,0x00,0x70,0x38,0x88,0x20,0x08,0x21,   //字符004:[S]
  119. 0x08,0x21,0x08,0x22,0x38,0x1c,0x00,0x00,
  120. 0x08,0x00,0xf8,0x1f,0x08,0x20,0x00,0x20,   //字符005:[U]
  121. 0x00,0x20,0x08,0x20,0xf8,0x1f,0x00,0x00
  122. };

  123. unsigned char code ChineseCharDot[]={
  124. 0x00,0x00,0x00,0x00,0xf8,0x0f,0x48,0x04,   //字符001:[电]
  125. 0x48,0x04,0x48,0x04,0x48,0x04,0xff,0x3f,
  126. 0x48,0x44,0x48,0x44,0x48,0x44,0x48,0x44,
  127. 0xf8,0x4f,0x00,0x40,0x00,0x70,0x00,0x00,
  128. 0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,   //字符002:[人]
  129. 0x00,0x0c,0x00,0x03,0xc0,0x00,0x3f,0x00,
  130. 0xc2,0x01,0x00,0x06,0x00,0x0c,0x00,0x18,
  131. 0x00,0x30,0x00,0x60,0x00,0x20,0x00,0x00,
  132. 0x00,0x00,0x10,0x80,0x10,0x40,0x10,0x20,   //字符003:[太]
  133. 0x10,0x10,0x10,0x0c,0x10,0x03,0xff,0x08,
  134. 0x10,0x71,0x10,0x22,0x10,0x04,0x10,0x18,
  135. 0x10,0x30,0x10,0xe0,0x10,0x40,0x00,0x00,
  136. 0x00,0x00,0xfe,0xff,0x02,0x04,0x22,0x08,   //字符004:[阳]
  137. 0x5a,0x04,0x86,0x03,0x00,0x00,0xfe,0x3f,
  138. 0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,
  139. 0x42,0x10,0xfe,0x3f,0x00,0x00,0x00,0x00,
  140. 0x00,0x01,0x00,0x01,0x02,0x01,0x02,0x01,   //字符005:[子]
  141. 0x02,0x01,0x02,0x41,0x02,0x81,0xe2,0x7f,
  142. 0x12,0x01,0x0a,0x01,0x06,0x01,0x02,0x01,
  143. 0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x00
  144. };
  145. //-------------------------------------------------------------------------------
  146. //以下为图片库点阵代码
  147. //实际使用时请包含由SUNMAN图形点阵代码生成器.EXE自动生成的imagelib.c文件来替换该
  148. //部分
  149. unsigned char code Img_sunman_32[]={32,32,
  150. 0x00,0xf0,0x0f,0x00,
  151. 0x00,0xfe,0x7f,0x00,
  152. 0x80,0x0f,0xf6,0x01,
  153. 0xc0,0x03,0xc6,0x03,
  154. 0xe0,0x70,0x0e,0x07,
  155. 0x70,0x7c,0x3e,0x0e,
  156. 0x38,0x7f,0xfe,0x1c,
  157. 0x9c,0x7f,0xfe,0x39,
  158. 0xcc,0x7f,0xfe,0x33,
  159. 0xce,0x7f,0xfe,0x73,
  160. 0xe6,0x7f,0xfe,0x67,
  161. 0xe6,0x07,0xe0,0x67,
  162. 0xf3,0x07,0xe0,0xcf,
  163. 0xf3,0xcf,0xff,0xcf,
  164. 0x73,0x9e,0xff,0xcf,
  165. 0x33,0x3c,0xff,0xcf,
  166. 0x33,0x3c,0xff,0xcf,
  167. 0x73,0x9e,0xff,0xcf,
  168. 0xf3,0xcf,0xff,0xcf,
  169. 0xf3,0x07,0xe0,0xcf,
  170. 0xe6,0x07,0xe0,0x67,
  171. 0xe6,0x7f,0xfe,0x67,
  172. 0xce,0x7f,0xfe,0x73,
  173. 0xcc,0x7f,0xfe,0x33,
  174. 0x9c,0x7f,0xfe,0x39,
  175. 0x38,0x7f,0xfe,0x1c,
  176. 0x70,0x7c,0x3e,0x0e,
  177. 0xe0,0x70,0x0e,0x07,
  178. 0xc0,0x63,0xc0,0x03,
  179. 0x80,0x6f,0xf0,0x01,
  180. 0x00,0xfe,0x7f,0x00,
  181. 0x00,0xf0,0x0f,0x00
  182. };
  183. //-------------------------------------------------------------------------------

  184. void main(void)
  185. {   while(1)
  186.     {   lcdreset();                     //初始化液晶显示控制器
  187.         exsample();                     //演示程序
  188.     }
  189. }
  190. void exsample(void)                     //演示程序
  191. {
  192. //0.演示前的准备,将LCD液晶显示全部清空
  193.     CharImageReverse=0;                 //反显关闭
  194.     lcdfill(0);                         //清屏

  195. //1.图片测试: 在(8,16)位置显示32点阵SUNMAN图标
  196.     XPOS=8;
  197.     YPOS=16;
  198.     putimage(Img_sunman_32);            //写数据到当前LCDRAM地址中
  199.     exdelay();                          //延时约600mS

  200. //2.字符串测试: 在(56,16)位置显示"SUNMAN"字符串.
  201.     XPOS=56;
  202.     YPOS=16;
  203.     putstr("SUNMAN");
  204.     exdelay();                          //延时约600mS

  205. //3.字符串测试: 在(40,32)位置显示"太阳人电子"字符串.
  206.     XPOS=40;
  207.     YPOS=32;
  208.     putstr("太阳人电子");
  209.     exdelay();                          //延时约600mS

  210. //4.反显测试: 在(40,32)位置反显"太阳人电子"字符串.
  211.     XPOS=40;
  212.     YPOS=32;
  213.     CharImageReverse=1;
  214.     putstr("太阳人电子");
  215.     CharImageReverse=0;
  216.     exdelay();                          //延时约600mS

  217. //5.绘图测试: RECT(6,14)-(122,50),画矩形.
  218.     rect(6,14,122,50,1);
  219.     exdelay();                          //延时约600mS

  220. //6.绘图测试: POINT(6,52),画点.
  221.     XPOS=6;
  222.     YPOS=52;
  223.     point(1);
  224.     exdelay();                          //延时约600mS

  225. //7.绘图测试: LINE(6,52)-(63,63),画线.
  226.     line(6,52,63,63,1);
  227.     exdelay();                          //延时约600mS

  228. //8.绘图测试: lineto(122,52),画线.
  229.     lineto(122,52,1);
  230.     exdelay();                          //延时约600mS

  231. //9.绘图测试: lineto(6,52),画线.
  232.     lineto(6,52,1);
  233.     exdelay();                          //延时约600mS

  234. //13.全屏测试: 所有坐标点全部显示.
  235.     lcdfill(0xff);                      //全显
  236.     exdelay();                          //延时约600mS

  237. }
  238. void exdelay(void)                      //演示延时子程序
  239. { unsigned char i,j,k;                  //延时约600mS
  240.   for(i=0;i<60;i++)
  241.     for(j=0;j<64;j++)
  242.       for(k=0;k<51;k++);
  243. }
  244. //-------------------------------------------------------------------------------
  245. //以下putchar为字符对象的基本子程序,putstr为字符对象的扩充子程序,getchinesecodepos,
  246. //getenglishcodepos为字符对象的辅助子程序.
  247. //-------------------------------------------------------------------------------
  248. //子程序名称:void putchar(unsigned int c).
  249. //功能:在(XPOS,YPOS)位置写单个字符点阵,若c>128 表示为中文字符,否则为西文字符
  250. //修改日期:2009.8.18
  251. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  252. //-------------------------------------------------------------------------------
  253. void putchar(unsigned int c)            //定位写字符子程序
  254. {   if(c>128)
  255.         putsizeimage(CHINESECHARSIZE,CHINESECHARSIZE,getchinesecodepos(c));
  256.     else
  257.         putsizeimage(ENGLISHCHARSIZE,CHINESECHARSIZE,getenglishcodepos(c));
  258. }
  259. //-------------------------------------------------------------------------------
  260. //子程序名称:void putstr(unsigned char code *s).
  261. //功能:写字符串点阵,若*s=0 表示字符串结束.
  262. //修改日期:2009.8.18
  263. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  264. //-------------------------------------------------------------------------------
  265. void putstr(unsigned char code *s)      //显示字符串子程序,字符码为0时退出
  266. {   unsigned int c;
  267.     while(1)
  268.     {   c=*s;
  269.         s++;
  270.         if(c==0) break;
  271.         if(c<128)
  272.             putchar(c);
  273.         else
  274.         {   putchar(c*256+*s);
  275.             s++;
  276.         }
  277.     }
  278. }
  279. //-------------------------------------------------------------------------------
  280. //子程序名称:unsigned char code *getchinesecodepos(unsigned char ac).
  281. //功能:根据当前中文字符码查表后计算得到当前中文字符码的字库点阵位置.
  282. //修改日期:2009.8.18
  283. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  284. //-------------------------------------------------------------------------------
  285. unsigned char code *getchinesecodepos(unsigned int ac)
  286. {   unsigned int min,max,mid,midc;
  287.     min=0;
  288.     max=CHINESECHARNUMBER-1;
  289.     while(1)
  290.     {   if(max-min<2)
  291.         {   if(ChineseCode[min]==ac)
  292.                 mid=min;
  293.             else if(ChineseCode[max]==ac)
  294.                 mid=max;
  295.             else
  296.                 mid=0;
  297.             break;
  298.         }
  299.         mid=(max+min)/2;
  300.         midc=ChineseCode[mid];
  301.         if(midc==ac)
  302.             break;
  303.         else if(midc>ac)
  304.             max=mid-1;
  305.         else
  306.             min=mid+1;
  307.     }
  308.     return ChineseCharDot+mid*CHINESECHARDOTSIZE;
  309. }
  310. //-------------------------------------------------------------------------------
  311. //子程序名称:unsigned char code *getenglishcodepos(unsigned char ac).
  312. //功能:根据当前ASCII字符码查表后计算得到当前ASCII字符码的字库点阵位置.
  313. //修改日期:2009.8.18
  314. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  315. //-------------------------------------------------------------------------------
  316. unsigned char code *getenglishcodepos(unsigned char ac)
  317. {   unsigned char min,max,mid,midc;
  318.     min=0;
  319.     max=ENGLISHCHARNUMBER-1;
  320.     while(1)
  321.     {   if(max-min<2)
  322.         {   if(EnglishCode[min]==ac)
  323.                 mid=min;
  324.             else if(EnglishCode[max]==ac)
  325.                 mid=max;
  326.             else
  327.                 mid=0;
  328.             break;
  329.         }
  330.         mid=(max+min)/2;
  331.         midc=EnglishCode[mid];
  332.         if(midc==ac)
  333.             break;
  334.         else if(midc>ac)
  335.             max=mid-1;
  336.         else
  337.             min=mid+1;
  338.     }
  339.     return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
  340. }
  341. //-------------------------------------------------------------------------------
  342. //以下putsizeimage为图形对象的基本子程序,putimage为图形对象的扩充子程序
  343. //-------------------------------------------------------------------------------
  344. //子程序名称:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
  345. //                             unsigned char code *s)
  346. //功能:在(XPOS,YPOS)位置绘制XSIZE列及YISZE行点阵的图形*S.
  347. //修改日期:2009.8.31
  348. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  349. //-------------------------------------------------------------------------------
  350. void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
  351. {  unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
  352.    k=YPOS&0x7;
  353.    YSIZE+=k;
  354.    y=YPOS;
  355.    s--;
  356.    for(lx=0;lx<XSIZE;lx++,XPOS++)
  357.    {  for(YPOS=y,ly=k;ly<YSIZE;)
  358.       {  unsigned char p;
  359.          a1=*s;
  360.          s++;
  361.          a2=*s;
  362.          if(CharImageReverse)
  363.          {   a1=~a1;
  364.              a2=~a2;
  365.          }
  366.          for(p=0;p<k;p++)
  367.          {  a2>>=1;
  368.             if((a1&0x1)==1)
  369.                a2+=0x80;
  370.             a1>>=1;
  371.          }
  372.          if((k==0) && (YSIZE<ly+8))
  373.          {   lcdpos();
  374.              ly+=8;
  375.              YPOS+=8;
  376.          }
  377.          else
  378.          {   lcdpos();
  379.              a1=lcdrd();
  380.              lcdpos();
  381.              ly+=8;
  382.              YPOS+=8;
  383.              Lcd_Mask=0xff;
  384.              p=YSIZE&0x7;
  385.              while(p>0)
  386.              {   Lcd_Mask>>=1;
  387.                  YPOS--;
  388.                  p--;
  389.              }
  390.              p=0xff;
  391.              while(YSIZE<ly)
  392.              {   ly--;
  393.                  YPOS--;
  394.                  p<<=1;
  395.              }
  396.              Lcd_Mask&=p;
  397.              a2&=Lcd_Mask;
  398.              a2|=a1&(~Lcd_Mask);
  399.          }
  400.          lcdwd(a2);
  401.       }
  402.       if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
  403.    }
  404.    YPOS=y;
  405. }
  406. //-------------------------------------------------------------------------------
  407. //子程序名称:void putimage(unsigned char code *s).
  408. //功能:在(XPOS,YPOS)位置绘制XSIZE[*s]列及YISZE[*(s+1)]行点阵的图形[*(s+2)].
  409. //修改日期:2009.8.18
  410. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  411. //-------------------------------------------------------------------------------
  412. void putimage(unsigned char code *s)    //显示图形子程序
  413. {   unsigned char XSIZE,YSIZE;
  414.     XSIZE=*s;
  415.     s++;
  416.     YSIZE=*s;
  417.     s++;
  418.     putsizeimage(XSIZE,YSIZE,s);
  419. }
  420. //-------------------------------------------------------------------------------
  421. //以下point为绘图操作的基本子程序,line,lineto,rect为绘图操作的扩充子程序.
  422. //-------------------------------------------------------------------------------
  423. //子程序名称:void point(bit b).
  424. //功能:按b的数据在(XPOS,YPOS)位置绘制点.
  425. //修改日期:2009.8.18
  426. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  427. //-------------------------------------------------------------------------------
  428. void point(bit b)
  429. {   unsigned char i,Lcd_Mask,j;
  430.     Lcd_Mask=0x01;
  431.     i=YPOS&0x7;
  432.     while(i>0)
  433.     {   Lcd_Mask<<=1;
  434.         i--;
  435.     }
  436.     lcdpos();
  437.     j=lcdrd();
  438.     lcdpos();
  439.     if(b)
  440.         lcdwd(j|Lcd_Mask);
  441.     else
  442.         lcdwd(j&(~Lcd_Mask));
  443. }
  444. //-------------------------------------------------------------------------------
  445. //子程序名称:void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
  446. //功能:按b的数据绘制(x0,y0)-(x1,y1)的直线
  447. //修改日期:2009.8.18
  448. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  449. //-------------------------------------------------------------------------------
  450. void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
  451. {   unsigned char dx,dy;
  452.     unsigned int dk;
  453.     XPOS=x0;
  454.     YPOS=y0;
  455.     point(b);
  456.     dx=(x1>=x0)?x1-x0:x0-x1;
  457.     dy=(y1>=y0)?y1-y0:y0-y1;
  458.     if(dx==dy)
  459.     {   while(XPOS!=x1)
  460.         {   if(x1>x0) XPOS++;else XPOS--;
  461.             if(y1>y0) YPOS++;else YPOS--;
  462.             point(b);
  463.         }
  464.     }
  465.     else if (dx>dy)
  466.     {   dk=dy;
  467.         dy=0;
  468.         while(XPOS!=x1)
  469.         {   if(x1>x0) XPOS++;else XPOS--;
  470.             dy++;
  471.             if(y1>y0) YPOS=y0+(dk*dy+dx/2)/dx;else YPOS=y0-(dk*dy+dx/2)/dx;
  472.             point(b);
  473.         }
  474.     }
  475.     else
  476.     {   dk=dx;
  477.         dx=0;
  478.         while(YPOS!=y1)
  479.         {   if(y1>y0) YPOS++;else YPOS--;
  480.             dx++;
  481.             if(x1>x0) XPOS=x0+(dk*dx+dy/2)/dy;else XPOS=x0-(dk*dx+dy/2)/dy;
  482.             point(b);
  483.         }
  484.     }
  485. }
  486. //-------------------------------------------------------------------------------
  487. //子程序名称:void lineto(unsigned char x1,unsigned char y1,bit b)
  488. //功能:按b的数据绘制(XPOS,YPOS)-(x1,y1)的直线
  489. //修改日期:2009.8.18
  490. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  491. //-------------------------------------------------------------------------------
  492. void lineto(unsigned char x1,unsigned char y1,bit b)//绘制(XPOS,YPOS)-(X1,Y1)的直线
  493. {   line(XPOS,YPOS,x1,y1,b);
  494. }
  495. //-------------------------------------------------------------------------------
  496. //子程序名称:void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
  497. //功能:按b的数据绘制(x0,y0)-(x1,y1)的矩形
  498. //修改日期:2009.8.18
  499. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  500. //-------------------------------------------------------------------------------
  501. void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
  502. {   line(x0,y0,x1,y0,b);
  503.     line(x1,y0,x1,y1,b);
  504.     line(x1,y1,x0,y1,b);
  505.     line(x0,y1,x0,y0,b);
  506. }
  507. //-------------------------------------------------------------------------------
  508. //以下lcdfill,lcdpos,lcdreset为KS0108B型硬件接口的12864液晶显示模块的基本子程序
  509. //-------------------------------------------------------------------------------
  510. //子程序名称:void lcdfill(unsigned char d).
  511. //功能:整屏显示d表示的字节数据.
  512. //修改日期:2009.08.31
  513. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  514. //-------------------------------------------------------------------------------
  515. void lcdfill(unsigned char d)           //整屏显示d代表的字节数据子程序
  516. {   unsigned char j;
  517.     for(YPOS=0;YPOS<64;YPOS+=8)         //8页
  518.     {   XPOS=0;
  519.         lcdpos();
  520.         for(j=0;j<64;j++)              //64列
  521.             lcdwd1(d);                 //送图形数据
  522.         XPOS=64;
  523.         lcdpos();
  524.         for(j=0;j<64;j++)              //64列
  525.             lcdwd2(d);                 //送图形数据
  526.     }
  527.     XPOS=0;
  528.     YPOS=0;
  529. }
  530. //-------------------------------------------------------------------------------
  531. //子程序名称:void lcdpos(void).
  532. //功能:设置坐标点(XPOS,YPOS)位置对应的内部RAM地址.
  533. //修改日期:2009.08.31
  534. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  535. //-------------------------------------------------------------------------------
  536. void lcdpos(void)                       //设置坐标点(XPOS,YPOS)内部RAM地址的子程序
  537. {  unsigned char Column;
  538.    if(XPOS<64)
  539.    {   lcdwc1(0xB8|((YPOS/8)&0x7));     //页地址设置
  540.        lcdwc1(0x40|XPOS);               //列地址设置
  541.    }
  542.    else
  543.    {   lcdwc2(0xB8|((YPOS/8)&0x7));     //页地址设置
  544.        lcdwc2(0x40|(XPOS&0x3F));        //列地址设置
  545.    }
  546. }
  547. //-------------------------------------------------------------------------------
  548. //子程序名称:void lcdreset(void)
  549. //功能:液晶显示控制器初始化
  550. //修改日期:2009.08.31
  551. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  552. //-------------------------------------------------------------------------------
  553. void lcdreset(void)                     //液晶显示控制器初始化子程序
  554. {
  555.     lcdwc1(0xC0);                       //设置显示初始行
  556.     lcdwc2(0xC0);                       //设置显示初始行
  557.     lcdwc1(0x3F);                       //开显示
  558.     lcdwc2(0x3F);                       //开显示
  559. }
  560. //-------------------------------------------------------------------------------
  561. //以下lcdwc1,lcdwc2,lcdwd,lcdrd为MCS51模拟口线接口的KS0108B液晶显示控制器的基本
  562. //子程序,lcdwd1,lcdwd2,lcdrd1,lcdrd2,lcdwaitidle1,lcdwaitidle2为内部子程序.
  563. //-------------------------------------------------------------------------------
  564. //子程序名称:unsigned char lcdrd(void).
  565. //功能:从液晶显示控制器中读图形数据.
  566. //修改日期:2009.08.31
  567. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  568. //-------------------------------------------------------------------------------
  569. unsigned char lcdrd(void)
  570. {unsigned char d;
  571.     if(XPOS<64)
  572.     {    d=lcdrd1();
  573.          d=lcdrd1();
  574.     }
  575.     else
  576.     {    d=lcdrd2();
  577.          d=lcdrd2();
  578.     }
  579.     return d;
  580. }
  581. //-------------------------------------------------------------------------------
  582. //子程序名称:void lcdwd(unsigned char d).
  583. //功能:向液晶显示控制器写图形数据.
  584. //修改日期:2009.08.31
  585. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  586. //-------------------------------------------------------------------------------
  587. void lcdwd(unsigned char d)
  588. {   if(XPOS<64)
  589.         lcdwd1(d);
  590.     else
  591.         lcdwd2(d);
  592. }
  593. //-------------------------------------------------------------------------------
  594. //子程序名称:void lcdwd1(unsigned char d).
  595. //功能:向液晶显示控制器1写图形数据.
  596. //修改日期:2009.08.31
  597. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  598. //-------------------------------------------------------------------------------
  599. void lcdwd1(unsigned char d)
  600. {   lcdwaitidle1();
  601.     P1=d;
  602.     RSPIN=1;
  603.     RWPIN=0;
  604.     CS1PIN=1;
  605.     CS2PIN=0;
  606.     EPIN=1;
  607.     _nop_();
  608.     EPIN=0;
  609.     CS1PIN=0;
  610. }
  611. //-------------------------------------------------------------------------------
  612. //子程序名称:void lcdwd2(unsigned char d).
  613. //功能:向液晶显示控制器2写图形数据.
  614. //修改日期:2009.08.31
  615. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  616. //-------------------------------------------------------------------------------
  617. void lcdwd2(unsigned char d)
  618. {   lcdwaitidle2();
  619.     P1=d;
  620.     RSPIN=1;
  621.     RWPIN=0;
  622.     CS1PIN=0;
  623.     CS2PIN=1;
  624.     EPIN=1;
  625.     _nop_();
  626.     EPIN=0;
  627.     CS2PIN=0;
  628. }
  629. //-------------------------------------------------------------------------------
  630. //子程序名称:unsigned char lcdrd1(void).
  631. //功能:从液晶显示控制器1中读图形数据.
  632. //修改日期:2009.08.31
  633. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  634. //-------------------------------------------------------------------------------
  635. unsigned char lcdrd1(void)              //读图形数据子程序
  636. {   unsigned char d;
  637.     lcdwaitidle1();                     //检测液晶显示控制器是否空闲
  638.     P1=0xff;
  639.     RSPIN=1;
  640.     RWPIN=1;
  641.     CS1PIN=1;
  642.     CS2PIN=0;
  643.     EPIN=1;
  644.     _nop_();
  645.     d=P1;
  646.     EPIN=0;
  647.     CS1PIN=0;
  648.     return d;
  649. }
  650. //-------------------------------------------------------------------------------
  651. //子程序名称:unsigned char lcdrd2(void).
  652. //功能:从液晶显示控制器2中读图形数据.
  653. //修改日期:2009.08.31
  654. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  655. //-------------------------------------------------------------------------------
  656. unsigned char lcdrd2(void)              //读图形数据子程序
  657. {   unsigned char d;
  658.     lcdwaitidle2();                     //检测液晶显示控制器是否空闲
  659.     P1=0xff;
  660.     RSPIN=1;                            //DUMMY READ
  661.     RWPIN=1;
  662.     CS1PIN=0;
  663.     CS2PIN=1;
  664.     EPIN=1;
  665.     _nop_();
  666.     d=P1;
  667.     EPIN=0;
  668.     CS2PIN=0;
  669.     return d;
  670. }
  671. //-------------------------------------------------------------------------------
  672. //子程序名称:lcdwc1(unsigned char c).
  673. //功能:向液晶显示控制器1送指令.
  674. //修改日期:2009.10.30
  675. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  676. //-------------------------------------------------------------------------------
  677. void lcdwc1(unsigned char c)            //向液晶显示控制器1送指令
  678. {   lcdwaitidle1();
  679.     P1=c;
  680.     RSPIN=0;
  681.     RWPIN=0;
  682.     CS1PIN=1;
  683.     CS2PIN=0;
  684.     EPIN=1;
  685.     _nop_();
  686.     EPIN=0;
  687.     CS1PIN=0;
  688. }
  689. //-------------------------------------------------------------------------------
  690. //子程序名称:lcdwc2(unsigned char c).
  691. //功能:向液晶显示控制器2送指令.
  692. //修改日期:2009.10.30
  693. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  694. //-------------------------------------------------------------------------------
  695. void lcdwc2(unsigned char c)            //向液晶显示控制器2送指令
  696. {   lcdwaitidle2();
  697.     P1=c;
  698.     RSPIN=0;
  699.     RWPIN=0;
  700.     CS1PIN=0;
  701.     CS2PIN=1;
  702.     EPIN=1;
  703.     _nop_();
  704.     EPIN=0;
  705.     CS2PIN=0;
  706. }
  707. //-------------------------------------------------------------------------------
  708. //子程序名称:voidlcdwaitidle1(void).
  709. //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
  710. //修改日期:2009.10.30
  711. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  712. //-------------------------------------------------------------------------------
  713. void lcdwaitidle1(void)                 //控制器1忙检测子程序
  714. {   unsigned char i;
  715.     P1=0xff;
  716.     RSPIN=0;
  717.     RWPIN=1;
  718.     CS1PIN=1;
  719.     CS2PIN=0;
  720.     EPIN=1;
  721.     for(i=0;i<20;i++)                   //
  722.         if( (P1&0x80) != 0x80 ) break;  //D7=0 空闲退出
  723.     EPIN=0;
  724.     CS1PIN=0;
  725. }
  726. //-------------------------------------------------------------------------------
  727. //子程序名称:voidlcdwaitidle2(void).
  728. //功能:忙检测,在对液晶显示控制器操作的每一条指令之前,需检测液晶显示器是否空闲.
  729. //修改日期:2009.10.30
  730. //修改人:chujianjun@sunman.cn,tanchao@sunman.cn
  731. //-------------------------------------------------------------------------------
  732. void lcdwaitidle2(void)                 //控制器2忙检测子程序
  733. {   unsigned char i;
  734.     P1=0xff;
  735.     RSPIN=0;
  736.     RWPIN=1;
  737.     CS1PIN=0;
  738.     CS2PIN=1;
  739.     EPIN=1;
  740.     for(i=0;i<20;i++)                   //
  741.         if( (P1&0x80) != 0x80 ) break;  //D7=0 空闲退出
  742.     EPIN=0;
  743.     CS2PIN=0;
  744. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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