📄 lcd.c
字号:
#define _LCD_C_
#include "LCD.h"
#include <iom16v.h>
/*****************************************
** 将一个整型数据转化为字符串
** 入口参数 要转换的整型数: dataint, 数组p[10]
** 改变思路:整数 -->字符串-->加字符串结束标志
** 可以转换小于0的整数
*****************************************/
void long_to_string( long int dataint, char *p )
{
long int datainttmp;
char *p1; //指向转换成为数组时用到
char datachar1[10];
char datachar2[10];
uchar n = 0; //取整型数据的位数
uchar i = 0;
uchar k1 = 0; //取字符个数
uchar k2 = 0; //取字符个数
if( dataint >= 0 )
datainttmp = ( long int )dataint;
else datainttmp = ( long int )dataint * ( -1 );
p1 = datachar2;
while( datainttmp != 0 )
{
datachar1[n++] = ( datainttmp % 10 ) + 0x30; //转换为字符并取得这个整型数据的位数 n
datainttmp /= 10;
}
if( dataint > 0 ) //如果要转换的整型数据>0
{
k1 = n - 1;
k2 = n;
for( i = 0; i < k2; i++, k1-- )
{
datachar2[k1] = datachar1[i]; //将数字符串倒过来
}
datachar2[n] = '\0'; //字符串结束标志
}
else if( dataint < 0 ) //<0
{
k1 = n;
k2 = n + 1;
for( i = 0; i < k2; i++, k1-- )
{
datachar2[k1] = datachar1[i];
}
datachar2[n + 1] = '\0';
datachar2[0] = '-'; //加上负号
}
else if( dataint == 0 ) //=0
{
datachar2[0] = 0x30;
datachar2[1] = '\0';
}
p1 = datachar2;
strcpy( p, p1 );
}
/*****************************************
** 将一个浮点型数据转化为字符串
** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
** 最好小数位数不是
** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
** 可以转换小于0的浮点数
*****************************************/
void float_2_string( float dataf, char *datastr, uchar p )
{
float dataftmp = dataf;
char datastr1[10];
uchar flag1 = 0;
uchar flag2 = 0;
uchar k;
uchar i = 0;
if( (long int)dataf == 0 ) // dataf为 -1 --- 1 之间的数
{
dataftmp += 2; //随便一个整数 只是为了扩大为首位不为0的数
flag1 = 1;
if( dataf < 0 )
{
flag2 = 1;
dataftmp -= 4; //随便一个整数 只是为了扩大为首位不为0的数
flag1 = 0;
}
}
for( i = 0; i < p + 1; i++ )
dataftmp = dataftmp * 10;
long_to_string( (long int)dataftmp, datastr1 );
k = strlen( datastr1 );
for( i = 1; i < p + 1; i++ )
*( datastr1 + (k-i) ) = *( datastr1 + (k-i-1) );
*( datastr1 + (k-i) ) = '.';
if( flag1 ) //如果为0.00820之类的数
{
*datastr1 = '0';
flag1 = 0;
}
if( flag2 ) //如果为-0.00820之类的数
{
*datastr1 = '-';
*( datastr1 + 1 ) = '0';
}
if( p == 0 )
{
*( datastr1 + (k-i) ) = '\0';
}
strcpy( datastr, datastr1 );
}
//*********************************************************************************************
//==========================================
//函数名称:液晶模块使能
//函数作用: 使能液晶
//入口参数: 无
//返回类型:无
//==========================================
void LCD_en_write(void)
{
EN_SET;
delay_nus(4);
EN_CLR;
}
//==========================================
//函数名称:写指令
//函数作用:
//入口参数: 液晶指令command
//返回类型:无
//==========================================
void LCD_write_command(uchar command)
{
delay_nus( 16 );
RS_CLR;
DB &= 0X0F; //清高四位
DB |= command & 0xf0; //写高四位
LCD_en_write();
command=command << 4; //低四位移到高四位
DB &= 0x0f; //清高四位
DB |= command & 0xf0; //写低四位
LCD_en_write();
//delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
}
//==========================================
//函数名称:写数据
//函数作用:
//入口参数: 数据DATA
//返回类型:无
//==========================================
void LCD_write_data(uchar DATA)
{
delay_nus(16);
RS_SET; //RS=1
DB &= 0X0f; //清高四位
DB |= DATA&0xf0; //写高四位
LCD_en_write();
DATA = DATA << 4; //低四位移到高四位
DB &= 0X0f; //清高四位
DB |= DATA&0xf0; //写低四位
LCD_en_write();
}
//==========================================
//函数名称:液晶初始化函数
//函数作用:
//入口参数: 无
//返回类型:无
//==========================================
void LCD_init( void )
{
DB_DDR_OUT;
LCD_write_command(0x28);
LCD_en_write(); //********总结这里一定要加这液晶使能*********
delay_nus(20);
LCD_write_command(0x28); //4位显示
LCD_write_command(0x0c); //显示开
LCD_write_command(0x01); //清屏
delay_nms(5); //延时一定要长
}
//==========================================
//函数名称:写地址
//函数作用:
//入口参数: 行位置r, 列位置c
//返回类型:无
//==========================================
void LCD_set_rc( uchar r, uchar c )
{
uchar address;
if (r == 1)
address = 0x80 + c;
else if(r == 2)
address = 0xc0 + c;
LCD_write_command( address );
}
//==========================================
//函数名称:写字符串
//函数作用: 在指定位置写一串字符串
//入口参数: 行位置r, 列位置c, 字符串*s
//返回类型:无
//示例 : LCD_write_string( 1, 2, "dongxixiaonanbei" );
//==========================================
void LCD_write_string(uchar r, uchar c, uchar *s)
{
LCD_set_rc( r, c ); //写地址
while( *s ) // 写显示字符
{
LCD_write_data( *s );
s++;
}
}
//写字符
//示例 : LCD_write_char( 1, 2, 'a' );
void LCD_write_char(uchar r, uchar c, uchar DATA)
{
LCD_set_rc( r, c );
LCD_write_data( DATA );
}
//==========================================
//函数名称:写字符数组
//函数作用: 在指定位置写一串字符串
//入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
//返回类型:无
//示例 : uchar a[] = "dongxixiaonanbei@163.com"
// LCD_write_array( 1, 2, a );
//==========================================
void LCD_write_array( uchar r, uchar c, uchar array[] )
{
uchar i = 0;
while( array[i] != '\0' )
{
LCD_write_char( r, c, array[i] );
if( ++c == 16 )
{
if( r == 1 )
{
c = 0;
r = 2;
LCD_write_char( r, c, array[i] );
}
else if( r == 2 )
{
c = 0;
r = 1;
LCD_write_char( r, c, array[i] );
}
}
i++;
}
}
//写整数
//例子: LCD_write_datalongint( 1, 5, 89 ); 在液晶第一行,第5列显示89
void LCD_write_datalongint( uchar r, uchar c, long int datalongint )
{
char a[10];
long_to_string( datalongint, a ) ;
LCD_write_string( r, c, a );
}
//写浮点型数据
//例子: LCD_write_datafloat( 1, 5, -0.33, 4 ); 在液晶第一行,第5列显示-0.33, 显示小数点后4位。
void LCD_write_datafloat( uchar r, uchar c, float dataf, uchar p )
{
char a[10];
float_2_string( dataf, a, p );
LCD_write_string( r, c, a );
}
//******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -