ece312/lab_3/lcdlibrary/test_lcd.c

168 lines
4.6 KiB
C

/*************************************************************************
Title: Testing output to a HD44780 based LCD display.
Author: Peter Fleury <pfleury@gmx.ch> http://tinyurl.com/peterfleury
File: $Id: test_lcd.c,v 1.8 2015/01/31 18:04:08 peter Exp $
Software: AVR-GCC 4.x
Hardware: HD44780 compatible LCD text display
AVR with external SRAM interface if memory-mapped LCD interface is used
any AVR with 7 free I/O pins if 4-bit IO port mode is used
**************************************************************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd.h"
/*
** constant definitions
*/
static const PROGMEM unsigned char copyRightChar[] =
{
0x07, 0x08, 0x13, 0x14, 0x14, 0x13, 0x08, 0x07,
0x00, 0x10, 0x08, 0x08, 0x08, 0x08, 0x10, 0x00
};
/*
** function prototypes
*/
void wait_until_key_pressed(void);
void wait_until_key_pressed(void)
{
unsigned char temp1, temp2;
do {
temp1 = PIND; // read input
_delay_ms(5); // delay for key debounce
temp2 = PIND; // read input
temp1 = (temp1 & temp2); // debounce input
} while ( temp1 & _BV(PIND2) );
loop_until_bit_is_set(PIND,PIND2); /* wait until key is released */
}
int main(void)
{
char buffer[7];
int num=134;
unsigned char i;
DDRD &=~ (1 << PD2); /* Pin PD2 input */
PORTD |= (1 << PD2); /* Pin PD2 pull-up enabled */
/* initialize display, cursor off */
lcd_init(LCD_DISP_ON);
for (;;) { /* loop forever */
/*
* Test 1: write text to display
*/
/* clear display and home cursor */
lcd_clrscr();
/* put string to display (line 1) with linefeed */
lcd_puts("LCD Test Line 1\n");
/* cursor is now on second line, write second line */
lcd_puts("Line 2");
/* move cursor to position 8 on line 2 */
lcd_gotoxy(7,1);
/* write single char to display */
lcd_putc(':');
/* wait until push button PD2 (INT0) is pressed */
wait_until_key_pressed();
/*
* Test 2: use lcd_command() to turn on cursor
*/
/* turn on cursor */
lcd_command(LCD_DISP_ON_CURSOR);
/* put string */
lcd_puts( "CurOn");
/* wait until push button PD2 (INT0) is pressed */
wait_until_key_pressed();
/*
* Test 3: display shift
*/
lcd_clrscr(); /* clear display home cursor */
/* put string from program memory to display */
lcd_puts_P( "Line 1 longer than 14 characters\n" );
lcd_puts_P( "Line 2 longer than 14 characters" );
/* move BOTH lines one position to the left */
lcd_command(LCD_MOVE_DISP_LEFT);
/* wait until push button PD2 (INT0) is pressed */
wait_until_key_pressed();
/* turn off cursor */
lcd_command(LCD_DISP_ON);
/*
* Test: Display integer values
*/
lcd_clrscr(); /* clear display home cursor */
/* convert interger into string */
itoa( num , buffer, 10);
/* put converted string to display */
lcd_puts(buffer);
/* wait until push button PD2 (INT0) is pressed */
wait_until_key_pressed();
/*
* Test: Display userdefined characters
*/
lcd_clrscr(); /* clear display home cursor */
lcd_puts("Copyright: ");
/*
* load two userdefined characters from program memory
* into LCD controller CG RAM location 0 and 1
*/
lcd_command(_BV(LCD_CGRAM)); /* set CG RAM start address 0 */
for(i=0; i<16; i++)
{
lcd_data(pgm_read_byte_near(&copyRightChar[i]));
}
/* move cursor to position 0 on line 2 */
/* Note: this switched back to DD RAM adresses */
lcd_gotoxy(0,1);
/* display user defined (c), built using two user defined chars */
lcd_putc(0);
lcd_putc(1);
/* wait until push button PD2 (INT0) is pressed */
wait_until_key_pressed();
}
}