blinky1/led.c

228 lines
6.4 KiB
C

/*
* led.c
*
* Created on: Jan 24, 2019
* Author: wn
*/
#include "led.h"
#include "PontCoopScheduler.h"
#include <msp430g2553.h>
#include <stdlib.h>
#define SIZE 4
tColor matrix[SIZE][SIZE] = {
{ OFF, OFF, OFF, OFF },
{ OFF, OFF, OFF, OFF },
{ OFF, OFF, OFF, OFF },
{ OFF, OFF, OFF, OFF }
};
void ledSetMatrix(uint8_t col, uint8_t row, tColor color) {
if ((col < SIZE) && (row < SIZE)) {
matrix[col][row] = color;
}
}
/*
row0: P1.3
row1: P1.4
row2: P1.5
row3: P1.7
*/
static inline void selectRow(uint8_t row) {
switch (row) {
case 0:
P1DIR &= ~(BIT3 | BIT4 | BIT7);
P1OUT &= ~(BIT3 | BIT4 | BIT7);
P1DIR |= BIT2;
P1OUT |= BIT2;
break;
case 1:
P1DIR &= ~(BIT2 | BIT4 | BIT7);
P1OUT &= ~(BIT2 | BIT4 | BIT7);
P1DIR |= BIT3;
P1OUT |= BIT3;
break;
case 2:
P1DIR &= ~(BIT2 | BIT3 | BIT7);
P1OUT &= ~(BIT2 | BIT3 | BIT7);
P1DIR |= BIT4;
P1OUT |= BIT4;
break;
case 3:
P1DIR &= ~(BIT2 | BIT3 | BIT4);
P1OUT &= ~(BIT2 | BIT3 | BIT4);
P1DIR |= BIT7;
P1OUT |= BIT7;
break;
}
}
/*
col0, blue: P1.5
col0, red: P2.0
col1, blue: P2.2
col1, red: P2.1
col2, blue: P2.4
col2, red: P2.3
col3, blue: P2.5
col3, red: P1.6
*/
void selectCol(uint8_t column, tColor color) {
switch (color) {
case BLUE:
switch (column) {
case 0:
P1DIR &= ~(BIT6);
P1OUT &= ~(BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P1DIR |= BIT5;
P1OUT &= ~BIT5;
break;
case 1:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT1 | BIT4 | BIT3 | BIT5);
P2DIR |= BIT2;
P2OUT &= ~BIT2;
break;
case 2:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT3 | BIT5);
P2DIR |= BIT4;
P2OUT &= ~BIT4;
break;
case 3:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT3 | BIT4);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT3 | BIT4);
P2DIR |= BIT5;
P2OUT &= ~BIT5;
break;
}
break;
case RED:
switch (column) {
case 0:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2DIR |= BIT0;
P2OUT &= ~BIT0;
break;
case 1:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT4 | BIT3 | BIT5);
P2DIR |= BIT1;
P2OUT &= ~BIT1;
break;
case 2:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT5);
P2DIR |= BIT3;
P2OUT &= ~BIT3;
break;
case 3:
P1DIR &= ~(BIT5);
P1OUT &= ~(BIT5);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P1DIR |= BIT6;
P1OUT &= ~BIT6;
break;
}
break;
case OFF:
switch (column) {
case 0:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
break;
case 1:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
break;
case 2:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
break;
case 3:
P1DIR &= ~(BIT5 | BIT6);
P1OUT &= ~(BIT5 | BIT6);
P2DIR &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
P2OUT &= ~(BIT0 | BIT2 | BIT1 | BIT4 | BIT3 | BIT5);
break;
}
break;
}
}
/*
void testledExec() {
static uint8_t rowNum = 0;
static uint8_t colNum = 0;
static tColor color = BLUE;
selectRow(rowNum);
selectCol(colNum, color);
if (color == BLUE) {
color = RED;
} else {
color = BLUE;
rowNum++;
if (rowNum > 3) {
rowNum = 0;
colNum++;
if (colNum > 3) {
colNum = 0;
}
}
}
}
*/
void ledExec() {
static uint8_t rowNum = SIZE;
static uint8_t colNum = SIZE;
colNum++;
if (colNum >= SIZE) {
colNum = 0;
rowNum++;
if (rowNum >= SIZE) {
rowNum = 0;
}
selectRow(rowNum);
}
selectCol(colNum, matrix[colNum][rowNum]);
}
void ledInit() {
schAdd(ledExec, NULL, 0, 10);
}