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

📄 lcm12864.c

📁 基于M16的字库液晶12864(st7920)的驱动
💻 C
字号:
#define _ARMLCM12864_C_

#include "LCM12864.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 LCM_write_byte( uchar byte )
{
     uint i;
     uchar byte_tmp;
     for( i = 0; i < 8; i++ )
     {
        SCLK_CLR;
        byte_tmp = byte;
        byte_tmp <<= i;
        if( byte_tmp & 0x80 ) SID_SET;
        else SID_CLR;
        SCLK_SET;
        SCLK_CLR;
     }

     delay_nus( 10 );
}

//写指令
void LCM_write_command( uchar command )
{
    CS_SET;
    LCM_write_byte( 0xf8 );     				//11111, RW, RS, 0  其中令RW = 0, RS = 0, 最后一位为0
    LCM_write_byte( 0xf0 & command );       	//高四位
    LCM_write_byte( 0xf0 & ( command << 4 ) );  //低四位
    CS_CLR;
}

//写数据
void LCM_write_data( uchar data )
{
    CS_SET;
    LCM_write_byte( 0xfa );    				   //11111, RW, RS, 0  其中令RW = 0, RS = 0, 最后一位为0
    LCM_write_byte( 0xf0 & data );             //高四位
    LCM_write_byte( 0xf0 & ( data << 4 ) );	   //低四位
    CS_CLR;
}


//LCM初始化					
void LCM_init( void )
{
    PORT_DDR_OUT;		       //初始化时定义端口为输出

    delay_nms( 40 );
    LCM_write_command( 0x30 ); //0x30
    delay_nus( 100 );
    LCM_write_command( 0x30 ); //0x30
    delay_nus( 37 );
    LCM_write_command( 0x0C ); //0x0c 显示控制 开显示, 不显游标, 游标位置不反白
    delay_nus( 100 );
    LCM_write_command( 0x01 ); //清屏
    delay_nms( 10 );          //10ms延时
    LCM_write_command( 0x06 ); //0X06进入点设定, 指定在数据的读取与写入时,设定游标的移动方向及显示的移位
    delay_nus( 100 );
	
}


//设置液晶显示位置
//入口: r 行(范围1 - 4 )  c 列(范围1 - 8 )
void LCM_set_rc( uchar r, uchar c )
{
	uchar pos;
	switch( r )
	{
		case 1:
			pos = 0x80 + c - 1;
			break;
		case 2:
			pos = 0x90 + c - 1;
			break;
		case 3:
			pos = 0x88 + c - 1;
			break;
		case 4:
			pos = 0x98 + c - 1;
			break;
	}

	LCM_write_command( pos );
}

//写中文汉字串
void LCM_write_string( uchar r, uchar c, char *string )
{
    LCM_set_rc( r, c );
    while( *string )
    {
        LCM_write_data( *string );
		string++;
    }
}

//写整数
void LCM_write_datalongint( uchar r, uchar c, long int datalongint )
{
    char a[10];
    long_to_string( datalongint, a ) ;
	LCM_write_string( r, c, a );
}

//写浮点型数据
void LCM_write_datafloat( uchar r, uchar c, float dataf, uchar p )
{
    char a[10];
    float_2_string( dataf, a, p );
    LCM_write_string( r, c, a );
}
//******************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -