All pastes #2127921 Raw Edit

Untitled

public text v1 · immutable
#2127921 ·published 2012-03-13 19:55 UTC
rendered paste body
#ifndef F_CPU
        #define F_CPU 8000000UL //8MHz
#endif
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "lcd.h"
//#include "interrupts.h"

#define LCD_PORT PORTB
#define LCD_REGISTER DDRB
#define LCD_VDD_PIN 0
#define LCD_VSS_PIN 1
#define LCD_LOAD_PIN 2
#define LCD_DATA_PIN 3
#define LCD_CLK_PIN 4
#define LCD_CHK_PIN 5
#define LCD_POWER(flag) \
        ((flag)? (LCD_PORT |= ((1 << LCD_VDD_PIN) | (0 << LCD_VSS_PIN))): \
                (LCD_PORT &= ~((1 << LCD_VDD_PIN) | (1 << LCD_VSS_PIN))))
#define LCD_CLOCK(flag) \
        ((flag)? (LCD_PORT |= (1 << LCD_CLK_PIN)): \
                (LCD_PORT &= ~(1 << LCD_CLK_PIN)))
#define LCD_DATA(flag) \
		((flag)? (LCD_PORT |= (1 << LCD_DATA_PIN)): \
				(LCD_PORT &= ~(1 << LCD_DATA_PIN)))
#define LCD_LOAD(flag) \
        ((flag)? (LCD_PORT |= (1 << LCD_LOAD_PIN)): \
                (LCD_PORT &= ~(1 << LCD_LOAD_PIN)))
static uint8_t init_complete = 0;
const uint8_t digit_buffer[10] = {
		1+2+8+16+32+64,
		64+32,
		16+32+4+2+1,
		16+32+4+64+1,
		8+4+32+64,
		16+8+4+64+1,
		16+8+2+4+1+64,
		16+32+64,
		127,
		127-2
};
static volatile uint8_t lcd_buffer[] = {
		0, 0, 0, 0, 0, 0, 0, 0
};
static volatile uint8_t dp_buffer[] = {
		0, 0, 0, 0, 0, 0, 0, 0
};
static volatile uint8_t us_buffer[] = {
		0, 0, 0, 0, 0, 0, 0, 0
};
void lcd_strobe(uint8_t select_io) {
	switch (select_io) {
	case 0:
		LCD_CLOCK(1);
		_delay_us(1);
		LCD_CLOCK(0);
		_delay_us(1);
	case 1:
		LCD_LOAD(1);
		_delay_us(1);
		LCD_LOAD(0);
		_delay_us(1);
	default:
		break;
	}
}
void write_data(void) {
	uint8_t dp = 0;
	uint8_t underscore = 0;
	uint8_t data = 0;
	for (uint8_t i = 8; i > 0; i--) {
		dp = dp_buffer[i];
		lcd_strobe(0);
		if (dp)
			LCD_DATA(1);
		else
			LCD_DATA(0);
		for (uint8_t j = 8; j > 0; j--) {
			underscore = us_buffer[j];
			lcd_strobe(0);
			if (underscore)
				LCD_DATA(1);
			else
				LCD_DATA(0);
			data = lcd_buffer[j];
			for (uint8_t z = 8; z > 0; z--) {
				lcd_strobe(0);
				if (data & 0x40)
					LCD_DATA(1);
				else
					LCD_DATA(0);
				data = data << 1;
			}
		}
	}
	lcd_strobe(1);
}
void clear_buffers(void) {
	for (uint8_t i = 0; i < sizeof(dp_buffer); i++) {
		dp_buffer[i] = 0;
	}
	for (uint8_t i = 0; i < sizeof(us_buffer); i++) {
		us_buffer[i] = 0;
	}
	for (uint8_t i = 0; i < sizeof(lcd_buffer); i++) {
		lcd_buffer[i] = 0;
	}
}
void init_lcd(void) {
	if (!init_complete) {
		LCD_REGISTER = 0x1F;
		LCD_POWER(1);
		init_complete = 1;
	}
	for (uint8_t i = 0; i < 10; i++) {
		clear_buffers();
		lcd_buffer[1] = digit_buffer[i];
		if (i < 9) {
			us_buffer[i] = 1;
			dp_buffer[i] = 1;
		}
		write_data();
		_delay_ms(1000);
	}
}