标题:
一个温度监控系统的lcd12864液晶显示部分仿真
[打印本页]
作者:
51黑ff
时间:
2016-9-4 22:53
标题:
一个温度监控系统的lcd12864液晶显示部分仿真
这是一个温度监控系统的lcd12864液晶显示部分
0.png
(41.68 KB, 下载次数: 73)
下载附件
2016-9-4 22:51 上传
0.png
(57.08 KB, 下载次数: 79)
下载附件
2016-9-4 22:52 上传
所有资料下载:
一个温度监控系统的lcd12864液晶显示部分.rar
(207.69 KB, 下载次数: 46)
2016-9-4 22:53 上传
点击文件名下载附件
下载积分: 黑币 -5
源程序如下:
#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);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1