![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Board Basis für Auftrag
ShiftOut.cpp@2:78dd1100a67b, 2021-09-10 (annotated)
- Committer:
- rogerzuber
- Date:
- Fri Sep 10 08:19:02 2021 +0000
- Revision:
- 2:78dd1100a67b
Board Beispiel Zuber
Who changed what in which revision?
User | Revision | Line number | New 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 | } |