|
这是一个温度监控系统的lcd12864液晶显示部分
所有资料下载:
一个温度监控系统的lcd12864液晶显示部分.rar
(207.69 KB, 下载次数: 46)
源程序如下:
- #include<reg52.h>
- #include <stdlib.h>
- #include "GraphicsDriver.h"
- #define LCDCS2W_COM (*((uchar volatile xdata *) 0x2000))
- #define LCDCS2W_DAT (*((uchar volatile xdata *) 0x2001))
- #define LCDCS1W_COM (*((uchar volatile xdata *) 0x2004))
- #define LCDCS1W_DAT (*((uchar volatile xdata *) 0x2005))
- #define LCDCS2R_DAT (*((uchar volatile xdata *) 0x2003))
- #define LCDCS1R_DAT (*((uchar volatile xdata *) 0x2007))
- #define LCD_Wr1command(command) LCDCS1W_COM = command
- #define LCD_Wr2command(command) LCDCS2W_COM = command
- #define LCD_Wr1data(wrdata) LCDCS1W_DAT = wrdata
- #define LCD_Wr2data(wrdata) LCDCS2W_DAT = wrdata
- uchar pageaddr=0xb8;
- uchar xaddr=0x40;
- uchar startx=0xc0;
- uchar control=0x3f;
- uchar r[8]={0};
- uchar code DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
- void delay5us()
- {
- uchar i;
- i=0;
- }
- /****************************************************************************
- *函数名:LCD_WriteByte
- *功能:向LCD写字节
- *取值范围:x 横坐标, y纵坐标, wrdata要写入的数据
- ****************************************************************************/
- void LCD_WriteByte(uchar x, uchar y, uchar wrdata)
- {
- uchar m;
- m=x;
- if(m<64)
- { LCD_Wr1command(xaddr+m);
- delay5us();
- LCD_Wr1command(pageaddr+y);
- delay5us();
- LCD_Wr1data(wrdata);
- delay5us();
- }
- else
- {
- m=m-64;
- LCD_Wr2command(xaddr+m);
- delay5us();
- LCD_Wr2command(pageaddr+y);
- delay5us();
- LCD_Wr2data(wrdata);
- delay5us();
- }
- }
- /****************************************************************************
- *函数名:LCD_Point
- *功能:在LCD中点亮一个像素点
- *xaddress:像素点横坐标, yaddress:像素点的纵坐标
- ****************************************************************************/
- void LCD_Point(uchar xaddress,uchar yaddress)
- {
- uchar wrdata,x,y;
- x=xaddress+2;
- yaddress=61-yaddress;
- y=yaddress>>3;
- wrdata=DEC_HEX_TAB[yaddress&0x07];
- if(y==7)
- {
- if(x!=2) {wrdata|=0x20;}
- else {wrdata=0x3f;}
- }
- else if(x==2) wrdata=0xff;
- LCD_WriteByte(x,y,wrdata);
- }
- /*************************************************************
- *函数名:HLine
- *功能:画出水平线
- *其中:xaddress 为起始点横坐标,yaddress为起始点纵坐标,
- * toyaddress为结束点横坐标,坐标原点位于LCD左下角
- *************************************************************/
- void HLine(uchar xaddress,uchar yaddress,uchar toxaddress)
- {
- uchar bak;
- if(xaddress>toxaddress)
- {
- bak = toxaddress;
- toxaddress = xaddress;
- xaddress = bak;
- }
- while(xaddress<=toxaddress)
- {
- LCD_Point(xaddress,yaddress);
- xaddress++;
- }
- }
- /*************************************************************
- *函数名:RLine
- *功能:画出垂直线
- *其中:xaddress 为起始点横坐标,yaddress为起始点纵坐标,
- * toyaddress为结束点纵坐标,坐标原点位于LCD左下角
- *************************************************************/
- void RLine(uchar xaddress,uchar yaddress,uchar toyaddress)
- {
- uchar bak,x,y,longth,wrdata,i;
- if(yaddress<toyaddress)
- {
- bak = toyaddress;
- toyaddress = yaddress;
- yaddress = bak;
- }
- x=xaddress+2;
- yaddress=61-yaddress;
- toyaddress=61-toyaddress;
- longth=toyaddress-yaddress+1;
- while(yaddress<=toyaddress)
- {
- y=yaddress>>3;
- if(y==7) wrdata|=0x20;
- r[y]=wrdata=r[y]|DEC_HEX_TAB[yaddress&0x07];
- yaddress++;
- LCD_WriteByte(x,y,wrdata);
- }
- for(i=0;i<=7;i++)
- r[i]=0;
- }
- /*************************************************************
- *函数名:Line
- *功能:画出水平线
- *其中:x0 为起始点横坐标,y0为起始点纵坐标,
- * x1为结束点横坐标,y1为结束点横坐标
- *************************************************************/
- void Line(uchar x0, uchar y0, uchar x1, uchar y1)
- { int dx; // 直线x轴差值变量
- int dy; // 直线y轴差值变量
- char dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
- char dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
- int dx_x2; // dx*2值变量,用于加快运算速度
- int dy_x2; // dy*2值变量,用于加快运算速度
- int di; // 决策变量
-
- x0=x0+1;
- x1=x1+1;
- dx = x1-x0; // 求取两点之间的差值
- dy = y1-y0;
-
- /* 判断增长方向,或是否为水平线、垂直线、点 */
- if(dx>0) // 判断x轴方向
- { dx_sym = 1; // dx>0,设置dx_sym=1
- }
- else
- { if(dx<0)
- { dx_sym = -1; // dx<0,设置dx_sym=-1
- }
- else
- { // dx==0,画垂直线,或一点
- RLine(x0, y0, y1);
- return;
- }
- }
-
- if(dy>0) // 判断y轴方向
- { dy_sym = 1; // dy>0,设置dy_sym=1
- }
- else
- { if(dy<0)
- { dy_sym = -1; // dy<0,设置dy_sym=-1
- }
- else
- { // dy==0,画水平线,或一点
- HLine(x0, y0, x1);
- return;
- }
- }
-
- /* 将dx、dy取绝对值 */
- dx = dx_sym * dx;
- dy = dy_sym * dy;
-
- /* 计算2倍的dx及dy值 */
- dx_x2 = dx*2;
- dy_x2 = dy*2;
-
- /* 使用Bresenham法进行画直线 */
- if(dx>=dy) // 对于dx>dy,则使用x轴为基准
- { di = dy_x2 - dx;
- while(x0!=x1)
- { LCD_Point(x0, y0);
- x0 += dx_sym;
- if(di<0)
- { di += dy_x2; // 计算出下一步的决策值
- }
- else
- { di += dy_x2 - dx_x2;
- y0 += dy_sym;
- }
- }
- LCD_Point(x0, y0); // 显示最后一点
- }
- else // 对于dx<=dy,则使用y轴为基准
- { di = dx_x2 - dy;
- while(y0!=y1)
- { LCD_Point(x0, y0);
- y0 += dy_sym;
- if(di<0)
- { di += dx_x2;
- }
- else
- { di += dx_x2 - dy_x2;
- x0 += dx_sym;
- }
- }
- LCD_Point(x0, y0); // 显示最后一点
- }
- }
- /**************************************************************
- *函数名:BuildXY()
- *功能:建立平面直角坐标系
- *x0(x0>1) 为原点的横坐标, y0(y0>1) 为原点的纵坐标,
- *x1(x1>2) 为横轴截止点, y1(y1>2)为纵轴截止点
- *张猛,2010-8-8
- **************************************************************/
- void BulidXY(uchar x0, uchar y0, uchar x1, uchar y1)
- {
- RLine(x0,y0,y1); //画出纵轴
- HLine(x0,y0,x1); //画出横轴
- }
- /****************************************************************************
- * 名称:Rectangle()
- * 功能:画矩形。
- * 入口参数:x0 矩形起点所在列的位置
- * y0 矩形起点所在行的位置
- * x1 矩形终点所在列的位置
- * y1 矩形终点所在行的位置
- * 出口参数:无
- * 说明:操作失败原因是指定地址超出缓冲区范围。
- ****************************************************************************/
- void Rectangle(uchar x0, uchar y0, uchar x1, uchar y1)
- { HLine(x0, y0, x1);
- HLine(x0, y1, x1);
- RLine(x0, y0, y1);
- RLine(x1, y0, y1);
- }
复制代码
|
|