153 lines
3.1 KiB
C++
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);
|
|
}
|