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