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