📄 lcd显示主程序.c
字号:
/***************************************************************************\
文件名称: LCD(430)
芯片类型:MSP430F149 ,HG192646 液晶模块
开发软件:IAR Embedded Workbench 4.0,Windows XP
程序功能:LCD显示程序(显示字符和波形 )
\***************************************************************************/
/***************************************************************************\
液晶屏分为4行*12列汉字,全部使用模拟接口方式。
连线图:
*DB0---P2.0* *DB4---P2.4* *REST---P1.2* *R/W---P1.6
*DB1---P2.1* *DB5---P2.5* *CS2----P1.3* *E-----P1.7
*DB2---P2.2* *DB6---P2.6* *CS1----P1.4*
*DB3---P2.3* *DB7---P2.7* *RS-----P1.5* *
\***************************************************************************/
//头文件
#include <msp430x16x.h>
#include <math.h>
// 宏定义
#define DISPON 0x3f // 显示on
#define DISPOFF 0x3e // 显示off
#define DISPFIRST 0xc0 // 显示起始行定义
#define SETX 0x40 // X定位设定指令(列)
#define SETY 0xb8 // Y定位设定指令(页)
#define Lcdbusy 0x80 // LCM忙判断位
#define MODL 0x00 // 左区边界
#define MODM 0x40 // 左区和中区分界
#define MODR 0x80 // 中区和右区分界
#define LCMLIMIT 0xC0 // 右区边界
// 全局变量描述
unsigned char col,row,cbyte; // 列x,行(页)y,输出数据
unsigned char xy; // 画线方向标志:0 垂直 1 水平
// 函数声明
void InitCLK(void); // 时钟初始化
void InitPort(void); // 端口初始化
void Lcminit(void); // 液晶模块初始化
void Delay(unsigned char MS); // 延时,入口数为Ms
void lcdbusyL(void); // busy判断、等待(左区)
void lcdbusyM(void); // busy判断、等待(中区)
void lcdbusyR(void); // busy判断、等待(右区)
void Putedot(unsigned char Order); // 半角字符输出
void Putcdot(unsigned char Order); // 全角(汉字)输出
void Wrdata(unsigned char X); // 数据输出给LCM
void Lcmcls(void); // LCM全屏幕清零(填充0)
void wtcom(void); // 公用busy等待
void Locatexy(void); // 光标定位
void WrcmdL(unsigned char X); // 左区命令输出
void WrcmdM(unsigned char X); // 中区命令输出
void WrcmdR(unsigned char X); // 右区命令输出
void Putstr(unsigned char *puts,unsigned char i); // 中英文字符串输出
void Rollscreen(unsigned char x); // 屏幕向上滚动演示
void Rddata(void); // 从液晶片上读数据
void Linehv(unsigned char length); // 横(竖)方向画线
void point(void); // 打点
void Linexy(unsigned char endx,unsigned char endy);// 画斜线
// 数组列表
unsigned char Ezk[]; // ASCII常规字符点阵码表
unsigned char Hzk[]; // 自用汉字点阵码表
unsigned char STR1[]; // 自定义字符串
unsigned char STR2[];
unsigned char STR3[];
unsigned char STR4[];
/***************************************************************************
主程序
***************************************************************************/
void main(void)
{unsigned char x;
InitCLK(); // 时钟初始化
InitPort(); // 端口初始化
col=0;
row=0;
Delay(30); // 延时大约40Ms,等待外设准备好
Lcminit(); // 液晶模块初始化,包括全屏幕清屏
Putstr(STR2,24); // 第一行字符输出,24字节
col=0;
row=2;
Putstr(STR1,12); // 第二行字符输出,12字节
col=0;
row=4;
Putstr(STR3,24); // 第三行字符输出,24字节
col=0;
row=6;
Putstr(STR4,24); // 第四行字符输出,12字节
col=0;
row=0;
xy = 1; // 方向标志。定为水平方向
Linehv(192); // 画一条横线(0,0)-(191,0)
col=0;
row=15;
xy = 1;
Linehv(192); // 画一条横线(0,15)-(191,15)
col=0;
row=32;
xy = 1;
Linehv(192); // 画一条横线(0,32)-(191,32)
col=0;
row=1;
xy = 0; // 方向标志。定为垂直方向
Linehv(31); // 画一条竖线(0,1)-(0,31)
col=191;
row=1;
xy = 0;
Linehv(31); // 画一条竖线(191,1)-(191,31)
col=0; // 设定斜线的起点坐标
row=63;
Linexy(44,31); // 画一段斜线(0,63)-(44,31)
col=44;
row=31;
Linexy(190,62); // 继续画斜线(44,31)-(191,63)
while(1)
{
Rollscreen(x); // 定位新的起始行
x++;
x %=8;
Delay(70); // 延时,控制滚动速度
};
}
/***************************************************************************
画线。任意方向的斜线,不支持垂直的或水平线
***************************************************************************/
void Linexy(unsigned char endx,unsigned char endy)
{register unsigned char t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
signed char incx,incy;
/* compute the distance in both directions */
delta_x=endx-col;
delta_y=endy-row;
/* compute the direction of the increment ,
an increment of "0" means either a vertical or horizontal lines */
if(delta_x>0)
incx=1;
else if( delta_x==0 )
incx=0;
else
incx=-1;
if(delta_y>0)
incy=1;
else if( delta_y==0 )
incy=0;
else
incy=-1;
/* determine which distance is greater */
delta_x = fabs(delta_x);
delta_y = fabs(delta_y);
if( delta_x > delta_y )
distance=delta_x;
else
distance=delta_y;
/* draw the line */
for( t=0;t <= distance+1; t++ )
{point();
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{xerr-=distance;
col+=incx;
}
if( yerr > distance )
{yerr-=distance;
row+=incy;
}
}
}
/***************************************************************************
画线。只提供X或Y方向的,不支持斜线
***************************************************************************/
void Linehv(unsigned char length)
{unsigned char xs,ys;
if (xy)
{ys = col;
for (xs=0;xs<length;xs++)
{col = ys + xs;
point();
}
}
else
{xs = row;
for (ys=0;ys<length;ys++)
{row = xs + ys;
point();
}
}
}
/***************************************************************************
画点
***************************************************************************/
void point(void)
{unsigned char x1,y1,x,y;
x1=col;
y1=row;
row=y1>>3; // 取Y方向分页地址
Rddata();
y=y1&0x07; // 字节内位置计算
x=0x01;
x=x<<y; // 移入所画点
Wrdata(cbyte|x); // 画上屏幕
col=x1; // 恢复xy坐标
row=y1;
}
/***************************************************************************
屏幕滚动定位
***************************************************************************/
void Rollscreen(unsigned char x)
{cbyte = DISPFIRST|x; // 定义显示起始行
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}
/***************************************************************************
一个字串的输出
***************************************************************************/
void Putstr(unsigned char *puts,unsigned char i)
{unsigned char j,X;
for (j=0;j<i;j++)
{X = puts[j];
if (X&0x80)
{Putcdot(X&0x7f); // 只保留低7位*/
}
else
Putedot(X-0x20); // ascii码表从0x20开始
}
}
/***************************************************************************
半角字符点阵码数据输出
***************************************************************************/
void Putedot(unsigned char Order)
{unsigned char i,bakerx,bakery; // 共定义4个局部变量
int x; // 偏移量,字符量少的可以定义为UCHAR
bakerx = col; // 暂存x,y坐标,已备下半个字符使用
bakery = row;
x=Order * 0x10; // 半角字符,每个字符16字节
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{cbyte = Ezk[x]; // 取点阵码,rom数组
Wrdata(cbyte); // 写输出一字节
x++;
col++;
if (col==LCMLIMIT)
{col=0;row++;row++;}; // 下一列,如果列越界换行
if (row>7)
row=0; // 如果行越界,返回首行
} // 上半个字符输出结束
/*下半个字符输出,8列 */
col = bakerx; // 列对齐
row = bakery+1; // 指向下半个字符行
for(i=0;i<8;i++)
{cbyte = Ezk[x]; // 取点阵码
Wrdata(cbyte); // 写输出一字节
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; // 下一列,如果列越界换行
if (row>7)
row=1; // 如果行越界,返回首行
} // 下半个字符输出结束
row=bakery;
} // 整个字符输出结束
/***************************************************************************
全角字符点阵码数据输出
***************************************************************************/
void Putcdot(unsigned char Order)
{unsigned char i,bakerx,bakery; // 共定义3个局部变量
int x; // 偏移量,字符量少的可以定义为UCHAR
bakerx = col; // 暂存x,y坐标,已备下半个字符使用
bakery = row;
x=Order * 0x20; // 每个字符32字节
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{Wrdata(Hzk[x]); // 写输出一字节
x++;
col++;
if (col==LCMLIMIT)
{ col=0;row++;row++;} // 下一列,如果列越界换行
if (row>6)
row=0; // 如果行越界,返回首行
} // 上半个字符输出结束
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -