Speedometer: Embedded Hardware Design Project
Speedometer: Embedded Hardware Design Project
Project By:
Pavan Daxini 200801205 Documentation
Index
1 General Description
1.1 Speedometer Overview 3
1.2 Mechanical Speedometer 3
1.3 Electronic Speedometer 3
2 System Requirements
2.1 General Requirements 4
2.2 Functional Requirements 4
2.3 Dimensional Requirements 4
2.4 Memory Requirements 4
2.5 Display Requirements 5
3 Implementation Basics
3.1 Block Diagram 6
3.2 Block Description 6
6 Working
6.1 Overview 16
6.2 Encoder-Distance calculator 16
6.3 Distance Calculation 16
6.4 Time Calculation 17
6.5 Slave Flowchart 19
6.6 Master Flowchart 20
7 Appendix
7.1 Spi.c 21
7.2 Spi_slave.c 23
7.3 Lcd.c 26
7.4 Lcd.h 40
EHD project-Speedometer 3
1. General Description
Mechanical speedometers are turned by a flexible cable made from a tightly wound spring.
The cable usually spins inside a protective metal tube with rubber housing. On a motorcycle,
a little wheel rolling against the bike wheel turns the cable, and the gear ratio on the
speedometer has to be calibrated to the size of this small wheel. On a car, a gear engages
the output shaft of the transmission, turning the cable.
The cable snakes its way up to the instrument panel, where it is connected to the input shaft
of the speedometer.
Generally Speedometers are marked as turns: mile ratio. i.e. if an speedometer is marked
as 1690:1 that means the input shaft of this speedometer has to spin 1,690 times before the
speedometer will register 1 mile.
These have a magnet attached to one of the wheels and a pickup attached to the frame.
Once per revolution of the wheel, the magnet passes by the pickup, generating a voltage in
the pickup. The computer counts these voltage spikes, or pulses, and uses them to calculate
the distance travelled.
Many modern cars use a system like this, too. Instead of a magnetic pickup on a wheel, they
use a toothed wheel mounted to the output of the transmission and a magnetic sensor that
counts the pulses as each tooth of the wheel goes by. Some cars use a slotted wheel and an
optical pickup, like a computer mouse does. Just like on the bicycle, the computer in the car
knows how much distance the car travels with each pulse, and uses this to update the
speedometer reading.
EHD project-Speedometer 4
2. System Requirements
No permanent storage is required. All the data is stored on the programming stack
EHD project-Speedometer 5
3. Implementation Basics
4.1 Introduction
The ATmega32 is a low-power CMOS 8-bit microcontroller based on the AVR
enhanced RISC architecture. By executing powerful instructions in a single
clock cycle, the ATmega32 achieves throughputs approaching 1 MIPS per
MHz allowing the system designer to optimize power consumption versus
processing speed.
PORTD Port D is an 8-bit bi-directional I/O port with internal pull-up resistors
(PD0...PD7) (selected for each bit). The Port D output buffers have symmetrical drive
characteristics with both high sink
And source capability. As inputs, Port D pins that are externally pulled low will
source current if the pull-up resistors are activated. The Port D pins are tri-
stated when a reset condition becomes active, even if the clock is not running.
EHD project-Speedometer 8
RESET Reset Input. A low level on this pin for longer than the minimum pulse length
will generate a reset, even if the clock is not running. Shorter pulses are not
guaranteed to generate a reset.
AREF AREF is the analog reference pin for the A/D Converter.
The Serial Peripheral Interface (SPI) allows high-speed synchronous data transfer
between the ATmega32 and peripheral devices or between several AVR devices.
For this project, we are using Master and Slave Operation.
The system consists of two Shift Registers, and a Master clock generator. The
SPI Master initiates the communication cycle when pulling low the Slave
Select SS pin of the desired Slave. Master and Slave prepare the data to be
sent in their respective Shift Registers, and the Master generates the
required clock pulses on the SCK line to interchange data. Data is always
shifted from Master to Slave on the Master Out – Slave In, MOSI, line, and
from Slave to Master on the Master In – Slave Out, MISO, line. After each
data packet, the Master will synchronize the Slave by pulling high the Slave
Select, SS, line.
When the SPI is enabled, the data direction of the MOSI, MISO, SCK, and SS
pins is overridden according to table shown below.
5.2.1 Characteristics
Character Dots:5 x 8
Driving Mode:1/16D
Display Content:16 CHAR x 2ROW
Parameters: (VDD=5.0V±10%,VSS=0V,Ta=25℃)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
VSS VC VEE RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 LED LED
C + -
5.2.5 Description/Working
The LCD can be used in 2 modes – 4 bit mode and 8 bit mode
In 8 bit mode 8 data pins are there which sends a character (1 byte)
directly to the LCD. In 4 bit mode the upper nibble is sent first and then
lower nibble.
The three control lines are referred to as EN, RS, and RW.
The EN line is called "Enable." This control line is used to tell the LCD that
you are sending it data. To send data to the LCD, your program should
make sure this line is low (0) and then set the other two control lines
and/or put data on the data bus. When the other lines are completely
ready, bring EN high (1) and wait for the minimum amount of time
required by the LCD datasheet (this varies from LCD to LCD), and end by
bringing it low (0) again.
The RS line is the "Register Select" line. When RS is low (0), the data is to
be treated as a command or special instruction (such as clear screen,
position cursor, etc.). When RS is high (1), the data being sent is text data
which should be displayed on the screen. For example, to display the
letter "T" on the screen you would set RS high.
The RW line is the "Read/Write" control line. When RW is low (0), the
information on the data bus is being written to the LCD. When RW is high
(1), the program is effectively reading the LCD. Only one instruction ("Get
LCD status") is a read command. All others are write commands--so RW
will almost always be low.
Finally, the data bus consists of 4 or 8 lines (depending on the mode of
operation selected by the user). In the case of an 8-bit data bus, the lines
are referred to as DB0, DB1, DB2, DB3, DB4, DB5, DB6, and DB7. IN 4 bit
mode, we use DB4, DB5, DB6, and DB7. Rest 4 pins are not shorted or
ground.
EHD project-Speedometer 15
6.1 Overview
There are two AVR Microcontrollers being used. One is used to give input to
the other. The first microcontroller (slave) serves as an absolute encoder. An
Absolute encoder is a sensor used in vehicles to determine the distance
travelled by measuring the degree of rotation of the wheel. The output of
such an encoder is a digital signal. The same functionality is being
implemented on the slave. The signal is transferred from one microcontroller
to the other (master) using SPI (Synchronous Peripheral Interface). The
second controller calculates the speed according to the degree of rotation
and displays it on a 16X2 LCD.
Slave Flowchart
EHD project-Speedometer 19
Master Flowchart
EHD project-Speedometer 20
7. Appendix
Spi.c
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
#include <stdlib.h>
#include <string.h>
#define CIRCUMFERENCE 116
char get_slave_status()
{
SPDR = 'a';
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
int main()
{
DDRA = 0xFF; // FOR the LCD
PORTA = 0x00;
lcd_init(LCD_DISP_ON);
lcd_clrscr();
// SS is high so spi of slave is disabled initially
PORTB = PORTB | 0b00010000;
// MISO=ip, MOSI=op, SS=op, SCK=op;
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);
// for enabling pull up on the pin configured as input;
PORTB |= (1<<PB6);
// spi cntrol reg SPIE,SPI,MASTR,PRESCALER setting
SPCR = 0b11010011;
//for clearing the SPIE flag
char a = SPSR;
EHD project-Speedometer 22
a = SPDR;
int sample_1;
int sample_2,deg;
double speed;
char *buff;
char *temp = "parth ";
sample_1 = get_slave_status();
while(1)
{
sample_2 = get_slave_status();
}
EHD project-Speedometer 23
Spi_slave.c
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <math.h>
#include <inttypes.h>
#include <string.h>
#include "lcd.h"
#include <stdlib.h>
char read;
char write = '0';
int count=0;
int rpm=500;
int delay;
long double delay1;
SIGNAL(SIG_INTERRUPT0)
{
if(rpm<1000)
{ rpm+=100; }
SIGNAL(SIG_INTERRUPT1)
{
if(rpm>0)
{ rpm-=100; }
SIGNAL(SIG_SPI)
{
read = SPDR;
SPDR = count;
// set_print_lcd(1,1,read);
}
int main()
{
char *buff = "parth ";
char *temp = "parth ";
DDRA = 0xff;
PORTA = 0x00;
DDRD = 0xFF;
EHD project-Speedometer 25
lcd_init(LCD_DISP_ON);
char a = SPSR;
a = SPDR;
GICR|= (1<<INT1) | (1<<INT0);
MCUCR = (1<<ISC11)|(1<<ISC01);
lcd_clrscr();
sei();
count_delay(delay);
while(1)
{
count=(count+1)%30;
/*
lcd_clrscr();
strcpy(temp,itoa(count,buff,10));
set_print_lcd(0,0,temp);
*/
count_delay(delay);
}
EHD project-Speedometer 26
Lch.c
/**************************************************************************
**
Title : HD44780U LCD library
Author: Peter Fleury <[email protected]> http://jump.to/fleury
File: $Id: lcd.c,v 1.14.2.1 2006/01/29 12:16:41 peter Exp $
Software: AVR-GCC 3.3
Target: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
DESCRIPTION
Basic routines for interfacing a HD44780U-based text lcd display
Memory mapped mode compatible with Kanda STK200, but supports also
generation of R/W signal through A8 address line.
USAGE
See the C include lcd.h file for a description of each function
***************************************************************************
**/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
/*
** constants/macros
*/
#define DDR(x) (*(&x - 1)) /* address of data direction register of port x */
#if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
/* on ATmega64/128 PINF is on port 0x00 and not 0x60 */
#define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) )
#else
#define PIN(x) (*(&x - 2)) /* address of input register of port x */
#endif
#if LCD_IO_MODE
EHD project-Speedometer 27
#if LCD_IO_MODE
#if LCD_LINES==1
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_1LINE
#else
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_4BIT_2LINES
#endif
#else
#if LCD_LINES==1
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_1LINE
#else
#define LCD_FUNCTION_DEFAULT LCD_FUNCTION_8BIT_2LINES
#endif
#endif
#if LCD_CONTROLLER_KS0073
#if LCD_LINES==4
#endif
#endif
/*
** function prototypes
*/
#if LCD_IO_MODE
static void toggle_e(void);
#endif
/*
** local functions
*/
EHD project-Speedometer 28
/*************************************************************************
delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
*************************************************************************/
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles
else
__asm__ __volatile__ (
"1: sbiw %0,1" "\n\t"
"brne 1b" // 4 cycles/loop
: "=w" (__count)
: "0" (__count)
);
}
/*************************************************************************
delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock frequency
*************************************************************************/
#define delay(us) _delayFourCycles( ( ( 1*(XTAL/4000) )*us)/1000 )
#if LCD_IO_MODE
/* toggle Enable Pin to initiate write */
static void toggle_e(void)
{
lcd_e_high();
lcd_e_delay();
lcd_e_low();
}
#endif
/*************************************************************************
Low-level function to write byte to LCD controller
Input: data byte to write to LCD
rs 1: write data
0: write instruction
Returns: none
*************************************************************************/
#if LCD_IO_MODE
static void lcd_write(uint8_t data,uint8_t rs)
EHD project-Speedometer 29
{
unsigned char dataBits ;
/*************************************************************************
Low-level function to read byte from LCD controller
Input: rs 1: read data
0: read busy flag / address counter
Returns: byte read from LCD controller
*************************************************************************/
#if LCD_IO_MODE
static uint8_t lcd_read(uint8_t rs)
{
uint8_t data;
if (rs)
lcd_rs_high(); /* RS=1: read data */
else
lcd_rs_low(); /* RS=0: read busy flag */
lcd_rw_high(); /* RW=1 read mode */
EHD project-Speedometer 31
lcd_e_high();
lcd_e_delay();
data = PIN(LCD_DATA0_PORT) << 4; /* read high nibble first */
lcd_e_low();
lcd_e_high();
lcd_e_delay();
data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */
lcd_e_low();
}
else
{
/* configure data pins as input */
DDR(LCD_DATA0_PORT) &= ~_BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) &= ~_BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) &= ~_BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) &= ~_BV(LCD_DATA3_PIN);
}
return data;
}
#else
#define lcd_read(rs) (rs) ? *(volatile uint8_t*)(LCD_IO_DATA+LCD_IO_READ) : *(volatile
uint8_t*)(LCD_IO_FUNCTION+LCD_IO_READ)
/* rs==0 -> read instruction from LCD_IO_FUNCTION */
/* rs==1 -> read data from LCD_IO_DATA */
#endif
/*************************************************************************
loops while lcd is busy, returns address counter
*************************************************************************/
static uint8_t lcd_waitbusy(void)
{
register uint8_t c;
/* the address counter is updated 4us after the busy flag is cleared */
delay(2);
}/* lcd_waitbusy */
/*************************************************************************
Move cursor to the start of next line or to the first line if the cursor
is already on the last line.
*************************************************************************/
static inline void lcd_newline(uint8_t pos)
{
register uint8_t addressCounter;
#if LCD_LINES==1
addressCounter = 0;
#endif
#if LCD_LINES==2
if ( pos < (LCD_START_LINE2) )
addressCounter = LCD_START_LINE2;
else
EHD project-Speedometer 33
addressCounter = LCD_START_LINE1;
#endif
#if LCD_LINES==4
#if KS0073_4LINES_MODE
if ( pos < LCD_START_LINE2 )
addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE3) )
addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE4) )
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
#else
if ( pos < LCD_START_LINE3 )
addressCounter = LCD_START_LINE2;
else if ( (pos >= LCD_START_LINE2) && (pos < LCD_START_LINE4) )
addressCounter = LCD_START_LINE3;
else if ( (pos >= LCD_START_LINE3) && (pos < LCD_START_LINE2) )
addressCounter = LCD_START_LINE4;
else
addressCounter = LCD_START_LINE1;
#endif
#endif
lcd_command((1<<LCD_DDRAM)+addressCounter);
}/* lcd_newline */
/*
** PUBLIC FUNCTIONS
*/
/*************************************************************************
Send LCD controller instruction command
Input: instruction to send to LCD controller, see HD44780 data sheet
Returns: none
*************************************************************************/
void lcd_command(uint8_t cmd)
{
lcd_waitbusy();
lcd_write(cmd,0);
}
/*************************************************************************
Send data byte to LCD controller
Input: data to send to LCD controller, see HD44780 data sheet
EHD project-Speedometer 34
Returns: none
*************************************************************************/
void lcd_data(uint8_t data)
{
lcd_waitbusy();
lcd_write(data,1);
}
/*************************************************************************
Set cursor to specified position
Input: x horizontal position (0: left most position)
y vertical position (0: first line)
Returns: none
*************************************************************************/
void lcd_gotoxy(uint8_t x, uint8_t y)
{
#if LCD_LINES==1
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
#endif
#if LCD_LINES==2
if ( y==0 )
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
else
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
#endif
#if LCD_LINES==4
if ( y==0 )
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE1+x);
else if ( y==1)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE2+x);
else if ( y==2)
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE3+x);
else /* y==3 */
lcd_command((1<<LCD_DDRAM)+LCD_START_LINE4+x);
#endif
}/* lcd_gotoxy */
/*************************************************************************
*************************************************************************/
int lcd_getxy(void)
{
return lcd_waitbusy();
}
EHD project-Speedometer 35
/*************************************************************************
Clear display and set cursor to home position
*************************************************************************/
void lcd_clrscr(void)
{
lcd_command(1<<LCD_CLR);
}
/*************************************************************************
Set cursor to home position
*************************************************************************/
void lcd_home(void)
{
lcd_command(1<<LCD_HOME);
}
/*************************************************************************
Display character at current cursor position
Input: character to be displayed
Returns: none
*************************************************************************/
void lcd_putc(char c)
{
uint8_t pos;
}
#elif LCD_LINES==4
if ( pos == LCD_START_LINE1+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0);
}else if ( pos == LCD_START_LINE2+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0);
}else if ( pos == LCD_START_LINE3+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0);
}else if ( pos == LCD_START_LINE4+LCD_DISP_LENGTH ) {
lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0);
}
#endif
lcd_waitbusy();
#endif
lcd_write(c, 1);
}
}/* lcd_putc */
/*************************************************************************
Display string without auto linefeed
Input: string to be displayed
Returns: none
*************************************************************************/
void lcd_puts(const char *s)
/* print string on lcd (no auto linefeed) */
{
register char c;
while ( (c = *s++) ) {
lcd_putc(c);
}
}/* lcd_puts */
/*************************************************************************
Display string from program memory without auto linefeed
Input: string from program memory be be displayed
Returns: none
*************************************************************************/
void lcd_puts_p(const char *progmem_s)
/* print string from program memory on lcd (no auto linefeed) */
{
register char c;
EHD project-Speedometer 37
while ( (c = pgm_read_byte(progmem_s++)) ) {
lcd_putc(c);
}
}/* lcd_puts_p */
/*************************************************************************
Initialize display and select type of cursor
Input: dispAttr LCD_DISP_OFF display off
LCD_DISP_ON display on, cursor off
LCD_DISP_ON_CURSOR display on, cursor on
LCD_DISP_CURSOR_BLINK display on, cursor on flashing
Returns: none
*************************************************************************/
void lcd_init(uint8_t dispAttr)
{
#if LCD_IO_MODE
/*
* Initialize LCD to 4 bit I/O mode
*/
/* configure all port bits as output (LCD data and control lines on different ports */
DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN);
DDR(LCD_E_PORT) |= _BV(LCD_E_PIN);
DDR(LCD_DATA0_PORT) |= _BV(LCD_DATA0_PIN);
DDR(LCD_DATA1_PORT) |= _BV(LCD_DATA1_PIN);
DDR(LCD_DATA2_PORT) |= _BV(LCD_DATA2_PIN);
DDR(LCD_DATA3_PORT) |= _BV(LCD_DATA3_PIN);
}
delay(16000); /* wait 16ms or more after power-on */
/* from now the LCD only accepts 4 bit I/O, we can use lcd_command() */
#else
/*
* Initialize LCD to 8 bit memory mapped mode
*/
/* enable external SRAM (memory mapped lcd) and one wait state */
MCUCR = _BV(SRE) | _BV(SRW);
/* reset LCD */
delay(16000); /* wait 16ms after power-on */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(4992); /* wait 5ms */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(64); /* wait 64us */
lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */
delay(64); /* wait 64us */
EHD project-Speedometer 39
#endif
#if KS0073_4LINES_MODE
/* Display with KS0073 controller requires special commands for enabling 4 line mode */
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_ON);
lcd_command(KS0073_4LINES_MODE);
lcd_command(KS0073_EXTENDED_FUNCTION_REGISTER_OFF);
#else
lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */
#endif
lcd_command(LCD_DISP_OFF); /* display off */
lcd_clrscr(); /* display clear */
lcd_command(LCD_MODE_DEFAULT); /* set entry mode */
lcd_command(dispAttr); /* display/cursor control */
}/* lcd_init */
EHD project-Speedometer 40
Lcd.h
#ifndef LCD_H
#define LCD_H
/*************************************************************************
Title : C include file for the HD44780U LCD library (lcd.c)
Author: Peter Fleury <[email protected]> http://jump.to/fleury
File: $Id: lcd.h,v 1.13.2.2 2006/01/30 19:51:33 peter Exp $
Software: AVR-GCC 3.3
Hardware: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
***************************************************************************
/
/**
@defgroup pfleury_lcd LCD library
@code #include <lcd.h> @endcode
Memory mapped mode compatible with Kanda STK200, but supports also
generation of R/W signal through A8 address line.
*/
/*@{*/
#include <inttypes.h>
#include <avr/pgmspace.h>
/**
* @name Definitions for MCU Clock Frequency
EHD project-Speedometer 41
/**
* @name Definition for LCD controller type
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
*/
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073
controller */
/**
* @name Definitions for Display Size
* Change these definitions to adapt setting to your display
*/
#define LCD_LINES 2 /**< number of visible lines of the display */
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
#endif
/**
* @name Definitions for LCD command instructions
* The constants define the various LCD controller instructions which can be passed to the
* function lcd_command(), see HD44780 data sheet for a complete description.
*/
/* set entry mode: display shift on/off, dec/inc cursor move direction */
#define LCD_ENTRY_DEC 0x04 /* display shift off, dec cursor move dir */
#define LCD_ENTRY_DEC_SHIFT 0x05 /* display shift on, dec cursor move dir */
#define LCD_ENTRY_INC_ 0x06 /* display shift off, inc cursor move dir */
#define LCD_ENTRY_INC_SHIFT 0x07 /* display shift on, inc cursor move dir */
/* function set: set interface data length and number of display lines */
#define LCD_FUNCTION_4BIT_1LINE 0x20 /* 4-bit interface, single line, 5x7 dots */
#define LCD_FUNCTION_4BIT_2LINES 0x28 /* 4-bit interface, dual line, 5x7 dots */
#define LCD_FUNCTION_8BIT_1LINE 0x30 /* 8-bit interface, single line, 5x7 dots */
#define LCD_FUNCTION_8BIT_2LINES 0x38 /* 8-bit interface, dual line, 5x7 dots */
/**
* @name Functions
*/
/**
@brief Initialize display and select type of cursor
@param dispAttr \b LCD_DISP_OFF display off\n
EHD project-Speedometer 44
/**
@brief Clear display and set cursor to home position
@param void
@return none
*/
extern void lcd_clrscr(void);
/**
@brief Set cursor to home position
@param void
@return none
*/
extern void lcd_home(void);
/**
@brief Set cursor to specified position
/**
@brief Display character at current cursor position
@param c character to be displayed
@return none
*/
extern void lcd_putc(char c);
/**
@brief Display string without auto linefeed
@param s string to be displayed
@return none
*/
EHD project-Speedometer 45
/**
@brief Display string from program memory without auto linefeed
@param s string from program memory be be displayed
@return none
@see lcd_puts_P
*/
extern void lcd_puts_p(const char *progmem_s);
/**
@brief Send LCD controller instruction command
@param cmd instruction to send to LCD controller, see HD44780 data sheet
@return none
*/
extern void lcd_command(uint8_t cmd);
/**
@brief Send data byte to LCD controller
/**
@brief macros for automatically storing string constant in program memory
*/
#define lcd_puts_P(__s) lcd_puts_p(PSTR(__s))
/*@}*/
#endif //LCD_H