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

📄 vcard.c

📁 butterflylogger_src_20060822 for atmel avr
💻 C
字号:
//***************************************************************************
//
//  File........: vcard.c
//
//  Author(s)...: ATMEL Norway
//
//  Target(s)...: ATmega169
//
//  Compiler....: AVR-GCC 3.3.1; avr-libc 1.0
//
//  Description.: AVR Butterfly Name-tag
//
//  Revisions...: 1.0
//
//  YYYYMMDD - VER. - COMMENT                                       - SIGN.
//
//  20030116 - 1.0  - Created                                       - LHM
//  20031009          port to avr-gcc/avr-libc                      - M.Thomas
//
//***************************************************************************

//mtA
//#include <inavr.h>
//#include "iom169.h"
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//mtE
#include "main.h"
#include "button.h"
#include "LCD_functions.h"
#include "usart.h"
#include "eeprom.h"
#include "vcard.h"

// mt no support for Mega169 in avr-libc:
// no! // #include <avr/eeprom.h>
// include workaround:
#include "eeprom169.h"

// mt s/index/indexps
//char indexps = 0;         //variable to keep the lenght of the present string
uint8_t indexps = 0;

extern char gUART;      //global variable from "main.c"

char Name[STRLENGHT];

// mt __flash char TEXT_WAIT[]                     = "waiting for input on RS232";
// mt: jw method used 
/// const char TEXT_WAIT[] PROGMEM                = "waiting for input on RS232";

/*****************************************************************************
*
*   Function name : vCard
*
*   Returns :       char ST_state (to the state-machine)
*
*   Parameters :    char input (from joystick)
*
*   Purpose :       Puts the name in EEPROM on the LCD
*
*****************************************************************************/
char vCard(char input)
{
    static char enter = 1;
	const uint16_t lenAddr=EEPROM_START;

    if (enter)
    {
        enter = 0;

        // mt __EEGET(indexps, EEPROM_START);           // Load the length if the name
		indexps=eeprom_read_byte_169(&lenAddr);
        
        if((indexps < 1) | (indexps > STRLENGHT))   // if illegal length     
        {
            indexps = 0;
            Name[0] = 'A';
            
            enter = 1;
            return ST_VCARD_ENTER_NAME;               //enter new name
        }
        else
        {
            LoadEEPROM(Name, indexps, EEPROM_START + 1);  // Load name 
			LCD_puts(Name, 1);
        }
    }

    else if (input == KEY_NEXT)
    {
        enter = 1;
        return ST_VCARD_ENTER_NAME;
    }
    else if (input == KEY_PREV)
    {
        enter = 1;
        return ST_VCARD;
    }
    
    return ST_VCARD_FUNC;
}


/*****************************************************************************
*
*   Function name : EnterName
*
*   Returns :       char ST_state (to the state-machine)
*
*   Parameters :    char input (from joystick)
*
*   Purpose :       Lets the user enter a name using the joystick. Pressing the
*                   joystick UP/DOWN will browse the alphabet and NEXT/PREV 
*                   will shift between the characters in the name.
*
*****************************************************************************/
char EnterName(char input)
{
    static char enter = 1;

    // mt static char temp_index = 0;
	static uint8_t temp_index = 0;
    static char temp_name[6];
    
    // mt char i;
	static uint8_t i;
	uint16_t lenAddr=EEPROM_START;

    if (enter)
    {
        LoadEEPROM(Name, indexps, EEPROM_START + 1);  // Load name from EEPROM
                
        if(indexps)
            indexps -= 1;         //make the last character in name blink

        enter = 0;        
    }
    else
    {
        temp_index = indexps;
                
        for(i = 5; (i != 255); i--, temp_index--)
        {
            if ((Name[temp_index] >= ' ') && (Name[temp_index] <= 'z') && (temp_index != 255)) //check if it's legal character
                temp_name[i] = Name[temp_index];
            else
                temp_name[i] = ' '; // if not, put in a space
        }       
        
        LCD_putc(0, temp_name[0]);
        LCD_putc(1, temp_name[1]);
        LCD_putc(2, temp_name[2]);
        LCD_putc(3, temp_name[3]);
        LCD_putc(4, temp_name[4]);
        LCD_putc(5, temp_name[5] | 0x80);   //Make this digit blink
        LCD_putc(6, '\0');

        if (input != KEY_NULL)
            LCD_FlashReset();
     
        LCD_UpdateRequired(TRUE, 0);
    }
    
    if (input != KEY_NULL)
        LCD_FlashReset();

    if (input == KEY_PLUS)
    {
       
        Name[indexps]--;

        if( (('!' <= Name[indexps]) && (Name[indexps] <= '/')) && (Name[indexps] != ' '))
            Name[indexps] = ' ';
        else if( (':' <= Name[indexps]) && (Name[indexps] <= '@'))
            Name[indexps] = '9';
        else if(Name[indexps] >= '[')
            Name[indexps] = 'Z';
        else if(Name[indexps] < ' ')
            Name[indexps] = 'Z';

    }
    else if (input == KEY_MINUS)
    {
        Name[indexps]++;

        if( (('!' <= Name[indexps]) && (Name[indexps] <= '/')) && (Name[indexps] != ' '))
            Name[indexps] = '0';
        else if( (':' <= Name[indexps]) && (Name[indexps] <= '@'))
            Name[indexps] = 'A';
        else if(Name[indexps] >= '[')
            Name[indexps] = ' ';
        else if(Name[indexps] < ' ')
            Name[indexps] = ' ';
    }
    else if (input == KEY_PREV)
    {
        if(indexps)
        {
            indexps--;
        }
    }
    else if (input == KEY_NEXT)
    {
        if(indexps < STRLENGHT)
        {
            indexps++;
            Name[indexps] = 'A';            
        }
    }
    else if (input == KEY_ENTER)
    {
        indexps++;
        
        Name[indexps] = '\0';
        
        // mt __EEPUT(EEPROM_START, indexps);   //store the length of name in EEPROM
		eeprom_write_byte_169(&lenAddr,indexps);
    
        StoreEEPROM(Name, indexps, EEPROM_START + 1);  //store the Name in EEPROM
        
        enter = 1;
        return ST_VCARD_FUNC;
    }

    return ST_VCARD_ENTER_NAME_FUNC;
}



/*****************************************************************************
*
*   Function name : RS232
*
*   Returns :       char ST_state (to the state-machine)
*
*   Parameters :    char input (from joystick)
*
*   Purpose :       Store data from the UART to EEPROM
*
*****************************************************************************/
char RS232(char input)
{
    static char enter = 1;
    char c;
    static char buffer[STRLENGHT];
    //static char temp_index;
	static uint8_t temp_index;
	uint16_t lenAddr=EEPROM_START;
    
    if (enter)
    {
        cli(); // mt __disable_interrupt();
        
        // boost IntRC to 2Mhz to achieve 19200 baudrate
        CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
        // set prescaler = 4, Inter RC 8Mhz / 4 = 2Mhz
        CLKPR = (1<<CLKPS1);
        
        sei(); // mt __enable_interrupt();
        
        // mt jw-meth: LCD_puts_f(TEXT_WAIT, 0);
		LCD_puts_f(PSTR("waiting for input on RS232"), 0);
        enter = 0;
        temp_index = 0;
        c = UDR0;                       // Dummy read to clear receive buffer
        gUART = TRUE;
    }

    if (UCSR0A & (1<<RXC0))
    {
        c = UDR0;
        if (c != '\r')
        {
            if (temp_index < STRLENGHT)
                buffer[temp_index++] = c;
        }
        else    // UART transmission completed
        {
            cli(); // mt __disable_interrupt();
                
            CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
            // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
            CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
                
            sei(); // mt __enable_interrupt();
                
            if(temp_index)   
            {
                buffer[temp_index] = '\0';
                for (temp_index = 0; buffer[temp_index]; temp_index++)
                    Name[temp_index] = buffer[temp_index];
                Name[temp_index] = '\0';
                
                enter = 1;
                        
                // mt __EEPUT(EEPROM_START, temp_index);   //store the length of name in EEPROM
				eeprom_write_byte_169(&lenAddr,temp_index);
                StoreEEPROM(Name, temp_index, EEPROM_START + 1);  //store the Name in EEPROM
                
                indexps = temp_index;
                
                gUART = FALSE;               
                return ST_VCARD_FUNC;
            }
            else    // if no characters received 
            {
                enter = 1;            
                return ST_VCARD_DOWNLOAD_NAME;
            }
        }
    }


    if (input != KEY_NULL)
    {
        enter = 1;
        
		cli(); // mt __disable_interrupt();
        
        CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
        // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
        CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
        
        sei(); // __enable_interrupt();
        
        gUART = FALSE;
        return ST_VCARD_DOWNLOAD_NAME;
    }


    return ST_VCARD_DOWNLOAD_NAME_FUNC;
}

⌨️ 快捷键说明

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