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

📄 lcd1602.c

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                              智 能 充 电 器 开 发 小 组
**                                     OurAVR 论坛
**                                   QQ 群: 26052247 
**
**                               http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: LCD1206.c
**创   建   人: Trinove
**最后修改日期: 2008年01月13日
**描        述: LCD1602字符型液晶的底层函数  FOR AVR MCU / Mega16
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版  本: v1.0
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------历史版本信息------------------------------------------------------------------------------
** 修改人: martin7wind
** 日 期: 2008年02月03日
** 描 述: For 智能充电器
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 吕海安
** 日 期: 2008年03月02日
** 描 述: 修改格式,归档
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 村长 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本项目能在CVAVR下编译通过
**         增加了一个函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "LCD1602.h"



/*----------------------------------------------------------------------------
四线模式:
LCD: 1602
PIN0~7, RW, E, RS

连线如下:
PIN7 --> PB4
PIN6 --> PD2
PIN5 --> PD3
PIN4 --> PD6
RW   --> GND (R/W = 0 write)
E    --> PA6 (E = 1 enable )
RS   --> PA7 (RS = 0 CMD; RS = 1 DATA )

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

#define LCD_DATA7_DDR    DDRB
#define LCD_DATA6_DDR    DDRD
#define LCD_DATA5_DDR    DDRD
#define LCD_DATA4_DDR    DDRD

#define LCD_DATA7_PIN    PINB
#define LCD_DATA6_PIN    PIND
#define LCD_DATA5_PIN    PIND
#define LCD_DATA4_PIN    PIND

#define LCD_DATA7_PORT   PORTB
#define LCD_DATA6_PORT   PORTD
#define LCD_DATA5_PORT   PORTD
#define LCD_DATA4_PORT   PORTD

#define LCD_DATA7 PB4
#define LCD_DATA6 PD2
#define LCD_DATA5 PD3
#define LCD_DATA4 PD6

#define LCD_E_DDR        DDRA
#define LCD_E_PORT       PORTA
#define LCD_E            PA6

#define LCD_E_HIGH       BIT_SET(LCD_E_PORT, LCD_E)
#define LCD_E_LOW        BIT_CLR(LCD_E_PORT, LCD_E)

#define LCD_RS_DDR       DDRA
#define LCD_RS_PORT      PORTA
#define LCD_RS           PA7

#define LCD_DATA_MODE    BIT_SET(LCD_RS_PORT, LCD_RS)
#define LCD_CMD_MODE     BIT_CLR(LCD_RS_PORT, LCD_RS)


#define BIT_POSITION7    (1<<7)
#define BIT_POSITION6    (1<<6)
#define BIT_POSITION5    (1<<5)
#define BIT_POSITION4    (1<<4)

#define LINE_1 0
#define LINE_2 1

INT16U temp;

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

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

/*******************************************************************************************************
** 函数名称: lcd_write_cmd
** 功能描述: 最初的初始化设置中,写入数据函数
** 输入参数: INT8U cmd: 命令
** 输出参数: 无
********************************************************************************************************/
void lcd_write_cmd(INT8U cmd)
{  
    LCD_CMD_MODE; 
    
    if(cmd & BIT_POSITION7)
        {BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
    else
        {BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
    
    if(cmd & BIT_POSITION6)
        {BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
    else
        {BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
    
    if(cmd & BIT_POSITION5)
        {BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
    else
        {BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
    
    if(cmd & BIT_POSITION4)
        {BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
    else
        {BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
    
    
    LCD_E_HIGH;     // E 信号
    delay_us(5); 
    LCD_E_LOW;

}

/*******************************************************************************************************
** 函数名称: lcd_write_byte
** 功能描述: 向LCD写入数据
** 输入参数: INT8U byte: 数据
**           INT8U type: 类型
** 输出参数: 无
********************************************************************************************************/
void lcd_write_byte(INT8U byte, INT8U type)
{
    if(type)
    	{LCD_DATA_MODE;}
    else
    	{LCD_CMD_MODE;}
    
    
    temp = byte;
    
    
    if(byte & BIT_POSITION7)
        {BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
    else
        {BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
    
    if(byte&BIT_POSITION6)
        {BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
    else
        {BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
    
    if(byte&BIT_POSITION5)
        {BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
    else
        {BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
    
    if(byte&BIT_POSITION4)
        {BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
    else
        {BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
    
    
    LCD_E_HIGH;    // E 信号 
    delay_us(5);
    LCD_E_LOW;
    
    delay_xus(39); // 39 us!
    
    byte <<= 4;
    
    if(byte & BIT_POSITION7)
        {BIT_SET(LCD_DATA7_PORT, LCD_DATA7);}
    else
        {BIT_CLR(LCD_DATA7_PORT, LCD_DATA7);}
    
    if(byte & BIT_POSITION6)
        {BIT_SET(LCD_DATA6_PORT, LCD_DATA6);}
    else
        {BIT_CLR(LCD_DATA6_PORT, LCD_DATA6);}
    
    if(byte & BIT_POSITION5)
        {BIT_SET(LCD_DATA5_PORT, LCD_DATA5);}
    else
        {BIT_CLR(LCD_DATA5_PORT, LCD_DATA5);}
    
    if(byte & BIT_POSITION4)
        {BIT_SET(LCD_DATA4_PORT, LCD_DATA4);}
    else
        {BIT_CLR(LCD_DATA4_PORT, LCD_DATA4);}
    
    
    LCD_E_HIGH;     // E 信号 
    delay_xus(5); 
    LCD_E_LOW;
    
    delay_ms(10);  // 延时 10 mS
	
}


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

/*******************************************************************************************************
** 函数名称: lcd_init
** 功能描述: 1602 液晶初始化函数
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void lcd_init()
{
    // 相关IO配置
    BIT_SET(LCD_DATA7_DDR, LCD_DATA7);
    BIT_SET(LCD_DATA6_DDR, LCD_DATA6);   
    BIT_SET(LCD_DATA5_DDR, LCD_DATA5);   
    BIT_SET(LCD_DATA4_DDR, LCD_DATA4);
    
    BIT_SET(LCD_E_DDR, LCD_E); 
    BIT_SET(LCD_RS_DDR, LCD_RS);
    
    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, CMD);   // 0x28 = 4 位数据线,双行显示,5*7 字型
    //LCD_write_byte(0x0e, CMD); // 0x0e = 显示开,光标不闪烁
    lcd_write_byte(0x0c, CMD);   // 0x0c = 显示开,光标不显示
    lcd_write_byte(0x06, CMD);   // 0x06 = 每次输入后光标右移一格
    
    lcd_cls();  // 清屏
}

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

}


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


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

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

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

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

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


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

⌨️ 快捷键说明

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