Added 7-segment display with 595 shift register
parent
d2ff50a161
commit
26807a7d16
@ -0,0 +1,10 @@
|
||||
#ifndef DISP7SEG_H_INCLUDED
|
||||
#define DISP7SEG_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern void DispPutDigit(uint8_t pos, char chr, uint8_t dp);
|
||||
extern void ShiftReg_Update(void);
|
||||
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,94 @@
|
||||
/***************************************************************************//**
|
||||
* @file disp7seg.c
|
||||
* @brief 7-segment display handling
|
||||
*******************************************************************************/
|
||||
|
||||
#include "disp7seg.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
static uint8_t ShrBuf[SHR_COUNT] = {0}; // buffer for ext. shift register
|
||||
static uint8_t ShrDirty = 1; // update request
|
||||
|
||||
/***************************************************************************//**
|
||||
* @brief Write data to external shift register on changes
|
||||
*******************************************************************************/
|
||||
void ShiftReg_Update() {
|
||||
if (ShrDirty == 0) return; // register is up to date
|
||||
ShrDirty = 0;
|
||||
|
||||
uint_fast8_t shrsel = SHR_COUNT;
|
||||
while (shrsel--) {
|
||||
uint8_t reg = ShrBuf[shrsel];
|
||||
uint_fast8_t clkcnt;
|
||||
for (clkcnt = 0; clkcnt < 8; clkcnt++) {
|
||||
SHRCLK_LO();
|
||||
if (reg & 0x80) { SHRDIN_HI(); }
|
||||
else { SHRDIN_LO(); }
|
||||
reg <<= 1; // shift left
|
||||
Delay_us(1);
|
||||
SHRCLK_HI(); // clock pulse
|
||||
Delay_us(1);
|
||||
}
|
||||
}
|
||||
SHRSTR_HI(); // strobe pulse
|
||||
SHRCLK_LO();
|
||||
SHRDIN_LO();
|
||||
Delay_us(1);
|
||||
SHRSTR_LO();
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
/brief Segment table for 7 segment display
|
||||
|
||||
For ASCII characters range 0x20...0x60
|
||||
|
||||
Segment <--> bit allocation
|
||||
/code
|
||||
|
||||
0000
|
||||
5 1
|
||||
5 1
|
||||
6666
|
||||
4 2
|
||||
4 2
|
||||
3333 77
|
||||
*******************************************************************************/
|
||||
static const uint8_t LcdAscii7segTable[] = {
|
||||
0x00, 0x82, 0xA2, 0x5C, 0x6D, 0x00, 0x7F, 0x02, // space ... apostrof
|
||||
0x39, 0x0F, 0x00, 0x00, 0x04, 0x40, 0x00, 0x52, // ( ... slash
|
||||
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0 ... 9
|
||||
0x48, 0x48, 0x58, 0x48, 0x4C, 0x53, 0x7B, // : ... @
|
||||
|
||||
0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x3D, 0x76, // ABCDEFGH
|
||||
0x06, 0x1E, 0x7A, 0x38, 0x37, 0x54, 0x3F, 0x73, // IJKLMNOP
|
||||
0x67, 0x50, 0x6D, 0x78, 0x3E, 0x3E, 0x3E, 0x76, // QRSTUVWX
|
||||
0x6E, 0x5B, 0x39, 0x64, 0x0F, 0x23, 0x08, 0x60, // YZ[\]^_`
|
||||
|
||||
0x5F, 0x7C, 0x58, 0x5E, 0x79, 0x71, 0x6F, 0x74, // abcdefgh
|
||||
0x04, 0x1E, 0x7A, 0x06, 0x37, 0x54, 0x5C, 0x73, // ijklmnop
|
||||
0x67, 0x50, 0x6D, 0x78, 0x1C, 0x1C, 0x1C, 0x76, // qrstuvwx
|
||||
0x6E, 0x5B, 0x39, 0x30, 0x0F, 0x62 // yz{|}~
|
||||
};
|
||||
|
||||
/***************************************************************************//**
|
||||
* \brief Print characters to 7 segment display
|
||||
*******************************************************************************/
|
||||
void DispPutDigit(uint8_t pos, char chr, uint8_t dp) {
|
||||
if (pos >= SHR_COUNT) return;
|
||||
|
||||
uint8_t* disp_buf = ShrBuf;
|
||||
uint8_t segments;
|
||||
|
||||
uint8_t c = chr;
|
||||
if (c >= ' ' && c < 127) segments = LcdAscii7segTable[c-' '];
|
||||
//else if (c == '°') segments = 0x63;
|
||||
else segments = 0;
|
||||
if (dp) segments |= 0x80; // decimal point
|
||||
uint8_t prevseg = disp_buf[pos];
|
||||
disp_buf[pos] = ~segments; // write new digit
|
||||
|
||||
if (prevseg != disp_buf[pos]) { // buffer changed
|
||||
ShrDirty = 1; // update request
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue