Board Basis für Auftrag

Dependencies:   mbed

Committer:
rogerzuber
Date:
Fri Sep 10 08:19:02 2021 +0000
Revision:
2:78dd1100a67b
Board Beispiel Zuber

Who changed what in which revision?

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