LCD1602和LCD12864程序并行与串行.docx
- 文档编号:26593313
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:22
- 大小:19.36KB
LCD1602和LCD12864程序并行与串行.docx
《LCD1602和LCD12864程序并行与串行.docx》由会员分享,可在线阅读,更多相关《LCD1602和LCD12864程序并行与串行.docx(22页珍藏版)》请在冰豆网上搜索。
LCD1602和LCD12864程序并行与串行
LCD1602和LCD12864的函数库,包括并行与串行
LCD1602基础函数
#ifndef__LCD1602_JCK_C__
#define__LCD1602_JCK_C__
/************************************************
****
**六哥LCD1602基础函数库**
****
**************************************************/
//使用请注意定义引脚
#include"yscx.c"
/*****************************************************************
LCD1602判忙函数
******************************************************************/
voidLCD1602_PM(void)
{
unsignedchartemp1;//状态信息(判断是否忙)
LCD1602_SJ=0xFF;//记得在包含该头文件前,定义引脚
LCD1602_RS=0;//记得在包含该头文件前,定义引脚
LCD1602_RW=1;//记得在包含该头文件前,定义引脚
LCD1602_E=1;//记得在包含该头文件前,定义引脚
do
{temp1=LCD1602_SJ;//记得在包含该头文件前,定义引脚
LCD1602_SJ=0xFF;
}
while(temp1&0x80);
LCD1602_E=0;//记得在包含该头文件前,定义引脚
YS_us
(1);//
}
/*------------------------------------------------
LCD1602写入命令函数
------------------------------------------------*/
voidLCD1602_XZL(unsignedcharml)
{
LCD1602_PM();//忙则等待
LCD1602_RS=0;//记得在包含该头文件前,定义引脚
LCD1602_RW=0;//记得在包含该头文件前,定义引脚
LCD1602_E=1;//记得在包含该头文件前,定义引脚
LCD1602_SJ=ml;//记得在包含该头文件前,定义引脚
YS_us
(1);//稍作延时给LCD反应的时间
LCD1602_E=0;//记得在包含该头文件前,定义引脚
if(ml==0x01|ml==0x02)YS_ms
(2);//清屏和地址归位大概需2ms时间处理
YS_us(35);//其他指令大概需35us
}
/*------------------------------------------------
LCD1602写入数据函数
------------------------------------------------*/
voidLCD1602_XSJ(unsignedcharsj)
{
LCD1602_PM();//忙则等待
LCD1602_RS=1;//记得在包含该头文件前,定义引脚
LCD1602_RW=0;//记得在包含该头文件前,定义引脚
LCD1602_E=1;//记得在包含该头文件前,定义引脚
LCD1602_SJ=sj;//记得在包含该头文件前,定义引脚
YS_us
(1);//稍作延时给LCD反应的时间
LCD1602_E=0;//记得在包含该头文件前,定义引脚
}
/*------------------------------------------------
LCD1602初始化函数
------------------------------------------------*/
voidLCD1602_CSH(void)
{
LCD1602_XZL(0x38);/*显示模式设置*/
LCD1602_XZL(0x08);/*显示光标移动设置*/
LCD1602_XZL(0x01);/*显示开及光标设置*/
LCD1602_XZL(0X06);
LCD1602_XZL(0X0c);
}
#endif
LCD1602显示函数
#ifndef__LCD1602_XSK_C__
#define__LCD1602_XSK_C__
/************************************************
****************
*******六哥LCD1602显示函数库*********
****************
************************************************/
#include"yscx.C"
#include"LCD1602_JCK_cx.C"
//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表
unsignedcharcodeascll1602[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
/******************************************************
***************LCD1602数制显示(十或十六)************
*******************************************************
sj:
需要显示的数据
ml:
显示地址设定
xsfs:
显示方式,进制和小数点的判断依据,
*/
voidLCD1602_SZXS(signedlongsj,unsignedcharxsfs,ml)///wei为1输出十六进制,否则输出十进制
{
unsignedlongxc;//显示缓存
unsignedchara;
bitxsd,fs,bf=0;
xsd=0;
fs=0;
LCD1602_XZL(0x04);//设置光标向左移
LCD1602_XZL(ml);
if(xsfs>10)
{a=16;//输出十六进制
LCD1602_XSJ(0x48);//显示H
xsfs=0;}//
else
{a=10;//否则输出十进制
if(xsfs!
=0)xsd=1;//显示小数点使能
if(sj<0)
{sj=~sj+1;
fs=1;}//显示负号使能
}
xc=sj;
if(xc!
=0)//显示数据不为0;则显示
{while(xsd)//判是否需要显示小数
{if(xc!
=0)//是否还需要计算
{ml=xc%a;
if(bf|ml!
=0)//小数部分为0不需要显示
{LCD1602_XSJ(ascll1602[ml]);//取数的ascll码并显示
bf=1;//小数部分不为0标志,小数部分数字有效
}
xc/=a;//取剩下的数
}
elseif(bf)LCD1602_XSJ(0x30);//判是否需要补0
else;//小数部分无效,不需要补0
xsfs--;
if(xsfs==0)//小数点位数减一
{xsd=0;//小数计算部分结束标志
if(bf)LCD1602_XSJ(0x2e);//小数部分存在有效数字则显示小数点
}
}
}
////////////整数显示部分////////////////////////////////////////////
do
{LCD1602_XSJ(ascll1602[xc%a]);//取数的ascll码并显示
xc/=a;
}
while(xc!
=0);
if(fs)LCD1602_XSJ(0x2d);//判是否需要显示负号
LCD1602_XZL(0x06);//还原光标移动方向
}
/********************************
LCD1602LCD1602字符显示程序
*********************************/
voidLCD1602_ZFXS(unsignedchar*SJ,t,ml)/*h:
行,SJ:
字符串指针,t:
间隔时间*/
{
LCD1602_XZL(ml);//写指令
while(*SJ)//是否显示完
{
LCD1602_XSJ(*SJ);//写数据
SJ++;//取下一个字符
YS_ms(t);//延时
}
}
#endif
LCD12864基础函数—并行
#ifndef__LCD12864_JCK_C__
#define__LCD12864_JCK_C__
/************************************************
****
**六哥LCD12864基础函数库**
****
**************************************************/
//使用请注意定义引脚
#include"yscx.c"
/********************测忙碌**********************/
//测忙碌子程序
//RS=0,RW=1,E=H,D0-D7=状态字
/************************************************/
voidLCD12864_PM(void)
{
unsignedchartemp1;//状态信息(判断是否忙)
LCD12864_RS=0;//记得在包含该头文件前,定义引脚
LCD12864_RW=1;//记得在包含该头文件前,定义引脚
LCD12864_E=1;//记得在包含该头文件前,定义引脚
do
{temp1=LCD12864_SJ;//记得在包含该头文件前,定义引脚
LCD12864_SJ=0xFF;
}
while(temp1&0x80);
LCD12864_E=0;//记得在包含该头文件前,定义引脚
YS_us
(1);//
}
/********************写命令**********************/
//写命令子程序
//
/************************************************/
voidLCD12864_XZL(unsignedcharml)/*写命令*/
{
LCD12864_PM();
LCD12864_RS=0;//记得在包含该头文件前,定义引脚
LCD12864_RW=0;//记得在包含该头文件前,定义引脚
LCD12864_E=1;//记得在包含该头文件前,定义引脚
LCD12864_SJ=ml;//记得在包含该头文件前,定义引脚
YS_us(0);//稍作延时给LCD反应的时间
LCD12864_E=0;//记得在包含该头文件前,定义引脚
if(ml==0x01|ml==0x02)YS_ms(3);//清屏和地址归位大概需3ms时间处理
YS_us(50);//其他指令大概需50us
}
/********************写数据**********************/
//写数据子程序
//
/************************************************/
voidLCD12864_XSJ(unsignedcharsj)
{
LCD12864_PM();
LCD12864_RS=1;//记得在包含该头文件前,定义引脚
LCD12864_RW=0;//记得在包含该头文件前,定义引脚
LCD12864_E=1;//记得在包含该头文件前,定义引脚
LCD12864_SJ=sj;//记得在包含该头文件前,定义引脚
YS_us(0);//稍作延时给LCD反应的时间
LCD12864_E=0;//记得在包含该头文件前,定义引脚
}
/********************初始化**********************/
//复位、通讯方式选择
/************************************************/
voidLCD12864_CSH(void)
{
P26=1;//通讯方式为并口PSB=1,在设计电路时就把PSB端焊好,节省I/O
//LCD12864_XZL(0x34);//34H--扩充指令操作
LCD12864_XZL(0x30);//功能设置,一次送8位数据,基本指令集
LCD12864_XZL(0x0C);//0000,1100整体显示,游标off,游标位置off
LCD12864_XZL(0x01);//0000,0001清DDRAM
LCD12864_XZL(0x02);//0000,0010DDRAM地址归位
LCD12864_XZL(0x80);//1000,0000设定DDRAM7位地址000,0000到地址计数器AC
LCD12864_XZL(0x06);
}
#endif
LCD12864基础函数—串行
#ifndef__LCD12864_JCK_CX_C__
#define__LCD12864_JCK_CX_C__
/************************************************
****
**六哥LCD12864基础函数库**
**串行**
**************************************************/
//使用请注意定义引脚
#include"yscx.c"
/*******************串行通信*********************
分别发送三个字节,11111AB0,DDDD0000,SSSS000,
A:
即表示并行的RW,1为读,0为写
B:
即表示并行的RS,1为数据,0为指令
D:
即表示并行的高四位数据
S:
即表示并行的低四位数据
注:
串行要把PSB端为低电平
*************************************************/
voidLCD12864_CXTX(unsignedcharfs,sj)
{
unsignedchari;
LCD12864_E=0;//时钟SCLK
LCD12864_RS=1;///CS片选
do////LCD判忙=============
{
for(i=0;i<8;i++)
{
YS_us
(1);//MCU与LCD速率匹配
if(i<6)LCD12864_RW=1;//读LCD数据,前6位为1;后两位为0
elseLCD12864_RW=0;//命令格式11111100B,0xfc
YS_us
(1);//MCU与LCD速率匹配
LCD12864_E=1;//时钟SCLK
YS_us
(1);//MCU与LCD速率匹配
LCD12864_E=0;//时钟SCLK
}
YS_us(5);//给LCD反应的时间
LCD12864_E=1;//时钟SCLK
YS_us
(1);//给LCD反应的时间
}
while(LCD12864_RW);//判忙只需要取最高位,而不管后面7位
LCD12864_E=0;//时钟SCLK
LCD12864_RS=0;///CS片选
YS_us
(1);//给LCD反应的时间
LCD12864_RS=1;///CS片选
for(i=0;i<24;i++)//、、、、送3字节
{
LCD12864_RW=fs&0x80;//数据SID
fs<<=1;
YS_us
(1);//MCU与LCD速率匹配
LCD12864_E=1;//时钟SCLK
YS_us
(1);//MCU与LCD速率匹配
if(i==7)fs=sj&0xf0;//取数据高四位
if(i==15)fs=sj<<4;//取数据低四位
LCD12864_E=0;//时钟SCLK
YS_us
(1);//MCU与LCD速率匹配
}
LCD12864_RS=0;///CS片选
LCD12864_E=1;//恢复高电平不影响其他用途
LCD12864_RW=1;//恢复高电平不影响其他用途
}
/********************写命令**********************/
voidLCD12864_XZL(unsignedcharml)/*写命令*/
{
LCD12864_CXTX(0xf8,ml);//命令格式11111000B,0xf8
if(ml==0x01|ml==0x02)YS_ms(4);//清屏和地址归位大概需4ms时间处理
YS_us(50);//其他指令大概需50us
}
/********************写数据**********************/
voidLCD12864_XSJ(unsignedcharsj)
{
LCD12864_CXTX(0xfa,sj);//命令格式11111010B,0xfa
}
/********************初始化**********************/
//复位、通讯方式选择
/************************************************/
voidLCD12864_CSH(void)
{
P26=0;//通讯方式为串行通信PSB=0,在设计电路时就把PSB端焊好,节省I/O
//LCD12864_XZL(0x34);//34H--扩充指令操作
LCD12864_XZL(0x30);//功能设置,一次送8位数据,基本指令集
LCD12864_XZL(0x0C);//0000,1100整体显示,游标off,游标位置off
LCD12864_XZL(0x01);//0000,0001清DDRAM
LCD12864_XZL(0x80);//1000,0000设定DDRAM7位地址000,0000到地址计数器AC
LCD12864_XZL(0x06);
}
#endif
LCD12864显示函数
#ifndef__LCD12864_XSK_C__
#define__LCD12864_XSK_C__
/************************************************
****************
*******六哥LCD12864显示函数库*********
****************
************************************************/
//使用请注意定义引脚
#include"LCD12864_JCK_cx.C"//包含基础库
//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表
unsignedcharcodeascll12864[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
/*****************************************************
**********LCD12864设置显示地址函数*********************
******************************************************/
unsignedcharLCD12864_SZDZ(unsignedcharx,y)//
{
switch(y)
{case0:
x|=0x80;break;
case1:
x|=0x90;break;
case2:
x|=0x88;break;
case3:
x|=0x98;break;
default:
;
}
return(x);
}
/*****************************************************
**********LCD12864数制显示函数************************
******************************************************
sj:
需要显示的数据,取值范围:
十进制:
-2147483648-2147483647,十六进制:
0H-7FFFFFFFH
xsfs:
显示方式,进制和小数点的判断依据,
x:
显示列,取值范围0-7
y:
显示行,取值范围0-3
*/
voidLCD12864_SZXS(signedlongsj,unsignedcharxsfs,x,y)
{
unsignedlongxc;//显示缓存
unsignedchard[13];
bitxsd,fs,bf=0;
xsd=0;
fs=0;
LCD12864_XZL(0x04);//设置光标左移
LCD12864_XZL(LCD12864_SZDZ(x,y));//写入显示地址
y=0;
if(xsfs>10)
{x=16;//输出十六进制
d[y]=0x48;//十六进制显示H
y++;
}//
else
{if(sj<0)//十进制正负数判断
{sj=~sj+1;
fs=1;}//负号显示使能
if(xsfs!
=0)xsd=1;//小数点显示使能
x=10;
}//
xc=sj;
if(xc!
=0)//显示数据不为0;则显示
{while(xsd)//判是否需要显示小数
{if(xc!
=0)//是否还需要计算
{sj=xc%x;
if(bf|sj!
=0)//小数部分为0不需要显示
{d[y]=ascll12864[xc%x];
y++;//取数的ascll码并显示
bf=1;//小数部分不为0标志,小数部分数字有效
}
xc/=x;//取剩下的数
}
elseif(bf)
{d[y]=0x30;//判是否需要补0
y++;}
else;//小数部分无效,不需要补
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 LCD12864 程序 并行 串行