📄 sed1335.c
字号:
/*******************************************************************************
文件名:SED1335.C
日期:2006-4-25 10:27
作者:李升义
说明:SED1335驱动的320*240LCD操作文件。所用LCM为台湾华凌光电的WG320240B。
硬件接口:
WG320240B引脚序号 连接方式
1...Vss.....Ground 接地
2...Vdd.....Power supply for logic LCM电源,+5V
3...VO......Driving voltage for LCD LCM对比度调节
4...AO......P3^0 数据/命令方式选择
5.../WR.....P3.1 写有效(低电平)
6.../RD.....P3.2 读有效(低电平)
7...D0 .....P5.0 数据总线 D0
8...-D1 .....P5.1 数据总线 D1
9...D2 .....P5.2 数据总线 D2
10..D3 .....P5.3 数据总线 D3
11..D4 .....P5.4 数据总线 D4
12..D5 .....P5.5 数据总线 D5
13..D6 .....P5.6 数据总线 D6
14..D7 .....P5.7 数据总线 D7
15../CS.....P3.3 LCM片选(低电平)
16../RES....P3.4 LCM复位(低电平)
17..VEE.....-V out 逆变-23.5V 负电压输出
18..NC
19..NC
20..NC
******************************************************************************/
#include <stdlib.h>
#include <intrins.h>
#include <C8051F020.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
//============================ SED1335 常用指令列表 ===============================
#define SystemSet 0x40 //软件初始化指令,8个参数
uchar code SysParaTable[]=
{
0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00 //软件初始化指令参数表P1-P8
};
#define Scroll 0x44 //设置显示区域,卷动,10个参数
#define BasePart1 0x00 //显示一区起始地址
#define BasePart2 0x40 //显示二区起始地址
#define BasePart3 0x80 //显示三区起始地址
#define BasePart4 0x00 //显示四区起始地址
uchar code ScrParaTable[]= //Scroll命令参数表
{
0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
};
#define SleepIn 0x53 //空闲状态设置
#define DispOn 0x59 //开显示
#define DispOff 0x58 //关显示
#define Ovlay 0x5b //规定画面重叠显示的合成方式及显示一、三区的显示属性,指令带有一个参数。
#define HdotScr 0x5a //设置点单元卷动位置
#define CsrForm 0x5d //设置光标形状
#define CsrDirR 0x4c //光标右移
#define CsrDirL 0x4d //光标左移
#define CsrDirU 0x4e //光标上移
#define CsrDirD 0x4f //光标下移
#define CsrW 0x46 //设置光标地址
#define CsrR 0x47 //读出光标地址
#define mWrite 0x42 //数据写入显示缓冲区
#define mRead 0x43 //从显示缓冲区读数据
#define paraP9 0x28
/*
sbit A0 = P3^0; //命令数据方式选择
sbit WR = P3^1; //写信号
sbit RD = P3^2; //读信号
sbit CS = P3^3; //片选信号
sbit RST = P3^4; //复位信号
*/
/*LCM控制信号连接改为
A0:P6.0
WR:P6.1
RD:P6.2
CS:P6.3
RST:Unconnected
*/
extern char code ASC_MSK[96*16]; /*asc码库*/
extern char code HZ16_16[]; /*16*16汉字库(宋体)*/
extern char code HZ32_32[]; /*32*32汉字库(楷体)*/
extern char code HZ24_24[]; /*24*24汉字库(隶体)*/
//extern char code HZ12_12[]; /*12*12汉字库(宋体)*/
extern char code Logo[]; /*32*32公司标志*/
//===============LCM操作函数声明======================================================
void LcmInitialize( void ); /*液晶显示初始化*/
void WriteCommand( uchar CommandByte ); /*写指令*/
void WriteData( uchar dataW ); /*写参数及显示数据*/
void LcmClear( void ); /*清屏函数*/
void Delay( uint tt ); /*不精确延时函数*/
void Locatexy(uchar x,uchar y, uchar attribs); /*定位光标*/
void Point(uint Px, uchar Py, uchar attr ); /*描点*/
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att); /*划线*/
void Putstr(uchar x,uchar y, uchar *pstr,uchar flag,bit inverse); /*输出16*16汉字字符串*/
void PutHz_32(uchar x,uchar y, uchar *pstr,uchar flag); /*输出32*32汉字字符串*/
void PutHz_24(uchar x,uchar y, uchar *pstr,uchar flag); /*输出24*24汉字字符串*/
//void PutHz_12(uchar x,uchar y, uchar *pstr,uchar flag); /*输出12*12汉字字符串*/
void PutLogo(uchar x,uchar y, uchar flag); /*输出公司标志*/
void Circle(uint Ox,uchar Oy,uchar Rx,uchar attr); /*画圆*/
void Send_int(uchar wei,uchar *str,uint shu); /*整数输出到字符串*/
void SPutf(uchar *format,uchar *str,float fvar); /*浮点数输出到字符串*/
void Put_uint(uchar x,uchar y,uchar weishu,uint shu,uchar attribte,bit inverse);/*显示整数*/
void Putf(uchar x,uchar y,uchar *p,float fbuf,uchar attribte);/*显示浮点数*/
uchar ReadDataLcm( void ); /*从LCM读数据*/
void EnableCursor(uchar flag); /*显示光标并闪烁*/
/*----------------------------------
函数说明:LCM初始化
-----------------------------------*/
void LcmInitialize( void )
{
uchar i;
// RST = 0;
// RST = 1;
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++)
WriteData( SysParaTable[i] );
WriteCommand( Scroll ); //设定显示区域起始地址
for (i=0;i<10;i++)
WriteData( ScrParaTable[i] );
WriteCommand( HdotScr ); // 写入点位移指令代码
WriteData( 0 );
WriteCommand( Ovlay ); // 显示合成方式设置
WriteData( 4 ); // 0000 0100 显示一区图形,三区文本属性,二重"或"合成
WriteCommand( CsrForm ); // 设置光标形状
WriteData( 0x07 );
WriteData( 0x87 );
WriteCommand( DispOn ); // 开显示
WriteData( 0x54 ); // 显示 1~4 区开显示,光标关显示
}
/*---------------------------
// 写指令代码子程序pr
______________________________*/
void WriteCommand( uchar CommandByte )
{
P74OUT |= 0x3c;
// CS=0;
// A0=1;
// WR=0;
P6 = 0xF5;
P5=CommandByte;
P6 = 0xFf;
// WR=1;
// CS=1;
}
/*---------------------------
// 写参数及显示数据子程序
-----------------------------*/
void WriteData( uchar dataW )
{
P74OUT |= 0x3c;
// CS=0;
// A0=0;
// WR=0;
P6 = 0xF4;
P5 = dataW;
P6 = 0xFf;
// WR=1;
// CS=1;
}
/*---------------------------
// 读参数及显示数据子程序
-----------------------------*/
uchar ReadDataLcm( void )
{
uchar cbuf;
P74OUT |= 0x30;
P74OUT &= 0xf3;
P5=0xff;
// CS=0;
// A0=1;
// RD=0;
P6 = 0xF3;
cbuf=P5;
// RD=1;
// CS=1;
P6 = 0xFf;
return cbuf;
}
/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/
void LcmClear( void )
{
uint i=32768;
WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位
WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位
WriteCommand( mWrite ); // 数据写入指令,代码0x42
while(i--)
WriteData(0x00); // 写入数据0
}
//--------延时程序--------------------------
void Delay( uint tt )
{
while( tt-- );
}
/*---------------------------------------------------------------------------
光标位定位,用于在1区图形方式下。
输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
y...垂直方向以行线定位的坐标,可以定位到点单位。
左上角约定坐标为( 0, 0 )
----------------------------------------------------------------------------*/
void Locatexy(uchar x,uchar y, uchar attribs)
{
uint temp;
temp = (uint)y*paraP9+x;
if(attribs)
temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
}
/********************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
/********************************************/
// 参数类型有待修改
void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att)
{
int t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy;
uint row,col;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
col = x0;
row = y0;
if(delta_x>0)
incx=1; //设置单步方向
else
{
if( delta_x==0 )
incx=0; //垂直线
else
{
incx=-1;
delta_x=-delta_x;
}
}
if(delta_y>0)
incy=1;
else
{
if( delta_y==0 )
incy=0; //水平线
else
{
incy=-1;
delta_y=-delta_y;
}
}
if(delta_x > delta_y)
distance=delta_x; //选取基本增量坐标轴
else
distance=delta_y;
for( t=0;t <= distance+1; t++ )
{ //画线输出
Point((uint)col,row,att); //画点
xerr += delta_x ;
yerr += delta_y ;
if(xerr > distance)
{
xerr-=distance;
col+=incx;
}
if(yerr > distance)
{
yerr-=distance;
row+=incy;
}
}
}
/*====================================================
; 绘点子程序,携入参数X坐标的最高位决定写或擦点
====================================================*/
void Point(uint Px, uchar Py, uchar attr )
{
uint tempPtr;
uchar tempD,tempP;
tempPtr = (uint)Py * paraP9 + (Px & 0x7fff)/8; // 去除最高位(显示属性)
WriteCommand( CsrDirD ); // CSRDIR 代码(光标自动下移)
WriteCommand( CsrW ); // 设置光标地址
WriteData( (uchar)(tempPtr & 0xff) );
WriteData( (uchar)(tempPtr /256) );
WriteCommand( mRead ); // 读显示ram指令
tempD = ReadDataLcm(); // 读取当前显示数据
tempP = 1<<(uchar)(7-Px & 0x0007);
// 根据预定属性决定写点或擦除
if( attr )
tempD |= tempP; // 画点
else
tempD &= ~tempP; // 消点
WriteCommand( CsrW ); // 重新设置光标地址
WriteData( (uchar)(tempPtr & 0xff) );
WriteData( (uchar)(tempPtr /256) );
WriteCommand( mWrite ); // 代码0x42,数据写入指令
WriteData( tempD ); // 写入合成数据
}
/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/************************************************/
void Circle(uint Ox,uchar Oy,uchar Rx,uchar attr)
{
uint xx,rr,xt,yt,rs,col,row;
yt=Rx;
rr=Rx*Rx+1; //补偿 1 修正方形
rs=(yt+(yt>>1))>>1; //(*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))yt--;
col=Ox+xt; //第一象限
row=Oy-yt;
Point(col,row,attr);
col=Ox-xt; //第二象限
Point(col,row,attr);
row=Oy+yt; //第三象限
Point(col,row,attr);
col=Ox+xt; //第四象限
Point(col,row,attr);
/***************45度镜象画另一半***************/
col=Ox+yt; //第一象限
row=Oy-xt;
Point(col,row,attr);
col=Ox-yt; //第二象限
Point(col,row,attr);
row=Oy+xt; //第三象限
Point(col,row,attr);
col=Ox+yt; //第四象限
Point(col,row,attr);
}
}
/**********************************************
ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
*ptr...字符串指针,本函数所指的是flash字串
att....显示区标志,0...第一区;1...第二区
***********************************************/
void Putstr(uchar x,uchar y,uchar *pstr,uchar flag,bit inverse)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -