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

📄 main__.c

📁 智能充电参考程序 可以控制整个充电过程希望对大家有帮助
💻 C
📖 第 1 页 / 共 5 页
字号:
** 描 述: For 智能充电器
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 吕海安
** 日 期: 2008年03月02日
** 描 述: 修改格式,归档
**
**------------------------------------------------------------------------------------------------------
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 村长 aleyn.wu
** 日 期: 2008年3月3日
** 描 述: 修改了一些BUG,使本项目能在CVAVR下编译通过
**         增加了一个函数
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x40
	.EQU __sm_mask=0xB0
	.EQU __sm_powerdown=0x20
	.EQU __sm_powersave=0x30
	.EQU __sm_standby=0xA0
	.EQU __sm_ext_standby=0xB0
	.EQU __sm_adc_noise_red=0x10
	.SET power_ctrl_reg=mcucr
	#endif
#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--)
    	{

⌨️ 快捷键说明

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