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 C code to approximate Sin(x) and Cos(x) function using Taylor’s series. The angle x is...
Write C code to approximate Sin(x) and Cos(x) function using Taylor’s series. The angle x is expressed in radians. Use the first FIVE terms of Taylor’s series to approximate Sine/Cosine function. a. Compare your Taylor’s series approximation of Sine/Cosine function with the math.h implementation of sin and cos function. b. Determine tan(x) from Taylor’s series approximation of Sine/Cosine functions, for x = 0, PI/4, PI/2, PI. Use PI = 3.14159.
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 assembly code to implement the expression A = (B + C - D) x (D...
Write assembly code to implement the expression A = (B + C - D) x (D + E x F) on three-, two-, one-, and zero-address machines (do not change the values of the operands). Refer to Chapter 5 Slides 25-28 for the syntax.
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 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
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
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT