Businesscard-V2/Software/Class-Port/src/CDisplay.cpp

153 lines
3.1 KiB
C++

#include "CDisplay.h"
CDisplay::CDisplay()
{
initDisplay();
}
CDisplay::~CDisplay() {}
void CDisplay::initDisplay()
{
for(int i=0; i<12; i++) display[i] = 0x0;
// display[0] = 0xFFFF;
// display[11] = 0xFFFF;
//Output-Pins setzen
pinMode(BD_B0, OUTPUT);
pinMode(BD_B1, OUTPUT);
pinMode(BD_B2, OUTPUT);
pinMode(SR_SER, OUTPUT);
pinMode(SR_RCK, OUTPUT);
pinMode(SR_BSS, OUTPUT);
pinMode(BD_OE, OUTPUT);
pinMode(BD_B3, OUTPUT);
pinMode(BUZ_PIN, OUTPUT);
pinMode(BUT_A, INPUT);
pinMode(BUT_B, INPUT);
digitalWrite(BD_OE, LOW);
digitalWrite(BD_B0, LOW);
digitalWrite(BD_B1, LOW);
digitalWrite(BD_B2, LOW);
digitalWrite(BD_B3, LOW);
for(int i=0; i<12; i++) display[i] = 0x0000;
}
void CDisplay::shiftBit(bool bit)
{
// PORTB &= ~(1<<SR_BSS);
digitalWrite(SR_BSS, LOW);
// PORTC &= ~(1<<SR_SER);
digitalWrite(SR_SER, LOW);
// PORTC |= ((bit&0b1)<<SR_SER);
digitalWrite(SR_SER, bit&0b1);
// PORTC |= (1<<SR_RCK);
digitalWrite(SR_RCK, HIGH);
// PORTC &= ~(1<<SR_RCK);
digitalWrite(SR_RCK, LOW);
// PORTB |= (1<<SR_BSS);
digitalWrite(SR_BSS, HIGH);
}
void CDisplay::shift16BITValue(uint16_t val)
{
uint8_t i;
for(i=0; i<17; i++)
{
uint8_t bit = 0;
bit = (val >> i) & 0b1;
shiftBit(bit);
}
}
void CDisplay::displayRow(uint8_t row)
{
// uint8_t push_val;
// row = row % 12;
// // uint16_t rval = display[row];
// // uint16_t rval = 0xFFFF - (row << 8);
// //Deactivate OE Line
// digitalWrite(BD_OE, LOW);
// PORTD &= ~(1<<BD_B0);
digitalWrite(BD_B0, LOW);
// PORTD &= ~(1<<BD_B1);
digitalWrite(BD_B1, LOW);
// PORTD &= ~(1<<BD_B2);
digitalWrite(BD_B2, LOW);
// PORTB &= ~(1<<BD_B3);
digitalWrite(BD_B3, LOW);
// //Clear shift registers
shift16BITValue(0xFFFF);
shift16BITValue(0x0000);
//Set shift reg
shift16BITValue(display[row]);
// shift8BITValue((uint8_t)((bitmap[row]>>7) & 0xFF));
// //Now activate the corresponding row by some nice bit arithmetics ;)
digitalWrite(BD_B0, row&0b1);
digitalWrite(BD_B1, (row>>1)&0b1);
digitalWrite(BD_B2, (row>>2)&0b1);
digitalWrite(BD_B3, (row>>3)&0b1);
digitalWrite(BD_OE, LOW);
// PORTD |= ((row&0b1)<<BD_B0);
// PORTD |= (((row>>1)&0b1)<<BD_B1);
// PORTD |= (((row>>2)&0b1)<<BD_B2);
// PORTB |= (((row>>3)&0b1)<<BD_B3);
// PORTB &= ~(1<<BD_OE);
delayMicroseconds(400);
// PORTB |= (1<<BD_OE);
digitalWrite(BD_OE, HIGH);
}
void CDisplay::drawScreen(int rdelay=1)
{
for(int i=0; i<12; i++)
{
displayRow(i);
delay(rdelay);
}
}
void CDisplay::setRow(uint8_t row, uint16_t val)
{
display[row] = val;
}
void CDisplay::beep(uint16_t time_ms, uint8_t pitch)
{
// pitch = pitch & 3;
for(uint16_t i=0; i<(time_ms + (time_ms%12)); i++)
{
#ifndef BEQUIET
digitalWrite(BUZ_PIN, HIGH);
#endif
displayRow(i%12);
delayMicroseconds(100 * pitch);
#ifndef BEQUIET
digitalWrite(BUZ_PIN, LOW);
#endif
displayRow(i%12);
delayMicroseconds(100 * pitch);
}
}
void CDisplay::setPixelAt(int col, int row, bool val)
{
if(val) display[row] |= 1<<col+1;
else display[row] &= ~(1<<col+1);
}