A library for interfacing with the SN74HC595N Shift register. Includes functions for writing bits, bytes, animation and bits at spesified positions.

Committer:
benrammok
Date:
Thu Jan 14 22:14:40 2016 +0000
Revision:
5:0bb6aa206b86
Parent:
4:61198ffab8ca
Redone docs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benrammok 0:e576e892f0ca 1 #include "mbed.h"
benrammok 0:e576e892f0ca 2 #include "ShiftOut.h"
benrammok 0:e576e892f0ca 3
benrammok 0:e576e892f0ca 4
benrammok 0:e576e892f0ca 5 #define SET_LATCH() (LATCH = 0)
benrammok 0:e576e892f0ca 6 #define RESET_LATCH() (LATCH = 1)
benrammok 0:e576e892f0ca 7
benrammok 0:e576e892f0ca 8 #define ENABLE_RESET() (RESET = 0)
benrammok 0:e576e892f0ca 9 #define DISABLE_RESET() (RESET = 1)
benrammok 0:e576e892f0ca 10
benrammok 4:61198ffab8ca 11 static char stateArr[8*REGISTER_CNT] = {0};
benrammok 3:a0df8989ffa2 12 static bool hasChanged = false;
benrammok 0:e576e892f0ca 13
benrammok 0:e576e892f0ca 14 ShiftOut::ShiftOut(PinName ser, PinName srclk, PinName rclk,
benrammok 4:61198ffab8ca 15 PinName oe, PinName reset) : DSERIAL(ser), SRCLK(srclk), RCLK(rclk), LATCH(oe), RESET(reset)
benrammok 0:e576e892f0ca 16 {
benrammok 0:e576e892f0ca 17 writeByte(0x00); // Reset the values of the registers to 0
benrammok 0:e576e892f0ca 18 if(RESET != NC){
benrammok 0:e576e892f0ca 19 DISABLE_RESET();
benrammok 0:e576e892f0ca 20 }
benrammok 0:e576e892f0ca 21 }
benrammok 0:e576e892f0ca 22
benrammok 0:e576e892f0ca 23 //Pulses the register
benrammok 0:e576e892f0ca 24 void ShiftOut::updateRegister(){
benrammok 0:e576e892f0ca 25 SRCLK = 1;
benrammok 0:e576e892f0ca 26 wait_us(2);
benrammok 0:e576e892f0ca 27 SRCLK = 0;
benrammok 0:e576e892f0ca 28 }
benrammok 4:61198ffab8ca 29 //Updates the output register
benrammok 0:e576e892f0ca 30 void ShiftOut::updateOutput(){
benrammok 0:e576e892f0ca 31 RCLK = 1;
benrammok 0:e576e892f0ca 32 wait_us(2);
benrammok 0:e576e892f0ca 33 RCLK = 0;
benrammok 0:e576e892f0ca 34 }
benrammok 4:61198ffab8ca 35 //Writes a byte to the shift register
benrammok 0:e576e892f0ca 36 void ShiftOut::writeByte(unsigned char byte){
benrammok 3:a0df8989ffa2 37 hasChanged = true;
benrammok 4:61198ffab8ca 38 for(int i = 0; i<8*REGISTER_CNT; i++){
benrammok 0:e576e892f0ca 39 DSERIAL = (byte & 0x01<<i)>>i;
benrammok 0:e576e892f0ca 40 updateRegister();
benrammok 0:e576e892f0ca 41 }
benrammok 0:e576e892f0ca 42 updateOutput();
benrammok 0:e576e892f0ca 43 }
benrammok 4:61198ffab8ca 44 //Writes a bit to the shift register
benrammok 0:e576e892f0ca 45 void ShiftOut::writeBit(unsigned char bit){
benrammok 0:e576e892f0ca 46 DSERIAL = bit & 0x01;
benrammok 0:e576e892f0ca 47 updateRegister();
benrammok 0:e576e892f0ca 48 updateOutput();
benrammok 0:e576e892f0ca 49 }
benrammok 4:61198ffab8ca 50 //Writes multiple bits from an array to create an animation
benrammok 0:e576e892f0ca 51 void ShiftOut::animate(int arr[][8], int lines, int delay_ms){
benrammok 3:a0df8989ffa2 52 hasChanged = true;
benrammok 0:e576e892f0ca 53 for(int i = 0; i < lines; i++){
benrammok 0:e576e892f0ca 54 for(int j = 0; j < 8; j++){
benrammok 0:e576e892f0ca 55 writeBit(arr[i][j]);
benrammok 0:e576e892f0ca 56 }
benrammok 0:e576e892f0ca 57 wait_ms(delay_ms);
benrammok 0:e576e892f0ca 58 }
benrammok 0:e576e892f0ca 59 }
benrammok 0:e576e892f0ca 60
benrammok 0:e576e892f0ca 61 void ShiftOut::animationExample(){
benrammok 3:a0df8989ffa2 62 hasChanged = true;
benrammok 3:a0df8989ffa2 63 int strobe[][8]= {{1,0,0,0,0,0,0,0},
benrammok 3:a0df8989ffa2 64 {0,1,0,0,0,0,0,0},
benrammok 3:a0df8989ffa2 65 {0,0,1,0,0,0,0,0},
benrammok 3:a0df8989ffa2 66 {0,0,0,1,0,0,0,0},
benrammok 3:a0df8989ffa2 67 {0,0,0,0,1,0,0,0},
benrammok 3:a0df8989ffa2 68 {0,0,0,0,0,1,0,0},
benrammok 3:a0df8989ffa2 69 {0,0,0,0,0,0,1,0},
benrammok 3:a0df8989ffa2 70 {0,0,0,0,0,0,0,1}};
benrammok 0:e576e892f0ca 71
benrammok 3:a0df8989ffa2 72 int nightrider[18][8]= {{1,0,0,0,0,0,0,0},
benrammok 3:a0df8989ffa2 73 {1,1,0,0,0,0,0,0},
benrammok 3:a0df8989ffa2 74 {1,1,1,0,0,0,0,0},
benrammok 3:a0df8989ffa2 75 {0,1,1,1,0,0,0,0},
benrammok 3:a0df8989ffa2 76 {0,0,1,1,1,0,0,0},
benrammok 3:a0df8989ffa2 77 {0,0,0,1,1,1,0,0},
benrammok 3:a0df8989ffa2 78 {0,0,0,0,1,1,1,0},
benrammok 3:a0df8989ffa2 79 {0,0,0,0,0,1,1,1},
benrammok 3:a0df8989ffa2 80 {0,0,0,0,0,0,1,1},
benrammok 3:a0df8989ffa2 81 {0,0,0,0,0,0,0,1},
benrammok 3:a0df8989ffa2 82 {0,0,0,0,0,0,1,1},
benrammok 3:a0df8989ffa2 83 {0,0,0,0,0,1,1,1},
benrammok 3:a0df8989ffa2 84 {0,0,0,0,1,1,1,0},
benrammok 3:a0df8989ffa2 85 {0,0,0,1,1,1,0,0},
benrammok 3:a0df8989ffa2 86 {0,0,1,1,1,0,0,0},
benrammok 3:a0df8989ffa2 87 {0,1,1,1,0,0,0,0},
benrammok 3:a0df8989ffa2 88 {1,1,1,0,0,0,0,0},
benrammok 3:a0df8989ffa2 89 {1,1,0,0,0,0,0,0}};
benrammok 0:e576e892f0ca 90
benrammok 0:e576e892f0ca 91 animate(nightrider, 18, 50);
benrammok 0:e576e892f0ca 92 wait(1);
benrammok 0:e576e892f0ca 93 animate(strobe, 8, 200);
benrammok 0:e576e892f0ca 94 }
benrammok 0:e576e892f0ca 95
benrammok 0:e576e892f0ca 96 void ShiftOut::writeBitAtPos(unsigned char pin, bool state){
benrammok 4:61198ffab8ca 97 if(hasChanged){
benrammok 3:a0df8989ffa2 98 clearStateArray();
benrammok 3:a0df8989ffa2 99 hasChanged = false;
benrammok 3:a0df8989ffa2 100 }
benrammok 4:61198ffab8ca 101 if(pin < 8*REGISTER_CNT){
benrammok 0:e576e892f0ca 102 stateArr[pin] = state;
benrammok 0:e576e892f0ca 103 }
benrammok 0:e576e892f0ca 104 writeArray(stateArr);
benrammok 0:e576e892f0ca 105 }
benrammok 0:e576e892f0ca 106
benrammok 4:61198ffab8ca 107 void ShiftOut::writeArray(char arr[8*REGISTER_CNT]){
benrammok 4:61198ffab8ca 108 for(int i = (8*REGISTER_CNT)-1; i >= 0; i--) {
benrammok 0:e576e892f0ca 109 writeBit(arr[i]);
benrammok 0:e576e892f0ca 110 }
benrammok 3:a0df8989ffa2 111
benrammok 3:a0df8989ffa2 112 }
benrammok 3:a0df8989ffa2 113
benrammok 3:a0df8989ffa2 114 void ShiftOut::clearStateArray(){
benrammok 4:61198ffab8ca 115 for(int i = 0; i < 8*REGISTER_CNT; i++){
benrammok 3:a0df8989ffa2 116 stateArr[i] = 0;
benrammok 3:a0df8989ffa2 117 }
benrammok 3:a0df8989ffa2 118 }