#include <avr/delay.h>
#include <stdbool.h>
#define DATA0 PD0
#define DATA1 PD1
#define DATA2 PD2
#define DATA3 PD4
#define DATA4 PD5
#define DATA5 PD6
#define DATA6 PD7
#define DATA7 PB0
#define RS PB1
#define RW PB2
#define E PB3
int pins_data[8] = {DATA0, DATA1, DATA2, DATA3, DATA4, DATA5, DATA6, DATA7};
int pins_misc[3] = {RS, RW, E};
unsigned int bit_mask[8] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000};
bool bits[8];
int main(void){
SET_DDR(pins_data, pins_misc);
LCD_CLEAR_DATA_PINS(pins_data);
uint8_t value = 252;
LCD_SET_DATA_PINS(pins_data, bits, value);
}
void LCD_SETUP(){
PORTB &= (0 << RS); // 0 for CONFIGURATION
PORTB &= (0 << RW); // 0 for WRITE
}
void LCD_CLEAR_DATA_PINS(int* pins){
for(int i = 0; i < 8; i++){
if(i < 7){
PORTD &= (0 << pins[i]);
}else {
PORTB &= (0 << pins[7]);
}
}
}
void LCD_SET_DATA_PINS(int* pins, bool* bits, uint8_t value){
decToBin(bit_mask, bits, value);
LCD_CLEAR_DATA_PINS(pins);
for(int j = 0; j < 8; j++){
if(bits[j] && j < 7){
PORTD |= (1 << pins[j]);
}else if(bits[j]){
PORTB |= (1 << pins[j]);
}
}
}
/*Arguments: array of masks for the 8 individual bits,
bool array to store the binary numbers in,
8bit unsigned decimal,
Return: Nothing. Stores result in the bit-array*/
void decToBin(unsigned int mask[], bool bits[], unsigned int value){
for(int i = 0; i<8; i++){
unsigned int bit_status = value & mask[i];
bits[i] = bit_status ? 1 : 0;
}
}
void SET_DDR(int* data_pins, int* misc_pins){
for(int i = 0; i < 8; i++){
if(i < 7){
DDRD |= (1 << data_pins[i]);
}else{
DDRB |= (1 << data_pins[i]);
}
}
//
for(int j = 0; j < 3; j++){
DDRB |= (1 << misc_pins[j]);
}
// D2 as INPUT
DDRD |= (1 << PD2);
}
void LCD_ENABLE(void){
}