12864液晶430单片机并口和串口C++类库.docx

上传人:b****1 文档编号:28990010 上传时间:2023-07-20 格式:DOCX 页数:76 大小:26.65KB
下载 相关 举报
12864液晶430单片机并口和串口C++类库.docx_第1页
第1页 / 共76页
12864液晶430单片机并口和串口C++类库.docx_第2页
第2页 / 共76页
12864液晶430单片机并口和串口C++类库.docx_第3页
第3页 / 共76页
12864液晶430单片机并口和串口C++类库.docx_第4页
第4页 / 共76页
12864液晶430单片机并口和串口C++类库.docx_第5页
第5页 / 共76页
点击查看更多>>
下载资源
资源描述

12864液晶430单片机并口和串口C++类库.docx

《12864液晶430单片机并口和串口C++类库.docx》由会员分享,可在线阅读,更多相关《12864液晶430单片机并口和串口C++类库.docx(76页珍藏版)》请在冰豆网上搜索。

12864液晶430单片机并口和串口C++类库.docx

12864液晶430单片机并口和串口C++类库

1、并口:

/*

作者:

月&传说

时间:

2013-2-4

转载和复制请保留此信息

*/

typedefunsignedcharuchar;

typedefunsignedintuint;

typedefunsignedlongulong;

#include//仅限于80或更多脚的型号。

#defineDIYIHANG0x80//第一行的地址

#defineDIERHANG0x90//第二行的地址

#defineDISANHANG0x88//第三行的地址

#defineDISIHANG0x98//第四行的地址

#defineFANBAI1

#defineZHENGCHANG0//反白定义

#defineZUO1

#defineYOU0//方向定义,确定字符显示靠左还是靠右

#defineLCD_DataIn*shujudir=0x00//数据口方向设置为输入

#defineLCD_DataOut*shujudir=0xff//数据口方向设置为输出

#defineLCD2MCU_Data*shujuin

#defineMCU2LCD_Data*shujuout

#defineLCD_CMDOut*kongzhidir|=rs+rw+en//控制口的三个控制位设置为输出

#defineLCD_RS_H*kongzhiout|=rs

#defineLCD_RS_L*kongzhiout&=~rs

#defineLCD_RW_H*kongzhiout|=rw

#defineLCD_RW_L*kongzhiout&=~rw

#defineLCD_EN_H*kongzhiout|=en

#defineLCD_EN_L*kongzhiout&=~en

/*******************************************

函数名称:

YanChiNus

功能:

实现N个微秒的延时

参数:

n--延时长度

返回值:

说明:

定时器A的计数时钟是2MHz,CPU主频16MHz

所以通过定时器延时能够得到极为精确的

us级延时。

使用前要打开XT2晶体并设置好定时器A的时钟为2M的子系统时钟,不分频。

TACTL|=TASSEL_2;

********************************************/

voidYanChiNus(uintn)

