From be38a8b7d03cd52e4fd0bb5d71f2068b3c045499 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 24 Jan 2019 10:44:12 +0100 Subject: [PATCH] matrix is working --- led.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 147 insertions(+), 4 deletions(-) diff --git a/led.c b/led.c index fa994c1..e761aea 100644 --- a/led.c +++ b/led.c @@ -11,14 +11,157 @@ #include +/* + 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 +*/ + +typedef enum { BLUE = 0, RED = 1 } tColor; + +void selectCol(uint8_t column, tColor color) { + if (color == 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; + } + } else { + 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; + } + } +} void ledExec() { - P1OUT ^= BIT0; + + 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 ledInit() { - P1DIR |= BIT0; - P1OUT &= ~BIT0; + //selectRow(0); + //selectCol(0, BLUE); - schAdd(ledExec, NULL, 0, 100); + schAdd(ledExec, NULL, 0, 10); }