⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 基于m16的寻迹小车(包含小车题目
💻 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 + -