找回密码
 立即注册

QQ登录

只需一步,快速开始

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

一个温度监控系统的lcd12864液晶显示部分仿真

[复制链接]
跳转到指定楼层
楼主
这是一个温度监控系统的lcd12864液晶显示部分 所有资料下载:
一个温度监控系统的lcd12864液晶显示部分.rar (207.69 KB, 下载次数: 46)


源程序如下:
  1. #include<reg52.h>
  2. #include <stdlib.h>
  3. #include "GraphicsDriver.h"
  4. #define        LCDCS2W_COM        (*((uchar volatile xdata *) 0x2000))
  5. #define        LCDCS2W_DAT        (*((uchar volatile xdata *) 0x2001))
  6. #define        LCDCS1W_COM        (*((uchar volatile xdata *) 0x2004))
  7. #define        LCDCS1W_DAT        (*((uchar volatile xdata *) 0x2005))
  8. #define LCDCS2R_DAT        (*((uchar volatile xdata *) 0x2003))
  9. #define LCDCS1R_DAT        (*((uchar volatile xdata *) 0x2007))

  10. #define        LCD_Wr1command(command)                LCDCS1W_COM = command
  11. #define        LCD_Wr2command(command)                LCDCS2W_COM = command
  12. #define LCD_Wr1data(wrdata)                 LCDCS1W_DAT = wrdata
  13. #define LCD_Wr2data(wrdata)                        LCDCS2W_DAT = wrdata

  14. uchar pageaddr=0xb8;
  15. uchar xaddr=0x40;
  16. uchar startx=0xc0;
  17. uchar control=0x3f;
  18. uchar r[8]={0};
  19. uchar code  DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  20. void delay5us()
  21. {
  22.    uchar i;
  23.    i=0;
  24. }

  25. /****************************************************************************
  26. *函数名:LCD_WriteByte
  27. *功能:向LCD写字节
  28. *取值范围:x 横坐标, y纵坐标, wrdata要写入的数据       
  29. ****************************************************************************/
  30. void  LCD_WriteByte(uchar x, uchar y, uchar wrdata)
  31. {   
  32.         uchar m;
  33.         m=x;
  34.    if(m<64)                               
  35.    {  LCD_Wr1command(xaddr+m);
  36.              delay5us();
  37.       LCD_Wr1command(pageaddr+y);       
  38.           delay5us();
  39.       LCD_Wr1data(wrdata);
  40.           delay5us();
  41.    }
  42.    else
  43.    {        
  44.       m=m-64;                               
  45.       LCD_Wr2command(xaddr+m);       
  46.           delay5us();
  47.       LCD_Wr2command(pageaddr+y);
  48.           delay5us();       
  49.       LCD_Wr2data(wrdata);
  50.           delay5us();
  51.    }
  52. }
  53. /****************************************************************************
  54. *函数名:LCD_Point
  55. *功能:在LCD中点亮一个像素点
  56. *xaddress:像素点横坐标, yaddress:像素点的纵坐标       
  57. ****************************************************************************/
  58. void LCD_Point(uchar xaddress,uchar yaddress)
  59. {
  60.         uchar wrdata,x,y;
  61.         x=xaddress+2;
  62.         yaddress=61-yaddress;
  63.         y=yaddress>>3;
  64.         wrdata=DEC_HEX_TAB[yaddress&0x07];
  65.         if(y==7)
  66.         {
  67.                 if(x!=2) {wrdata|=0x20;}
  68.                 else {wrdata=0x3f;}
  69.         }
  70.         else if(x==2) wrdata=0xff;
  71.         LCD_WriteByte(x,y,wrdata);
  72. }
  73. /*************************************************************
  74. *函数名:HLine
  75. *功能:画出水平线
  76. *其中:xaddress 为起始点横坐标,yaddress为起始点纵坐标,
  77. * toyaddress为结束点横坐标,坐标原点位于LCD左下角
  78. *************************************************************/
  79. void HLine(uchar xaddress,uchar yaddress,uchar toxaddress)
  80. {
  81.         uchar bak;
  82.         if(xaddress>toxaddress)                                                
  83.         {  
  84.                 bak = toxaddress;
  85.             toxaddress = xaddress;
  86.             xaddress = bak;
  87.         }
  88.         while(xaddress<=toxaddress)
  89.         {
  90.                  LCD_Point(xaddress,yaddress);
  91.                  xaddress++;
  92.         }
  93. }

  94. /*************************************************************
  95. *函数名:RLine
  96. *功能:画出垂直线
  97. *其中:xaddress 为起始点横坐标,yaddress为起始点纵坐标,
  98. * toyaddress为结束点纵坐标,坐标原点位于LCD左下角
  99. *************************************************************/
  100. void  RLine(uchar xaddress,uchar yaddress,uchar toyaddress)
  101. {
  102.         uchar bak,x,y,longth,wrdata,i;
  103.         if(yaddress<toyaddress)                                                
  104.         {  
  105.                 bak = toyaddress;
  106.             toyaddress = yaddress;
  107.             yaddress = bak;
  108.         }
  109.            x=xaddress+2;
  110.         yaddress=61-yaddress;
  111.         toyaddress=61-toyaddress;
  112.         longth=toyaddress-yaddress+1;
  113.         while(yaddress<=toyaddress)
  114.         {
  115.                 y=yaddress>>3;
  116.                 if(y==7) wrdata|=0x20;
  117.                 r[y]=wrdata=r[y]|DEC_HEX_TAB[yaddress&0x07];
  118.                 yaddress++;
  119.                 LCD_WriteByte(x,y,wrdata);
  120.         }
  121.         for(i=0;i<=7;i++)
  122.         r[i]=0;
  123. }

  124. /*************************************************************
  125. *函数名:Line
  126. *功能:画出水平线
  127. *其中:x0 为起始点横坐标,y0为起始点纵坐标,
  128. * x1为结束点横坐标,y1为结束点横坐标
  129. *************************************************************/
  130. void  Line(uchar x0, uchar y0, uchar x1, uchar y1)
  131. {  int   dx;                // 直线x轴差值变量
  132.    int   dy;                  // 直线y轴差值变量
  133.    char  dx_sym;        // x轴增长方向,为-1时减值方向,为1时增值方向
  134.    char  dy_sym;        // y轴增长方向,为-1时减值方向,为1时增值方向
  135.    int   dx_x2;                // dx*2值变量,用于加快运算速度
  136.    int   dy_x2;                // dy*2值变量,用于加快运算速度
  137.    int   di;                // 决策变量
  138.    
  139.    x0=x0+1;
  140.    x1=x1+1;
  141.    dx = x1-x0;                // 求取两点之间的差值
  142.    dy = y1-y0;
  143.    
  144.    /* 判断增长方向,或是否为水平线、垂直线、点 */
  145.    if(dx>0)                                // 判断x轴方向
  146.    {  dx_sym = 1;                        // dx>0,设置dx_sym=1
  147.    }
  148.    else
  149.    {  if(dx<0)
  150.       {  dx_sym = -1;                        // dx<0,设置dx_sym=-1
  151.       }
  152.       else
  153.       {  // dx==0,画垂直线,或一点
  154.          RLine(x0, y0, y1);
  155.                return;
  156.       }
  157.    }
  158.    
  159.    if(dy>0)                                // 判断y轴方向
  160.    {  dy_sym = 1;                        // dy>0,设置dy_sym=1
  161.    }
  162.    else
  163.    {  if(dy<0)
  164.       {  dy_sym = -1;                        // dy<0,设置dy_sym=-1
  165.       }
  166.       else
  167.       {  // dy==0,画水平线,或一点
  168.          HLine(x0, y0, x1);
  169.                return;
  170.       }
  171.    }
  172.    
  173.    /* 将dx、dy取绝对值 */
  174.    dx = dx_sym * dx;
  175.    dy = dy_sym * dy;

  176.    /* 计算2倍的dx及dy值 */
  177.    dx_x2 = dx*2;
  178.    dy_x2 = dy*2;
  179.    
  180.    /* 使用Bresenham法进行画直线 */
  181.    if(dx>=dy)                                // 对于dx>dy,则使用x轴为基准
  182.    {  di = dy_x2 - dx;
  183.       while(x0!=x1)
  184.       {  LCD_Point(x0, y0);
  185.          x0 += dx_sym;
  186.          if(di<0)
  187.          {  di += dy_x2;                // 计算出下一步的决策值
  188.          }
  189.          else
  190.          {  di += dy_x2 - dx_x2;
  191.             y0 += dy_sym;
  192.          }
  193.       }
  194.       LCD_Point(x0, y0);                // 显示最后一点
  195.    }
  196.    else                                        // 对于dx<=dy,则使用y轴为基准
  197.    {  di = dx_x2 - dy;
  198.       while(y0!=y1)
  199.       {  LCD_Point(x0, y0);
  200.          y0 += dy_sym;
  201.          if(di<0)
  202.          {  di += dx_x2;
  203.          }
  204.          else
  205.          {  di += dx_x2 - dy_x2;
  206.             x0 += dx_sym;
  207.          }
  208.       }
  209.       LCD_Point(x0, y0);                // 显示最后一点
  210.    }   
  211. }

  212. /**************************************************************
  213. *函数名:BuildXY()
  214. *功能:建立平面直角坐标系
  215. *x0(x0>1) 为原点的横坐标, y0(y0>1) 为原点的纵坐标,
  216. *x1(x1>2) 为横轴截止点, y1(y1>2)为纵轴截止点
  217. *张猛,2010-8-8
  218. **************************************************************/
  219. void BulidXY(uchar x0, uchar y0, uchar x1, uchar y1)
  220. {
  221.         RLine(x0,y0,y1);            //画出纵轴

  222.         HLine(x0,y0,x1);                        //画出横轴

  223. }

  224. /****************************************************************************
  225. * 名称:Rectangle()
  226. * 功能:画矩形。
  227. * 入口参数:x0                矩形起点所在列的位置
  228. *          y0                矩形起点所在行的位置
  229. *          x1              矩形终点所在列的位置
  230. *          y1              矩形终点所在行的位置
  231. * 出口参数:无
  232. * 说明:操作失败原因是指定地址超出缓冲区范围。
  233. ****************************************************************************/
  234. void  Rectangle(uchar x0, uchar y0, uchar x1, uchar y1)
  235. {  HLine(x0, y0, x1);
  236.    HLine(x0, y1, x1);
  237.    RLine(x0, y0, y1);
  238.    RLine(x1, y0, y1);
  239. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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