#include <Arduino.h>
#include<avr/io.h>
#include<avr/interrupt.h>
#include "max.h"
#define DDR_SPI DDRB
#define DD_MOSI PORTB3
#define DD_SCK PORTB5
#define DD_SS PORTB2
#define SS (1<<PORTB2)
void displayData(unsigned char *data,int size);
void scrollLetter(unsigned char wrd[],int size);
void SPI_MasterInit(void);
void SPI_MasterTransmit(char command,char cData);
void matrix_setup();
#define ROWS 4
#define COLS 4
// Define the key values for the 4x4 matrix keyboard
char keys[ROWS][COLS] = {
{'W', 'E', 'L', 'A'},
{'M', 'O', 'C', 'W'},
{'W', 'E', 'L', 'E'},
{'E', 'M', 'O', 'L'}
};
uint8_t rows[8] = {ROW0,ROW1,ROW2,ROW3,ROW4,ROW5,ROW6,ROW7};
unsigned char letter[8];
void displayData(unsigned char *data,int size){
for(int i=0;i<size;i++){
SPI_MasterTransmit(rows[i],data[i]);
}
}
void scrollLetter(const char *wrd,int size){
for(int i=0;i<size;i++){
ledLetter(wrd[i],letter);
unsigned char x[8];
cpyArray(x,letter);
ledLetter(wrd[i+1],letter);
unsigned char y[8];
cpyArray(y,letter);
unsigned char temp[8];
for(int j=0;j<8;j++){
for(int i=0;i<8;i++){
temp[7-i] = (x[i]<<j)|(y[i]>>(8-j));
}
displayData(temp,8);
delay(250);
}
}
}
void displayLetter(char ltr){
ledLetter(ltr,letter);
displayData(letter,8);
delay(2000);
}
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, SS line */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
//PORTB|=SS; // Making SS high to stop any TX
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char command,char cData)
{
/* Start command transmission */
PORTB&=(~SS); // MAKE CHIP SELECT LOW
SPDR = command;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
/* Start data transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
PORTB|=(SS);
}
void matrix_setup(){
//SPI_MasterTransmit(SHUTDOWN_MAX,0x00);
SPI_MasterTransmit(DECODER_MAX,0x00);
SPI_MasterTransmit(INTENSITYR_MAX,0x07);
SPI_MasterTransmit(SCAN_MAX,0x07);
}
int getData(){
for(int i=0;i<4;i++){
setRowHigh(i);
for(int j=0;j<4;j++){
if(readColumn(j)){
return keys[i][j];
}
}
resetRow(i);
}
return -1;
}
void setup() {
SPI_MasterInit();
matrix_setup();
keypad_port_init();
}
void loop() {
// put your main code here, to run repeatedly:
// SPI_MasterTransmit(ROW0,0X0F);
// SPI_MasterTransmit(ROW3,0X0F);
// SPI_MasterTransmit(ROW7,0X0F);
//scrollLetter("WELCOME",7);
//displayLetter('A');
//displayLetter('B');
int current = getData();
if(current!=-1){
displayLetter('A');
debounce();
}else{
displayLetter('\0');
}
}