Question: I am trying to create a code that takes in an input from a 4x3 keypad, then turns that input into a duty cycle which

I am trying to create a code that takes in an input from a 4x3 keypad, then turns that input into a duty cycle which using the Timer_A will adjust the LED's intensity. However my code is not working and I was wondering what changes the code needs

#include "msp.h"

#include

uint8_t Read_Keypad(); //Reads keypad

void InitKeypad(); //GPIO initialization of keypad

void InitTimer();

void printKey(); //Print the pressed key

void SaveInput(); //Stores the pressed number

void setDutyCylce(); //Converts an integer to a string character

void setLED();

uint32_t num;

uint8_t i = 0, k = 0;

float dCycle, period = 3000-1, j = 0.0, tempDC;

int a1[3];

int main(){

WDT_A->CTL = WDT_A_CTL_PW | // Halts Watch dog

WDT_A_CTL_HOLD;

uint8_t pressed = 0;

InitKeypad();

InitTimer();

printf(" Please enter a duty cycle. "); //Request keypad entry

while(1){ //Loop used to run through the keypad sequencing indefinitely

pressed = Read_Keypad(); // Calls Function that reads Keypad

if(pressed){ // If a button is pressed this will be true

printKey(); // Call print key to display the pressed key

SaveInput(); // Call SaveInput Store the acsii value into a character array

setDutyCylce(); // Used to convert an integer to a string character

setLED();

__delay_cycles(30000); // delay for 10ms each time through the loop before reading keypad //again

}

}

}

void InitKeypad(){

//Sets the whole P4 register as GPIO

P4SEL0 &=~0xFF; P4SEL1 &=~0XFF;

// Set Keypad Row0 to P4.0 Row1 to P4.1 Row2 to P4.2 Row3 to P4.3

P4->DIR &=~ (BIT0 | BIT1 | BIT2 | BIT3);

// Enable pull-up resistor on all rows P4.0, P4.1, P4.2, P4.3

P4REN |= (BIT0 | BIT1 | BIT2 | BIT3);

// Configure rows with pull-up rows P4.0, P4.1, P4.2, P4.3

P4OUT |= (BIT0 | BIT1 | BIT2 | BIT3);

// Set Keypad Columns to Inputs P4.6 Col_1 P4.5 Keypad Col_0 P4.4

P4->DIR &=~(BIT4 | BIT5 | BIT6);

}

void InitTimer(){

P2->DIR |= BIT4; // P2.4 set TA0.1 P2->SEL0 |= BIT4;

P2->SEL0 |= BIT4;

P2->SEL1 &= ~(BIT4);

TIMER_A0->CCR[0] = period; // PWM Period (# cycles of the clock)

TIMER_A0->CCTL[1] = TIMER_A_CCTLN_OUTMOD_7;

TIMER_A0->CCR[1] = dCycle; // CCR1 PWM duty cycle in 10ths of percent

TIMER_A0->CTL = TIMER_A_CTL_SSEL__SMCLK | TIMER_A_CTL_MC__UP | TIMER_A_CTL_CLR;

}

uint8_t Read_Keypad(){

uint8_t col,row;

for(col=0; col<3; col++){

P4->DIR = 0x00; // Set Columns to inputs

P4->DIR |= BIT(4 + col); // Set Column 3 to Output

P4->OUT &=~ BIT(4 + col); // Set Column 3 to LOW

__delay_cycles(10); // Delay the while loop

row = P4->IN & 0x0F; // Read all rows

while(!(P4IN & BIT0)| !(P4IN & BIT1)| !(P4IN & BIT2) | !(P4IN & BIT3));

if(row != 0x0F){ // If one of the inputs is low, some key is pressed.

break; // Breaks out of the for loop

}

}

P4->DIR |= 0x00; // Set Columns to inputs

if (col == 3) return 0; // No button is was pressed during this iteration

if (row == 0x0E) num = (col + 1); // Key in row 0

if (row == 0x0D) num = (3 + col + 1); // Key in row 1

if (row == 0x0B) num = (6 + col + 1); // Key in row 2

if (row == 0x07) num = (9 + col + 1); // Key in row 3

return 1;

}

void printKey(){

if (num == 10) printf(" * "); // If the number is 10 the value is *

if (num == 12) printf(" # "); // If the number is 12 the value is #

if (num == 11){

printf(" 0 "); // If the number is 11 the value is 0

num = 0;

}

if (num < 10) printf(" %d ",num); // If any other number is pressed the value is the number

}

void SaveInput(){

if(!(num == 10 || num == 12)){ // Prevent the characters * and # from being stored

a1[0] = a1[1]; // Value at index 0 will be overwritten and go away

a1[1] = a1[2]; // Shift all index values to the left

a1[2] = num; // The newest value to be stored

i++; // Used to ensure 4 number have been entered

}

}

void setDutyCylce(){

if(i >= 1 && num == 12){

tempDC = a1[0];

tempDC = (tempDC * 10) + a1[1] ;

j = (tempDC * 10) + a1[2];

tempDC = (j/100);

dCycle = (tempDC * period);

a1[0] = 0;

a1[1] = 0;

a1[2] = 0;

}

}

void setLED(){

if(i >= 1 && num == 12 && j <= 100){

P2->OUT |= BIT4; //turns ON

printf("LED now operating with %.1f power. ", j);

i=0;

}

if(i >= 1 && num == 12 && j > 100){

printf(" Invalid duty cycle. ", j);

P2->OUT &=~ BIT4; //turns OFF

i=0;

}

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!