148 lines
3.4 KiB
C
148 lines
3.4 KiB
C
/*! \file spyglass.c \brief Spyglass Control Panel UI Board Driver. */
|
|
//*****************************************************************************
|
|
//
|
|
// File Name : 'spyglass.c'
|
|
// Title : Spyglass Control Panel UI Board Driver
|
|
// Author : Pascal Stang - Copyright (C) 2005
|
|
// Created : 7/20/2005
|
|
// Revised : 7/23/2005
|
|
// Version : 0.9
|
|
// Target MCU : Atmel AVR series
|
|
// Editor Tabs : 4
|
|
//
|
|
// This code is distributed under the GNU Public License
|
|
// which can be found at http://www.gnu.org/licenses/gpl.txt
|
|
//
|
|
//*****************************************************************************
|
|
|
|
|
|
#include "global.h"
|
|
#include "rprintf.h"
|
|
#include "timer.h"
|
|
#include "i2c.h"
|
|
#include "spyglass.h"
|
|
|
|
#include "lcd.h"
|
|
|
|
u08 PcfCtrlData;
|
|
|
|
u08 pcf8574Write(u08 nodeAddr, u08 data)
|
|
{
|
|
// write data
|
|
return i2cMasterSendNI(PCF8574_I2C_BASE_ADDR+(nodeAddr<<1), 1, &data);
|
|
}
|
|
|
|
u08 pcf8574Read(u08 nodeAddr)
|
|
{
|
|
u08 data;
|
|
i2cMasterReceiveNI(PCF8574_I2C_BASE_ADDR+(nodeAddr<<1), 1, &data);
|
|
return data;
|
|
}
|
|
|
|
void spyglassInit(void)
|
|
{
|
|
i2cInit();
|
|
i2cSetBitrate(100);
|
|
PcfCtrlData = (SPYGLASS_LED0 | SPYGLASS_LED1 | SPYGLASS_BEEPER);
|
|
spyglassSetLeds(0);
|
|
spyglassSetBeeper(0);
|
|
}
|
|
|
|
u08 spyglassGetPushbuttons(void)
|
|
{
|
|
return ~pcf8574Read(PCF_NODE_BUTTONS);
|
|
}
|
|
|
|
void spyglassSetLeds(u08 leds)
|
|
{
|
|
PcfCtrlData = (PcfCtrlData|0x03) & ~(leds&0x03);
|
|
pcf8574Write(PCF_NODE_CONTROL, PcfCtrlData);
|
|
}
|
|
|
|
void spyglassSetBeeper(u08 state)
|
|
{
|
|
if(state)
|
|
PcfCtrlData &=~SPYGLASS_BEEPER; // beeper on
|
|
else
|
|
PcfCtrlData |= SPYGLASS_BEEPER; // beeper off
|
|
pcf8574Write(PCF_NODE_CONTROL, PcfCtrlData);
|
|
}
|
|
|
|
u08 spyglassSetLcdContrast(u08 contrast)
|
|
{
|
|
u08 data[2];
|
|
data[0] = 0;
|
|
data[1] = contrast;
|
|
return i2cMasterSendNI(MAX517_I2C_BASE_ADDR, 2, data);
|
|
}
|
|
|
|
void spyglassLcdWrite(u08 rs, u08 data)
|
|
{
|
|
// prepare LCD control lines
|
|
PcfCtrlData &= ~(SPYGLASS_LCD_RW | SPYGLASS_LCD_RS | SPYGLASS_LCD_E);
|
|
if(rs)
|
|
PcfCtrlData |= SPYGLASS_LCD_RS;
|
|
// set LCD control lines
|
|
pcf8574Write(PCF_NODE_CONTROL, PcfCtrlData);
|
|
// set data lines
|
|
pcf8574Write(PCF_NODE_LCD_DATA, data);
|
|
// clock E line
|
|
pcf8574Write(PCF_NODE_CONTROL, PcfCtrlData|SPYGLASS_LCD_E);
|
|
pcf8574Write(PCF_NODE_CONTROL, PcfCtrlData);
|
|
}
|
|
|
|
void spyglassLcdWriteChar(u08 c)
|
|
{
|
|
spyglassLcdWrite(1,c);
|
|
}
|
|
|
|
void spyglassLcdInit(void)
|
|
{
|
|
// LCD function set
|
|
spyglassLcdWrite(0,LCD_FUNCTION_DEFAULT);
|
|
// clear LCD
|
|
spyglassLcdWrite(0,1<<LCD_CLR);
|
|
delay(60000); // wait 60ms
|
|
// set entry mode
|
|
spyglassLcdWrite(0,1<<LCD_ENTRY_MODE | 1<<LCD_ENTRY_INC);
|
|
// set display to on
|
|
spyglassLcdWrite(0,1<<LCD_ON_CTRL | 1<<LCD_ON_DISPLAY );
|
|
// move cursor to home
|
|
spyglassLcdWrite(0,1<<LCD_HOME);
|
|
// set data address to 0
|
|
spyglassLcdWrite(0,1<<LCD_DDRAM | 0x00);
|
|
|
|
// set contrast
|
|
spyglassSetLcdContrast(20);
|
|
}
|
|
|
|
void spyglassLcdHome(void)
|
|
{
|
|
// move cursor to home
|
|
spyglassLcdWrite(0,1<<LCD_HOME);
|
|
}
|
|
|
|
void spyglassLcdClear(void)
|
|
{
|
|
// clear LCD
|
|
spyglassLcdWrite(0,1<<LCD_CLR);
|
|
}
|
|
|
|
void spyglassLcdGotoXY(u08 x, u08 y)
|
|
{
|
|
register u08 DDRAMAddr;
|
|
|
|
// remap lines into proper order
|
|
switch(y)
|
|
{
|
|
case 0: DDRAMAddr = LCD_LINE0_DDRAMADDR+x; break;
|
|
case 1: DDRAMAddr = LCD_LINE1_DDRAMADDR+x; break;
|
|
case 2: DDRAMAddr = LCD_LINE2_DDRAMADDR+x; break;
|
|
case 3: DDRAMAddr = LCD_LINE3_DDRAMADDR+x; break;
|
|
default: DDRAMAddr = LCD_LINE0_DDRAMADDR+x;
|
|
}
|
|
|
|
// set data address
|
|
spyglassLcdWrite(0,1<<LCD_DDRAM | DDRAMAddr);
|
|
}
|