12864并口函数文件.docx
- 文档编号:24666974
- 上传时间:2023-05-30
- 格式:DOCX
- 页数:24
- 大小:19.27KB
12864并口函数文件.docx
《12864并口函数文件.docx》由会员分享,可在线阅读,更多相关《12864并口函数文件.docx(24页珍藏版)》请在冰豆网上搜索。
12864并口函数文件
//---------------************----------------------------------------------
//------------------*****************--------------------------------------
//12864的C文件应包含单片机库文件,端口设置以及各种根据时序图得来的功能函数。
//其中最基本的是读写和检查忙函数,并串口的区别就在于读写和检查函数以及端口设置
//主函数需包括声明函数库文件subfuncs.h及显示内容库文件dispdata.h。
//
//1、12864如只想写一个字符的话,先发送地址指令,再发送那个字符的十六进制ASCII
//数据内容给12864.这跟串口操作原理一样。
//2、如数组中存储一个数字,要显示这个数字,记得要用这个语句:
//Write_Data(dN[i]+0x30);
//--------------------*******************----------------------------------
//-----------------------******************--------------------------------
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
//端口配置
#defineLCD_DataInP4DIR=0x00//数据口方向设置为输入
#defineLCD_DataOutP4DIR=0xff//数据口方向设置为输出
#defineLCD2MCU_DataP4IN
#defineMCU2LCD_DataP4OUT
#defineLCD_CMDOutP3DIR|=0x07//P3口的低三位设置为输出
#defineLCD_RS_HP3OUT|=BIT0//P3.0
#defineLCD_RS_LP3OUT&=~BIT0//P3.0
#defineLCD_RW_HP3OUT|=BIT1//P3.1
#defineLCD_RW_LP3OUT&=~BIT1//P3.1
#defineLCD_EN_HP3OUT|=BIT2//P3.2
#defineLCD_EN_LP3OUT&=~BIT2//P3.2
/*******************************************
函数名称:
Delay_1ms
功能:
延时约1ms的时间
参数:
无
返回值:
无
********************************************/
voidDelay_1ms(void)
{
uchari;
for(i=150;i>0;i--)_NOP();
}
/*******************************************************************
函数名称:
Delay_Nms
功能:
延时N个1ms的时间
参数:
n--延时长度
返回值:
无
注意:
如果知道系统MCLK为8Mhz,且没用到定时器A则可用以下函数
精确定时Nms。
真的要使用以下函数时,复制粘贴其函数体内容到
Delay_Nms函数内容即可,无需改Delay_Nms其名字,否则12864下面
的函数将调用不了Delay_Nms函数。
函数名称:
DelayNus
功能:
实现N个微秒的延时
参数:
n--延时长度
返回值:
无
说明:
函数通过定时器A取得精确的定时时间!
!
!
定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
注意:
定时器A使用的时钟源可设置为SMCLK,
定时一定时间时,可设置时钟源、分频数、CCR0、计数模式,
等待到中断标志TAIFG置位时停止计数,不必进入中断!
也进入不了中断!
要想进入中断程序,设置CCR0前,必须设置CCIFG中断标志位才能进入中断!
也就是,在设置CCR0前,需编写这么一句:
CCTL0=CCIE;//设置捕捉CCIFG中断。
voidDelayNus(uintn)
{
TACTL|=TASSEL_2+ID_3;//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
CCR0=n;//1Mhz的计数时钟,则CCR0=1时捕捉的是1us
TACTL|=MC_1;//增计数到CCR0
while(!
(TACTL&BIT0));//等待定时Nus后置位中断标志TAIFG
TACTL&=~MC_1;//停止计数,在于清除了计数器设置!
TACLR=1。
TACTL&=~BIT0;//清除中断标志
}
*****************************************************************************/
voidDelay_Nms(uintn)
{
uinti;
for(i=n;i>0;i--)Delay_1ms();
}
/*******************************************
函数名称:
Check_Busy
功能:
检查忙标志,一直到系统不忙为止
参数:
无
返回值:
无
********************************************/
voidCheck_Busy(void)
{
ucharlcdtemp=0;
LCD_CMDOut;//P3口的低三位设置为输出
LCD_RS_L;
LCD_RW_H;//先读忙
LCD_DataIn;//P4端口设置为输出
do//判忙判断的是最高位数据
{
LCD_EN_H;//EN高
_NOP();//等一段时间
lcdtemp=LCD2MCU_Data;//读取LCD忙碌状态
LCD_EN_L;//EN低
}
while(lcdtemp&0x80);//一直等到LCD不忙为止才跳出函数
}
/*******************************************
函数名称:
Write_Cmd
功能:
向液晶中写控制命令
参数:
cmd--控制命令
返回值:
无
明确:
向液晶写控制命令和显示数据的时序图都相同
指令RS低,数据RS高
********************************************/
voidWrite_Cmd(ucharcmd)
{
Check_Busy();
LCD_DataOut;
LCD_RS_L;
LCD_RW_L;
MCU2LCD_Data=cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
Write_Data
功能:
向液晶中写显示数据
参数:
dat--显示数据
返回值:
无
********************************************/
voidWrite_Data(uchardat)
{
Check_Busy();
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
Read_Data
功能:
从液晶中读取数据
参数:
无
返回值:
RData--液晶内部字符型数据
********************************************/
ucharRead_Data(void)
{
ucharRData;
LCD_DataIn;
Check_Busy();
LCD_RS_H;
LCD_RW_H;
LCD_EN_L;
LCD_EN_H;
RData=LCD2MCU_Data;
LCD_EN_L;
returnRData;//将LCD状态字返回给函数
}
/*******************************************
函数名称:
Ini_Lcd
功能:
初始化液晶模块
参数:
无
返回值:
无
********************************************/
voidIni_Lcd(void)
{
LCD_CMDOut;//液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30);//基本指令集
Delay_1ms();
Write_Cmd(0x02);//地址归位
Delay_1ms();
Write_Cmd(0x0c);//整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01);//清除显示
Delay_1ms();
Write_Cmd(0x06);//游标右移
Delay_1ms();
Write_Cmd(0x80);//设定显示的起始地址
}
/*******************************************
函数名称:
Disp_HZ
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针,其实指向一个汉字的编码
num--显示字符个数
返回值:
无
明确:
写的命令对应的是液晶地址
在于命令是在内部ROM里面!
写的数据对应的是显示内容
********************************************/
voidDisp_HZ(ucharaddr,constuchar*pt,ucharnum)
{
uchari;
Write_Cmd(addr);
for(i=0;i<(num*2);i++)
Write_Data(*(pt++));
}
/*******************************************
函数名称:
Lcd_Print
功能:
在坐标(x,y)处连续显示一个字符串!
x*y=8*4=32处位置。
参数:
x--------------取数字0-7,在于一行显示8个字
y--------------取数字0-3,在于一列显示4个字
adata----------指向显示字符串数据(汉字或字母或数字或符号)的指针
返回值:
无
********************************************/
voidLcd_Print(ucharx,uchary,uchar*adata)
{
ucharaddress;
uchari=0;
switch(y)
{
case0:
address=0x80+x;break;
case1:
address=0x90+x;break;
case2:
address=0x88+x;break;
case3:
address=0x98+x;break;
default:
break;
}
Write_Cmd(address);
while(*(adata+i))
{
Write_Data(*(adata+i));
i++;
}
}
/*******************************************
函数名称:
Clear_GDRAM----->如何理解?
功能:
清除液晶GDRAM中的随机数据
参数:
无
返回值:
无
********************************************/
voidClear_GDRAM(void)
{
uchari,j,k;
Write_Cmd(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)//32行
{
Write_Cmd(i++);
Write_Cmd(0x80);//设定显示的起始地址
for(k=0;k<16;k++)//16列
{
Write_Data(0x00);
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k=0;k<16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30);//回到基本指令集
}
/*******************************************
函数名称:
Draw_PM
功能:
在整个液晶屏幕上画图,显示一幅128*64的图画
参数:
图形指针*ptr
返回值:
无
注意:
尚未理解此函数
********************************************/
voidDraw_PM(constuchar*ptr)
{
uchari,j,k;
Write_Cmd(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)//一行有32个字节共128位
{
Write_Cmd(i++);//一行的字节地址x
Write_Cmd(0x80);//一列的字节地址y
for(k=0;k<16;k++)//一列有16个字节共64位
{
Write_Data(*ptr++);//写入内容
}
}
i=0x80;
for(j=0;j<32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k=0;k<16;k++)
{
Write_Data(*ptr++);
}
}
Write_Cmd(0x36);//打开绘图显示
Write_Cmd(0x30);//回到基本指令集
}
/***********************************************************
函数名:
Disp_Picture
函数说明:
显示一幅128*64的图画
传入参数:
图形指针*img
传出参数:
无
返回值:
无
**********************************************************/
voidDisp_Picture(uchar*img)
{
uchari,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
Write_Cmd(0x34);//打开扩展指令集
Write_Cmd(0x80+j);
Write_Cmd(0x80+i);
Write_Cmd(0x30);//回到基本指令集
Write_Data(img[j*16+i*2]);
Write_Data(img[j*16+i*2+1]);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
Write_Cmd(0x34);
Write_Cmd(0x80+j-32);
Write_Cmd(0x80+(i+8));
Write_Cmd(0x30);
Write_Data(img[j*16+i*2]);
Write_Data(img[j*16+i*2+1]);
}
}
Write_Cmd(0x36);//打开绘图显示
}
/*******************************************
函数名称:
Draw_TX
功能:
显示一个16*16大小的图形
参数:
Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值:
无
********************************************/
voidDraw_TX(ucharYaddr,ucharXaddr,constuchar*dp)
{
ucharj;
uchark=0;
Write_Cmd(0x01);//清屏,只能清除DDRAM
Write_Cmd(0x34);//使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++);//Y地址
Write_Cmd(Xaddr);//X地址
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36);//打开绘图显示
Write_Cmd(0x30);//回到基本指令集模式
}
/***********************************************************
函数名:
DispU_Picture
函数说明:
上半屏显示一幅128*32的图画
传入参数:
图形指针*img
传出参数:
无
返回值:
无
**********************************************************/
voidDispU_Picture(uchar*img)
{
uchari,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
Write_Cmd(0x34);//使用扩展指令集,关闭绘图显示
Write_Cmd(0x80+j);
Write_Cmd(0x80+i);
Write_Cmd(0x30);//回到基本指令集模式
Write_Data(img[j*16+i*2]);
Write_Data(img[j*16+i*2+1]);
}
}
Write_Cmd(0x36);
}
/***********************************************************
函数名:
DispD_Picture
函数说明:
下半屏显示一幅128*32的图画
传入参数:
图形指针*img
传出参数:
无
返回值:
无
**********************************************************/
voidDispD_Picture(uchar*img)
{
uchari,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
Write_Cmd(0x34);//使用扩展指令集,关闭绘图显示
Write_Cmd(0x80+j);
Write_Cmd(0x80+(i+8));
Write_Cmd(0x30);//回到基本指令集模式
Write_Data(img[j*16+i*2]);
Write_Data(img[j*16+i*2+1]);
}
}
Write_Cmd(0x36);
}
/***********************************************************
函数名:
Draw_Point
函数说明:
画点
传入参数:
打点位置(x0,y0);color=1,点亮;color=0,擦除
传出参数:
无
返回值:
无
**********************************************************/
voidDraw_Point(ucharx,uchary,ucharcolor)
{
ucharrow,collum,cbite;
uchartempH,tempL;
Write_Cmd(0x34);
Write_Cmd(0x36);
collum=x>>4;
cbite=x&0x0f;
if(y<32)
row=y;
else
{row=y-32;
collum+=8;
}
Write_Cmd(0x80+row);
Write_Cmd(0x80+collum);
Read_Data();
tempH=Read_Data();
tempL=Read_Data();
Write_Cmd(0x80+row);
Write_Cmd(0x80+collum);
if(color)
{
if(cbite<8)
{
tempH|=(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL|=(1<<(15-cbite));
}
}
else
{
if(cbite<8)
{
tempH&=~(1<<(7-cbite));
//tempL=(1<<(7-cbite));
}
else
{
//tempH=(1<<(15-cbite));
tempL&=~(1<<(15-cbite));
}
}
Write_Data(tempH);
Write_Data(tempL);
Write_Cmd(0x30);
}
/***********************************************************
函数名:
Draw_RowLine
函数说明:
画水平线
传入参数:
(x0,y0),水平线的起点;(x1,y0)水平线的终点
color=1,点亮;color=0,擦除
传出参数:
无
返回值:
无
**********************************************************/
voidDraw_RowLine(ucharx0,uchary0,ucharx1,ucharcolor)
{
uchartemp;
if(x0>x1)//对x0、x1大小进行排列,以便画图
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 并口 函数 文件