📄 yejing.c
字号:
/**************************************************************************
文件名:YEJING.C
功能:在指定位置显示单个字符,字符串,汉字和数值
编程者:0
时间:
**************************************************************************/
/**********************文件包含*******************************************/
#include <reg51.h>
#include <intrins.h>//////用到_nop_();///////
#include <math.h>////用到取绝对值/////
#include "yejing.h"
/**********************变量定义 **********************************/
#define Busy 0x80
#define DataPort P1 /* 定义LCD模块数据端口 */
sbit RS = P3^6; /* 定义LCD模块控制引脚,可根据需要进行修改 */
sbit RW = P3^5;
sbit E = P3^4;
//#define DataPort P0 /* 定义LCD模块数据端口 */
//sbit RS = P3^7; /* 定义LCD模块控制引脚,可根据需要进行修改 */
//sbit RW = P3^6;
//sbit E = P3^5;
//code uchar array4[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x2b,0x2d};
// 0 1 2 3 4 5 6 7 8 9 . + - //
//上面用{}的方式定义数组在程序中不容易处理,并且要查字符的代码值,很复杂//////
//code char array1[]="我爱马海莉! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char array2[]="我爱汪亲朋! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char array3[]="welcome!%";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
code char array4[]="0123456789.+- %";//数组结束一定要检查是否需要加空格接着才有%作为结束标志//////
///////此处不要轻易改动//////
code char array5[]="数值超范围! %";////数组结束一定要检查是否需要加空格接着才有%作为结束标志/////
//code char array6[]="";//
/****************************** 短延时函数 ******************************/
void Delay5Ms(void)
{
uint i = 5552;
while(i--);
}
/****************************** 长延时函数 ******************************/
void Delay400Ms(void)
{
uchar i = 5;
uint j;
while(i--)
{
j=7269;
while(j--);
};
}
/****************************** 读忙状态函数 ****************************
* 功能:在正常读写操作之前检测LCD模块的忙状态,
* DB7 = 0:LCD控制器空闲;DB7 = 1:LCD控制器忙
*************************************************************************/
void WaitForEnable( void )
{
DataPort = 0xff;
RS =0;
RW = 1;
_nop_();
E = 1;
_nop_();
_nop_();
while( DataPort & Busy );////如果Busy的值为1,则一直在此处等待,直到为0/////
E = 0;
}
/****************************** 命令写入函数 ****************************
* 功能:向LCD模块写入命令字符CMD,
* 若 AttribC = 1 检测忙信号,若 AttribC = 0 不检测忙信号
************************************************************************/
void LcdWriteCommand(uchar CMD,uchar AttribC)
{
if (AttribC) WaitForEnable(); ///检测忙信号/////
RS = 0;
RW = 0;
_nop_();
DataPort = CMD; /// 将命令字符送往数据口 ///
_nop_();
E = 1;
_nop_();
_nop_();
E = 0;
}
/**************************** 光标定位函数 ******************************
* 功能: 将显示光标定位到posx,posy坐标处
************************************************************************/
/*void LocateXY( char posx,char posy)
{
uchar temp;
temp = posx & 0x0f;////????//////
// posy &= 0x01;
switch(posy)
{
case 0: temp+=0x80;
break;
case 1: temp+=0xc0;
break;
case 2: temp+=0x94;
break;
case 3: temp+=0xd4;
break;
default: break;
}
LcdWriteCommand(temp,1);///要检测忙信号/////
}*/
/**************************** 光标定位函数 ******************************
* 功能: 将显示光标定位到posx,posy坐标处
************************************************************************/
void LocateXY( char posx,char posy)
{
uchar temper;////temper为在哪行哪个位置显示的液晶的命令值//////
temper = posx & 0x07;//对于HD44780、YLF12232F液晶的第一行为00-07/////
///////第二行为10-17//////////
posy &= 0x01;//////液晶只有两行, posy 的值只能为0和1//////
if ( posy )temper |= 0x10;////如果为第二行,temp的值为90-97/////
temper |= 0x80; ////如果为第一行,temp的值为80-87/////
LcdWriteCommand(temper,1);///要检测忙信号/////
}
/***************************** 显示字符写入函数 ***************************
* 功能:在当前光标位置显示一个字符
**************************************************************************/
void LcdWriteData( char dataW )
{
WaitForEnable(); ////检测忙信号////
RS = 1;
RW = 0;
_nop_();
DataPort = dataW; ///将显示字符的代码送往数据口////
_nop_();
E = 1;
_nop_();
_nop_();
E = 0;
}
/**************************** 显示字符串函数 *****************************
* 功能:从坐标x,y处开始显示指针ptr指定的字符串
**************************************************************************/
void Disp_strings(uchar x,uchar y, uchar *ptr)
{
while (*ptr != '%')////利用数组最后有空格作为信息结束的判断/////
{
LocateXY( x, y ); // 定位显示地址///
LcdWriteData(*ptr++ );////对于汉字一个地址要连续写两次,才能构成一个完整的汉字//////
LcdWriteData(*ptr++ );////对于字母、数字一个地址可写一次,显示时中间有一个空格//////
///////////////////////////当然也可连续写两次,显示时中间没有空格///////
// LcdWriteCommand(0x18,1);//当主程序只有文字信息显示时,此处可用于滚屏显示/////,
// Delay400Ms(); //////滚屏显示要注意延时///////
x++;////连续写两次后,地址(横坐标)加1////////
}
}
/**************************** 显示数值函数 *****************************
* 功能:从指定的坐标位置x,y处开始显示"-999.999---+999.999"范围的一个数值.
**************************************************************************/
void Disp_data(uchar x,uchar y, float ndata)
{
unsigned long z;
uchar tab1[10],tab2[10];
if(ndata<0) //////////////////第一个if-else结构开始///////////////////////////
{ //
tab1[0]=array4[12]; //
ndata=fabs(ndata); //对正负数分别赋符号///////
} //
else{tab1[0]=array4[11];} ////第一个if-else结构结束///////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////第二个if-else结构开始/////////////////////////////////////////
if((ndata<1000)&&(ndata>=0.001))////显示的数其绝对值必须在0.001-1000之间
{
z=(unsigned long)(ndata*1000);////强制类型转换//////
//tab1[0]是符号位////////////////下面是获取各位数值///////
tab1[1]=array4[z/100000]; ////获得千位信息'0-9'中的某一个/////
tab1[2]=array4[z%100000/10000];////获得百位信息'0-9'中的某一个/////
tab1[3]=array4[z%10000/1000]; ////获得十位信息'0-9'中的某一个/////
tab1[4]=array4[10];/////tab1[4]是小数点位////////
tab1[5]=array4[z%1000/100]; ////获得十分位信息'0-9'中的某一个/////
tab1[6]=array4[z%100/10]; ////获得百分位信息'0-9'中的某一个/////
tab1[7]=array4[z%10]; ////获得千分位信息'0-9'中的某一个/////
tab1[8]=array4[13]; ////tab1[9]表示的是空格字符/////
tab1[9]=array4[14]; ////tab1[8]表示的是'%'字符,数组结束必须有'%'/////
////////////////////////////////////
if(tab1[1]=='0') ////考虑千位为'0'的情况////注意应该是tab1[1]=='0'////
{ ////而不是tab1[1]==0/////////
if(tab1[2]=='0') ////考虑百位为'0'的情况////
{ //
tab2[0]=tab1[0]; //符号位////
tab2[1]=tab1[3]; //个位////
tab2[2]=tab1[4]; //小数点////
tab2[3]=tab1[5]; //十分位///
tab2[4]=tab1[6]; //百分位///
tab2[5]=tab1[7]; //千分位///
tab2[6]=tab1[8]; ////数组结束必须有%/////
} //
else ////百位不为'0'的情况////
{ //
tab2[0]=tab1[0]; ////符号位////
tab2[1]=tab1[2]; ////十位///
tab2[2]=tab1[3]; ////个位////
tab2[3]=tab1[4]; ////小数点////
tab2[4]=tab1[5]; ////十分位///
tab2[5]=tab1[6]; ////百分位///
tab2[6]=tab1[7]; ////千分位///
tab2[7]=tab1[8]; /////根据实际情况添加的空格//与Disp_strings()有关////
tab2[8]=tab1[9]; ////数组结束必须有%/////
} //
} //
else ////千位不为'0'的情况////
{
tab2[0]=tab1[0];//符号位////
tab2[1]=tab1[1];//千位///
tab2[2]=tab1[2];//百位///
tab2[3]=tab1[3];//个位////
tab2[4]=tab1[4];//小数点////
tab2[5]=tab1[5];//十分位///
tab2[6]=tab1[6];//百分位///
tab2[7]=tab1[7];//千分位///
tab2[8]=tab1[9]; ////数组结束必须有%/////
}
////////////////////////////////////
Disp_strings(x,y,tab2);/////////////////显示数值////
}
else{ Disp_strings(x,y,array5);}//////数值超过显示范围,报错!
////////////////////////////////////////////////////////////////////////////////
//////////////////第二个if-else结构结束/////////////////////////////////////////
}
/****************************** 初始化函数 ******************************
* 功能:向LCD模块写入不同命令,完成必要的初始化过程
*************************************************************************/
void Lcd_initilize( void )
{
LcdWriteCommand( 0x38, 0); /* 设置显示模式(不检测忙信号) */
Delay5Ms(); /* 短延时 */
LcdWriteCommand( 0x38, 0); /* 共进行三次 */
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); /* 设置显示模式(以后均检测忙信号) */
LcdWriteCommand( 0x08, 1); /* 显示关闭 */
LcdWriteCommand( 0x01, 1); /* 显示清屏 */
LcdWriteCommand( 0x06, 1); /* 设置显示光标移动 */
LcdWriteCommand( 0x0c, 1); /* 设置显示开及光标位置 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -