Question

In: Computer Science

Write a code in C to shift serially the content of the register labelled x through...

Write a code in C to shift serially the content of the register labelled x through the bit #1 of Port A starting with least significant bit. Include the port configuration. Do not include any directive.           

Solutions

Expert Solution

According to the given question, we havr one main function called shiftout which takes 3 inputs- your DS or data pin, your SH_CP or clock pin, and a byte data that contains 8 bits for the shift register. To enable multiple shift registers we have to simply wrap our main function around a for loop and trigger our ST_CP or latch pin low/high accordingly while shifting the byte from our dataBuffer to our data byte.

Code:

//Pin connected to ST_CP of 74HC595
int latchPin = 0;

//Pin connected to SH_CP of 74HC595
int clockPin = 3;

//Pin connected to DS of 74HC595
int dataPin = 2;

// Number of digits attached
int const numberOfRegisters = 3;

// Numbers mapped on our seven segment display
byte one = 0b00010010;
byte two = 0b01100111;
byte three = 0b01110110;
byte four = 0b11010010;
byte five = 0b11110100;
byte six = 0b11110101;
byte seven = 0b00010110;
byte eight = 0b11110111;
byte nine = 0b11110110;
byte zero = 0b10110111;
byte test = 0b10000000;
byte empty = 0b00000000;
byte numbers[] = {zero,one,two,three,four,five,six,seven,eight,nine};

// Internal Vars
byte data;
byte dataBuffer[numberOfRegisters];

void setup() {
// put your setup code here, to run once:
  
addToBuffer(123);
}

void loop() {
// put your main code here, to run repeatedly:
}

void addToBuffer(int digit){
// clear buffer
memset(dataBuffer, 0, sizeof(dataBuffer));

int c = 0;
while( digit > 0 ){
byte b = numbers[digit % 10]; // modulus 10 of our input
dataBuffer[c] = b;
digit /= 10;
c++;
}
  
writeBuffer();
}

void writeBuffer(){
digitalWrite(latchPin, 0);
  
for (int a = sizeof(dataBuffer) - 1; a >= 0 ; a--) {
shiftOut(dataPin, clockPin, dataBuffer[a]);
}
  
digitalWrite(latchPin, 1);
}


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
// This shifts 8 bits out MSB first,
//on the rising edge of the clock,
//clock idles low

//internal function setup
int i=0;
int pinState;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, OUTPUT);

//clear everything out just in case to
//prepare shift register for bit shifting
digitalWrite(myDataPin, 0);
digitalWrite(myClockPin, 0);

//for each bit in the byte myDataOut�
//NOTICE THAT WE ARE COUNTING DOWN in our for loop
//This means that %00000001 or "1" will go through such
//that it will be pin Q0 that lights.
for (i=0; i<=7; i++) {
digitalWrite(myClockPin, 0);

//if the value passed to myDataOut and a bitmask result
// true then... so if we are at i=6 and our value is
// %11010100 it would the code compares it to %01000000
// and proceeds to set pinState to 1.
if ( myDataOut & (1<<i) ) {
pinState= 1;
}
else {
pinState= 0;
}

//Sets the pin to HIGH or LOW depending on pinState
digitalWrite(myDataPin, pinState);
//register shifts bits on upstroke of clock pin
digitalWrite(myClockPin, 1);
//zero the data pin after shift to prevent bleed through
digitalWrite(myDataPin, 0);
}

//stop shifting
digitalWrite(myClockPin, 0);
}


Related Solutions

Write the Verilog code for a 12-bit shift register with ability to shift left or right,...
Write the Verilog code for a 12-bit shift register with ability to shift left or right, synchronized parallel load, asynchronous reset, and serial output? The register is able to load the 12-bit input value (at the positive edge of the clock) if the load signal is one, shift the value in register one bit to the right (at the positive edge of the clock) if the rss signal is one, shift the value in register one bit to the left(at...
Can anyone write a Verilog code and a test bench for a universal shift register with...
Can anyone write a Verilog code and a test bench for a universal shift register with 4 bits using D flip flop? Thanks
Consider a Linear Feedback Shift Register (LFSR) of degree 8 and the feedback polynomial P(x) =...
Consider a Linear Feedback Shift Register (LFSR) of degree 8 and the feedback polynomial P(x) = x8 + x4 + x3 + x + 1 where the initialization vector has the value FF in hexadecimal. a. What is the key for the encryption? b. What is the period of the output stream? c. Computer the first two output bytes.
Write the VHDL codes for (7494) 4 bit shift register using Behavioral style of modeling. this...
Write the VHDL codes for (7494) 4 bit shift register using Behavioral style of modeling. this is the datasheet for this Quation ( http://www.ralphselectronics.com/productimages/SEMI-SN7494N.PDF )
write the report about (7494) Design and implementation of 4 bit shift register using Behavioral style...
write the report about (7494) Design and implementation of 4 bit shift register using Behavioral style of modeling 1-truth table 2. VHDL program cods 3. Conclusion Should reflect on what logic is implemented, what modelling style is used to implement the logic. Discuss simulation and board level testing results.
Write pseudo code for the following parts of class BinarySearchTree: a) find(x) b) contains(x) c) add(x)...
Write pseudo code for the following parts of class BinarySearchTree: a) find(x) b) contains(x) c) add(x) d) remove(x) e) splice(x) f) min() g) max() h) pred() i) succ() j) floor() k) ceil()
Write the code to return the output in Rstudio. What is the code? Code: x <-...
Write the code to return the output in Rstudio. What is the code? Code: x <- c(28, 69, 5, 88, 19, 20) Output must be: [1] 4 2 1 6 5 3
write a truth table of 74LS164- an 8-Bit Serial In/Parallel Out Shift Register using behavioral style...
write a truth table of 74LS164- an 8-Bit Serial In/Parallel Out Shift Register using behavioral style using VHDL
((by C++ ))Write a program that will reverse the content of a Queue using the following...
((by C++ ))Write a program that will reverse the content of a Queue using the following standard queue operations. enqueue(x) : Add an item x to rear of queue. dequeue() : Remove an item from front of queue. empty() : Checks if a queue is empty or not. For reversing the queue one approach could be to store the elements of the queue in a temporary data structure in a manner such that if we re-insert the elements in the...
Using C++ code, write a program named q5.cpp to print the minimum of the sums x...
Using C++ code, write a program named q5.cpp to print the minimum of the sums x + y^3 and x^3 + y, where x and y are input by a user via the keyboard.
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT