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

📄 lcd1602.i

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 I
📖 第 1 页 / 共 3 页
字号:

---------------------------------------------------------------------------*/












unsigned int temp;

/*******************************************************************************************************
** 函数名称: delay_1us
** 功能描述: delay 1 us,16mhz, 1 nop bring 62.5ns delay
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void delay_1us(void)
{
    unsigned char i;
    
    for(i = 15; i > 0; i--);
}

/*******************************************************************************************************
** 函数名称: delay_xus
** 功能描述: 延时 N uS
** 输入参数: INT8U t: N 个单位
** 输出参数: 无
********************************************************************************************************/
void delay_xus(unsigned char t)
{
    for( ; t>0; t--)
    {
        delay_1us();
    }
}

/*******************************************************************************************************
** 函数名称: lcd_write_cmd
** 功能描述: 最初的初始化设置中,写入数据函数
** 输入参数: INT8U cmd: 命令
** 输出参数: 无
********************************************************************************************************/
void lcd_write_cmd(unsigned char cmd)
{  
    PORTA &= ~(1 << (7)) ; 
    
    if(cmd & (1<<7))
        {PORTB |= (1 << (4)) ;}
    else
        {PORTB &= ~(1 << (4)) ;}
    
    if(cmd & (1<<6))
        {PORTD |= (1 << (2)) ;}
    else
        {PORTD &= ~(1 << (2)) ;}
    
    if(cmd & (1<<5))
        {PORTD |= (1 << (3)) ;}
    else
        {PORTD &= ~(1 << (3)) ;}
    
    if(cmd & (1<<4))
        {PORTD |= (1 << (6)) ;}
    else
        {PORTD &= ~(1 << (6)) ;}
    
    
    PORTA |= (1 << (6)) ;     // E 信号
    delay_us(5); 
    PORTA &= ~(1 << (6)) ;

}

/*******************************************************************************************************
** 函数名称: lcd_write_byte
** 功能描述: 向LCD写入数据
** 输入参数: INT8U byte: 数据
**           INT8U type: 类型
** 输出参数: 无
********************************************************************************************************/
void lcd_write_byte(unsigned char byte, unsigned char type)
{
    if(type)
    	{PORTA |= (1 << (7)) ;}
    else
    	{PORTA &= ~(1 << (7)) ;}
    
    
    temp = byte;
    
    
    if(byte & (1<<7))
        {PORTB |= (1 << (4)) ;}
    else
        {PORTB &= ~(1 << (4)) ;}
    
    if(byte&(1<<6))
        {PORTD |= (1 << (2)) ;}
    else
        {PORTD &= ~(1 << (2)) ;}
    
    if(byte&(1<<5))
        {PORTD |= (1 << (3)) ;}
    else
        {PORTD &= ~(1 << (3)) ;}
    
    if(byte&(1<<4))
        {PORTD |= (1 << (6)) ;}
    else
        {PORTD &= ~(1 << (6)) ;}
    
    
    PORTA |= (1 << (6)) ;    // E 信号 
    delay_us(5);
    PORTA &= ~(1 << (6)) ;
    
    delay_xus(39); // 39 us!
    
    byte <<= 4;
    
    if(byte & (1<<7))
        {PORTB |= (1 << (4)) ;}
    else
        {PORTB &= ~(1 << (4)) ;}
    
    if(byte & (1<<6))
        {PORTD |= (1 << (2)) ;}
    else
        {PORTD &= ~(1 << (2)) ;}
    
    if(byte & (1<<5))
        {PORTD |= (1 << (3)) ;}
    else
        {PORTD &= ~(1 << (3)) ;}
    
    if(byte & (1<<4))
        {PORTD |= (1 << (6)) ;}
    else
        {PORTD &= ~(1 << (6)) ;}
    
    
    PORTA |= (1 << (6)) ;     // E 信号 
    delay_xus(5); 
    PORTA &= ~(1 << (6)) ;
    
    delay_ms(10);  // 延时 10 mS
	
}


/*******************************************************************************************************
** 函数名称: lcd_cls
** 功能描述: 清屏
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_cls()
{
    lcd_write_byte(0x01, 0);
}

/*******************************************************************************************************
** 函数名称: lcd_init
** 功能描述: 1602 液晶初始化函数
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_init()
{
    // 相关IO配置
    DDRB |= (1 << (4)) ;
    DDRD |= (1 << (2)) ;   
    DDRD |= (1 << (3)) ;   
    DDRD |= (1 << (6)) ;
    
    DDRA |= (1 << (6)) ; 
    DDRA |= (1 << (7)) ;
    
    delay_ms(15);          // 上电延时15MS以上
    lcd_write_cmd(0x30);    // 上电初始化命令
    delay_ms(5);           // delay > 5.1MS
    lcd_write_cmd(0x30);
    delay_ms(5);           // delay > 100us
    lcd_write_cmd(0x30);
    delay_ms(15);
    lcd_write_cmd(0x20);    // 四位数据模式
    delay_ms(15);
    
    //功能设定
    lcd_write_byte(0x28, 0);   // 0x28 = 4 位数据线,双行显示,5*7 字型
    //LCD_write_byte(0x0e, CMD); // 0x0e = 显示开,光标不闪烁
    lcd_write_byte(0x0c, 0);   // 0x0c = 显示开,光标不显示
    lcd_write_byte(0x06, 0);   // 0x06 = 每次输入后光标右移一格
    
    lcd_cls();  // 清屏
}

/*******************************************************************************************************
** 函数名称: lcd_write_char
** 功能描述: 在 X,Y 坐标写单字符
** 输入参数: INT8U lcd_x: x 坐标
**           INT8U lcd_y: y 坐标
**           INT8U data:  单字符
** 输出参数: 无
********************************************************************************************************/
void lcd_write_char(unsigned char lcd_x, unsigned char lcd_y, unsigned char data)
{ 
    if(lcd_y) // 第二行
    {
        lcd_write_byte(0xc0+lcd_x, 0);
    }
    else      // 第一行
    {
        lcd_write_byte(0x80+lcd_x, 0);
    }
    
    lcd_write_byte(data, 1); 

}


/*******************************************************************************************************
** 函数名称: lcd_locate
** 功能描述: 定位 LCD 行列位置
** 输入参数: INT8U lcd_x: x 坐标
**           INT8U lcd_y: y 坐标
** 输出参数: 无
********************************************************************************************************/
void lcd_locate(unsigned char lcd_x, unsigned char lcd_y)
{
    if(lcd_y) // 第二行
    {
        lcd_write_byte(0xc0 + lcd_x, 0);
    }
    else      // 第一行
    {
        lcd_write_byte(0x80 + lcd_x, 0);
    }
    
}


/*******************************************************************************************************
** 函数名称: lcd_print_string
** 功能描述: 向 LCD 发送显示文字
** 输入参数: char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_string(char *pstring)
{
    while(*pstring)
    {
        lcd_write_byte(*pstring, 1);
        pstring++;
    }
}

/*******************************************************************************************************
** 函数名称: lcd_print_stringF
** 功能描述: 向 LCD 发送显示文字
** 输入参数: flash char *pstring: 显示文字指针pstring
** 输出参数: 无
********************************************************************************************************/
void lcd_print_stringF(flash char *pstring)
{
    while(*pstring)
    {
        lcd_write_byte(*pstring, 1);
        pstring++;
    }
}

/*******************************************************************************************************
** 函数名称: lcd_print_number
** 功能描述: 向 LCD 发送显示数据
** 输入参数: INT16S number: 数值, 为有符号的整数
**           INT8U ca: 显示的位数 (1 - 6)
**           INT8U cb: 其中的小数位数,(类似定点的小数),显示整数时,cb 置 0 即可
** 输出参数: 无
********************************************************************************************************/
void lcd_print_number(int number , unsigned char ca , unsigned char cb)
{
		
    unsigned char _bit[5];   // 最多 5 位
    
    unsigned char *pbit;
    
    unsigned char i;
    
    if(number > 0)
    {
        temp = number;
    }
    else
    {
        temp = -number;
    }
    
    // temp = 12345;
    // 算出每一位 057920

    _bit[4] = (unsigned char)(temp/10000);
    _bit[3] = (unsigned char)(temp/1000  - _bit[4]*10);
    _bit[2] = (unsigned char)(temp/100  - _bit[4]*100 - _bit[3]*10);
    _bit[1] = (unsigned char)(temp/10  - _bit[4]*1000 - _bit[3]*100 - _bit[2]*10);
    _bit[0] = (unsigned char)(temp  - _bit[4]*10000 - _bit[3]*1000 - _bit[2]*100 - _bit[1]*10);

    if(number < 0) // 负值
    {
        lcd_write_byte('-', 1);	//先显示负号
        
        pbit = &(_bit [4]);   //指向最高位
        
        for(i = 5 - ca; i > 0; i--)
        {
            pbit --;
        }
        while(ca)
        {
            if(ca == cb)
            {
                lcd_write_byte('.', 1);
            }
            
            lcd_write_byte(*pbit+48, 1);
            
            pbit --; 
            ca--;
            
        }
    }
    
    else  // 正数
    {
    	pbit = &(_bit [4]);   //指向最高位
    
    	for(i = 5 - ca; i > 0; i--)
    	{
            pbit --;
        }
        
    	while(ca)
        {
            if(ca == cb)
            {
                lcd_write_byte('.', 1);
            }
        		
            lcd_write_byte(*pbit+48,1);
        
            pbit --;
            ca--;
        }
    }
} 


/**************************************************************************************×*****************
**                                 END OF FILE
********************************************************************************************************/

⌨️ 快捷键说明

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