{

TACTL|=TASSEL_2;

intt=n*2;

TACTL|=MC_2+TACLR;//连续计数

while(TAR

TACTL&=~MC_2;//停止计数

TACTL&=~BIT0;//清除中断标志

}

/*******************************************

函数名称:

YanChiNms

功能:

延时N个1ms的时间

参数:

n--延时长度

返回值:

说明:

使用定时器B延迟,使用前腰设置好定时器B的时钟为32768的辅助时钟,分频系数为8分频。

TBCTL|=TBSSEL_1+ID_3;

********************************************/

voidYanChiNms(uintn)

{

TBCTL|=TBSSEL_1+ID_3;

intt=(int)(n*4.096);

TBCTL|=MC_2+TBCLR;//连续计数

while(TBR

TBCTL&=~MC_2;//停止计数

TBCTL&=~BIT0;//清除中断标志

}

classYeJing

{

private:

uchar*shujudir;

uchar*kongzhidir;

ucharrs;

ucharrw;

ucharen;

uchar*shujuin;

uchar*shujuout;

uchar*kongzhiout;

voidLCDChuShiHua(void);

voidXieMingLing(ucharcmd);

voidXieShuJu(uchardat);

ucharDuShuJu(void);

public:

YeJing(void);

YeJing(ucharsj,ucharkz);

YeJing(ucharsj,ucharkz,ucharrs_,ucharrw_,ucharen_);

voidQingChuGDRAM(void);

voidTuXiang1616(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp,ucharfanbai=ZHENGCHANG);

voidXianShiHanZi(ucharaddr,constuchar*pt,ucharnum);

voidXianShiZiFu(ucharaddr,constucharpt,ucharfangxiang=ZUO);

voidXianShiTuPian(constuchar*ptr,ucharfanbai=ZHENGCHANG);

voidXianShiRenYiTuPian(ucharxddr,ucharyddr,ucharx,uchary,constuchar*ptr);

/*******************************************

函数名称:

QingChuHanZi

功能:

清除液晶上显示的汉字。

参数:

返回值:

********************************************/

voidQingChuHanZi(void)

{

XieMingLing(0x01);

}

};

/*

以下三个构造函数将液晶的端口和控制位设置好。

使用构造函数时,参数为各端口的DIR寄存器。

注意:

参数后要加_,如P7DIR_。

默认P7口为数据口,P8口前4位(0-3)为控制口。

*/

YeJing:

:

YeJing(void)

{

shujudir=(uchar*)P7DIR_;

kongzhidir=(uchar*)P8DIR_;

rs=BIT0;

rw=BIT1;

en=BIT2;

shujuin=(uchar*)P7IN_;

shujuout=(uchar*)P7OUT_;

kongzhiout=(uchar*)P8OUT_;

LCDChuShiHua();

}

YeJing:

:

YeJing(ucharsj,ucharkz)

{

shujudir=(uchar*)sj;

kongzhidir=(uchar*)kz;

rs=BIT0;

rw=BIT1;

en=BIT2;

if((shujudir==(uchar*)P7DIR_)||(shujudir==(uchar*)P8DIR_))

{

shujuin=(uchar*)(sj-4);

shujuout=(uchar*)(sj-2);

}

else

{

shujuin=(uchar*)(sj-2);

shujuout=(uchar*)(sj-1);

}

if((kongzhidir==(uchar*)P7DIR_)||(kongzhidir==(uchar*)P8DIR_))

kongzhiout=(uchar*)(kz-2);

else

kongzhiout=(uchar*)(kz-1);

LCDChuShiHua();

}

YeJing:

:

YeJing(ucharsj,ucharkz,ucharrs_,ucharrw_,ucharen_)

{

shujudir=(uchar*)sj;

kongzhidir=(uchar*)kz;

rs=rs_;

rw=rw_;

en=en_;//注意:

控制位设置要用只有一位为1的uchar数值,如0x02、BIT3等。

if((shujudir==(uchar*)P7DIR_)||(shujudir==(uchar*)P8DIR_))

{

shujuin=(uchar*)(sj-4);

shujuout=(uchar*)(sj-2);

}

else

{

shujuin=(uchar*)(sj-2);

shujuout=(uchar*)(sj-1);

}

if((kongzhidir==(uchar*)P7DIR_)||(kongzhidir==(uchar*)P8DIR_))

kongzhiout=(uchar*)(kz-2);

else

kongzhiout=(uchar*)(kz-1);

LCDChuShiHua();

}

/*******************************************

函数名称:

LCDChuShiHua

功能:

初始化液晶模块

参数:

返回值:

********************************************/

voidYeJing:

:

LCDChuShiHua(void)

{

DingShiQiBFenPin;

_EINT();

LCD_CMDOut;//液晶控制端口设置为输出

//Delay_Nms(500);

XieMingLing(0x30);//基本指令集

YanChiNms

(1);

XieMingLing(0x02);//地址归位

YanChiNms

(1);

XieMingLing(0x0c);//整体显示打开,游标关闭

YanChiNms

(1);

XieMingLing(0x01);//清除显示

YanChiNms

(1);

XieMingLing(0x06);//游标右移

YanChiNms

(1);

XieMingLing(0x80);//设定显示的起始地址

}

/*******************************************

函数名称:

XieMingLing

功能:

向液晶中写控制命令

参数:

cmd--控制命令

返回值:

********************************************/

voidYeJing:

:

XieMingLing(ucharcmd)

{

ucharlcdtemp=0;

LCD_RS_L;

LCD_RW_H;

LCD_DataIn;

do//判忙

{

LCD_EN_H;

_NOP();

lcdtemp=LCD2MCU_Data;

LCD_EN_L;

}

while(lcdtemp&0x80);

LCD_DataOut;

LCD_RW_L;

MCU2LCD_Data=cmd;

LCD_EN_H;

_NOP();

LCD_EN_L;

}

/*******************************************

函数名称:

XieShuJu

功能:

向液晶中写显示数据

参数:

dat--显示数据

返回值:

********************************************/

voidYeJing:

:

XieShuJu(uchardat)

{

ucharlcdtemp=0;

LCD_RS_L;

LCD_RW_H;

LCD_DataIn;

do//判忙

{

LCD_EN_H;

_NOP();

lcdtemp=LCD2MCU_Data;

LCD_EN_L;

}

while(lcdtemp&0x80);

LCD_DataOut;

LCD_RS_H;

LCD_RW_L;

MCU2LCD_Data=dat;

LCD_EN_H;

_NOP();

LCD_EN_L;

}

/*******************************************

函数名称:

DuShuJu

功能:

从液晶中读显示数据

参数:

返回值:

显示数据

********************************************/

ucharYeJing:

:

DuShuJu(void)

{

ucharlcdtemp=0;

uchardat;

LCD_RS_L;

LCD_RW_H;

LCD_DataIn;

do//判忙

{

LCD_EN_H;

_NOP();

lcdtemp=LCD2MCU_Data;

LCD_EN_L;

}

while(lcdtemp&0x80);

LCD_DataIn;

LCD_RS_H;

LCD_RW_H;

LCD_EN_H;

_NOP();

dat=LCD2MCU_Data;

LCD_EN_L;

returndat;

}

/*******************************************

函数名称:

QingChuGDRAM

功能:

清除液晶GDRAM中的随机数据

参数:

返回值:

********************************************/

voidYeJing:

:

QingChuGDRAM(void)

{

uchari,j,k;

XieMingLing(0x34);//打开扩展指令集

i=0x80;

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x80);

for(k=0;k<16;k++)

{

XieShuJu(0x00);

}

}

i=0x80;

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x88);

for(k=0;k<16;k++)

{

XieShuJu(0x00);

}

}

XieMingLing(0x30);//回到基本指令集

}

/*******************************************

函数名称:

TuXiang1616

功能:

显示一个16*16大小的图形

参数:

Yaddr--Y地址

Xaddr--X地址

dp--指向图形数据存放地址的指针

返回值:

屏幕分两块显示,上面两行的X坐标和显示汉字的相同,第二行和第一行的X坐标等效。

Y坐标表示图片距上边距的像素点,范围为0x80~0x9f。

********************************************/

voidYeJing:

:

TuXiang1616(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp,ucharfanbai)

{

ucharj;

uchark=0;

//XieMingLing(0x01);//清屏,只能清除DDRAM

XieMingLing(0x34);//使用扩展指令集,关闭绘图显示

if(fanbai)

for(j=0;j<16;j++)

{

XieMingLing(Yaddr++);//Y地址

XieMingLing(Xaddr);//X地址

XieShuJu(~dp[k++]);

XieShuJu(~dp[k++]);

}

else

for(j=0;j<16;j++)

{

XieMingLing(Yaddr++);//Y地址

XieMingLing(Xaddr);//X地址

XieShuJu(dp[k++]);

XieShuJu(dp[k++]);

}

XieMingLing(0x36);//打开绘图显示

XieMingLing(0x30);//回到基本指令集模式

}

/*******************************************

函数名称:

XianShiHanZi

功能:

控制液晶显示汉字

参数:

addr--显示位置的首地址

pt--指向显示数据的指针

num--显示字符个数

返回值:

第一行:

0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87

第二行:

0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97

第三行:

0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f

第四行:

0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f

********************************************/

voidYeJing:

:

XianShiHanZi(ucharaddr,constuchar*pt,ucharnum)

{

uchari;

XieMingLing(addr);

for(i=0;i<(num*2);i++)

XieShuJu(*(pt++));

}

/*******************************************

函数名称:

XianShiZiFu

功能:

控制液晶显示汉字

参数:

addr--显示位置的首地址

pt--要显示的字符

fangxiang--字符靠左还是靠右

返回值:

第一行:

0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87

第二行:

0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97

第三行:

0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f

第四行:

0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f

********************************************/

voidYeJing:

:

XianShiZiFu(ucharaddr,constucharpt,ucharfangxiang)

{

XieMingLing(addr);

if(fangxiang)

{

XieShuJu(pt);

XieShuJu(0x20);

}

else

{

XieShuJu(0x20);

XieShuJu(pt);

}

}

/*******************************************

函数名称:

XianShiTuPian

功能:

在整个液晶屏幕上画图

参数:

ptr--图像指针

返回值:

********************************************/

voidYeJing:

:

XianShiTuPian(constuchar*ptr,ucharfanbai)

{

uchari,j,k;

XieMingLing(0x01);

XieMingLing(0x34);//打开扩展指令集

i=0x80;

if(fanbai)

{

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x80);

for(k=0;k<16;k++)

{

XieShuJu(~(*ptr++));

}

}

i=0x80;

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x88);

for(k=0;k<16;k++)

{

XieShuJu(~(*ptr++));

}

}

}

else

{

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x80);

for(k=0;k<16;k++)

{

XieShuJu(*ptr++);

}

}

i=0x80;

for(j=0;j<32;j++)

{

XieMingLing(i++);

XieMingLing(0x88);

for(k=0;k<16;k++)

{

XieShuJu(*ptr++);

}

}

}

XieMingLing(0x36);//打开绘图显示

XieMingLing(0x30);//回到基本指令集

}

/*******************************************

函数名称:

XianSHiRenYiTuPian

功能:

在任意位置显示任意分辨率的图片。

参数:

xddr--X地址,yddr--Y地址,x--X方向的图的大小,y--Y方向图的大小,ptr--图像指针。

返回值:

********************************************/

voidYeJing:

:

XianShiRenYiTuPian(ucharxddr,ucharyddr,ucharx,uchary,constuchar*ptr)

{

uchari,j,k,w,z,m,n,xzuobiao,xzuobiao2,yzuobiao;

uchartemp[5];

XieMingLing(0x34);//打开扩展指令集

/*if(xddr<0)

xddr=0;

elseif(xddr>127)

xddr=127;

if(yddr<0)

yddr=0;

elseif(yddr>63)

yddr=63;*///限定坐标范围,防止误

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1