Hi, thanks to allawtterb and bigmac who helped me get my last program working correctly. Now I need some more advice. For another program I want to use the last program and modify it for a digital display timer. I have come up the general form of the program but I am confused of how to approach this. Here is my current code.
Code:
#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#define MASK_BITS1 0xF00 //Masks bits 11-8 on#define MASK_BITS2 0x0F0 //Masks bits 7-4 on#define MASK_BITS3 0x00F //Masks bits 3-0 on  #define DIGIT_PORT  PTFD     //Port F used for digits//#define DIGIT_MASK  0xF0     //Used to mask bits 7,6 and 5 in Port F//#define SEG_PORT    PTBD       // Port B used for segments //#define SEG_MASK    0x7F       //Used to mask Port B for correct output//#define LED_DISPLAY PTAD_PTAD2#define Mask_Digits 0x03     //used to mask variable digits to 00000011#define SEVEN_SEG_0 0x3F     //digits 0 through 9 in display form#define SEVEN_SEG_1 0x06#define SEVEN_SEG_2 0x5B#define SEVEN_SEG_3 0x4F#define SEVEN_SEG_4 0x66#define SEVEN_SEG_5 0x6D#define SEVEN_SEG_6 0x7D#define SEVEN_SEG_7 0x07#define SEVEN_SEG_8 0x7F#define SEVEN_SEG_9 0x6F// Function Prototypes //void delay(long int);void Output_Seven_Segments(byte, byte);void main(void);int FixDigit2(int);EnableInterrupts; /* enable interrupts */  /* include your code here */   void delay(long int n){ long int i; unsigned int j; for (i=0; i<n; i++)   for (j=0; j<100; j++)     {}}  void Output_Seven_Segments (byte segments, byte digit){   //Remember: segments variable is formed as: //        DP g f e d c b a      digit &= Mask_Digits; //Mask variable digit to '00000011'       if (digit==0)   //This is the broken display     segments=FixDigit2(segments); //Call a subroutine to mangle all bits   DIGIT_PORT &= ~DIGIT_MASK;  // Set all digits OFF //      SEG_PORT = segments & SEG_MASK;  //Port B assigned vairable segments      DIGIT_PORT |= (0x10 << digit);       switch (digit)  {  case 0:                     DIGIT_PORT = 0x80;//Drive most significant digit on           break;  case 1:            DIGIT_PORT = 0x40;//Drive second digit on    break;  case 2:           DIGIT_PORT = 0x20;//Drive least significant digit on          break;   case 3:           LED_DISPLAY = 1;//Drive LED display on      break; }void main (void){  // Set DDRs for output ports   SOPT_COPE = 0;//Disable watchdog timer   PTADD = 0x02; // Replace XX with the hex value to set the PA2 and PA1 as outputs      PTFDD = 0xE0; // Same here, setting the inputs/outputs for port F   PTBDD = 0x7F; // Setting the input/outputs for Port B    time=0;  for (;;)  //Loop forever (as always!) {  time++; //increment variable time by one    //Convert to Segments and Output bits (11:8) of time  delay(1);  //Convert to Segments and Output bits (7:4) of time  delay(1);  //Convert ...  bits (3:0) of time  delay(1); }} int FixDigit2(int value) {    unsigned char newval;  newval=0;    newval=newval|(value&0x01)<<6;   //Bit 0 becomes 6  newval=newval|(value&0x02)>>1;   //Bit 1 becomes 0  newval=newval|(value&0x04)<<5;  //Bit 2 becomes 7  newval=newval|(value&0x40)>>4;  //Bit 6 becomes 2  newval=newval|(value&0x80)>>6;  //Bit 7 becomes 1  newval=newval|(value&0x38);    //And bits 543 are copied undisturbed    return (newval);}
 
I need to get the variable time which is an unsigned int. I then need to mask bits 11-8 off then convert it into the digital display form and display it on the board.
 
This will be the same for the other 2 digits but with bits 7-4 and bits 3-0 respectively.
 
I will need another delay routine for the incrementation of varaible time to get it to count every mili second. What is the best way to do this? Would a case statement be Ideal?
 
The part I get confused it after I mask the 12 bits into 3 seperate nibbles by ANDING them with the variables.
 
#define MASK_BITS1 0xF00 //Masks bits 11-8 on
#define MASK_BITS2 0x0F0 //Masks bits 7-4 on
#define MASK_BITS3 0x00F //Masks bits 3-0 on 
 
bits      11        10       9       8        7       6       5       4         3       2       1       0
 
value  2048   1024   512   256   128     64     32      16       8       4       2        1
             X         X        X       X       0       0        0        0        0       0       0       0             after applying MASK_BITS1
             0         0        0        0       X       X        X       X        0       0       0       0             after applying MASK_BITS2
             0         0        0        0       0       0         0       0        X       X       X      X             after applying MASK_BITS3
 
 What I want to do is to have the nibbles placed into a 10 way switch for assigning the digital output for digits 0-9. How do I go about this? Im really confused mainly because I'm a novice when it comes to C but I am getting better all the time. Any help would be greatly appreciated.
Message Edited by karmabobby on 2008-04-04 06:04 PMMessage Edited by karmabobby on 2008-04-04 06:05 PM