??? 02/09/05 17:24 Read: times |
#87017 - almost there Responding to: ???'s previous message |
we appreciate all the help recieved so far. We're pretty close so far but have a few things to do yet. we can only fit 100 vlaues in our array Voltage5[], is there a limit on hom many values that can be put into an array? We are looking to get 256 values in the array as there are 256 steps in the ADC converter. Also we want to put string values in our array and call them out later so we can display more then just one number to create a more accurate readout. I will post our code once again.
#include <8051io.h> #include <8051bit.h> /* Bit set/clear macros */ #include <8051reg.h> #define CLK P1.6 #define CS P3.7 #define DI P1.4 #define DO P1 #define RS P0.0 // LCD register select bit #define RW P0.1 // LCD read/write bit #define EN P0.2 // LCD enable bit #define ROWNUM 4 // # of rows in keypad #define COLNUM 3 // # of columns in keypad //function prototypes void clock(void); unsigned char convert(unsigned char channel); unsigned char scankeypad(void); // Keypad function void Init_CPU(void); void Initial_LCD(void); // Initialization function void EN_low(void); //Set EN to low position function void LCD_putc(unsigned char key); // Display single character function void LCD_puts(const unsigned char *str);// Display character string function static char KeyTable[]={'1','2','3', // Output of buttons pressed on keypad '4','5','6', ` '7','8','9', '*','0','#'}; static unsigned char RowTable[]={0xFE,0xFD,0xFB,0xF7}; // addresses of rows //main starts here void main() { unsigned char RETURN; unsigned char range; //unsigned char i; static unsigned char Voltage5[]={'1', '2', '3', '4', '5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'}; Initial_LCD(); // Run function Initial_LCD Init_CPU(); //do all initializations range=scankeypad(); RETURN=convert(0); LCD_putc(Voltage5[RETURN]); delay(300); //while(1) //{ //RETURN=convert(0); //LCD_putc(Voltage10(RETURN)); printf("channel 0 = %dn",convert(0)); printf("channel 1 = %dn",convert(1)); // print converted readout of channel 1 printf("channel 2 = %dn",convert(2)); // print converted readout of channel 2 printf("channel 3 = %dn",convert(3)); // print converted readout of channel 3 }//end main //define Init_CPU() void Init_CPU(void) { serinit(9600); //initialize serial port clrbit(CS); //CS is output to ADC clrbit(CLK); //CLK is clock to ADC } //end of Init_CPU() //define function clock void clock(void) { setbit(CLK); clrbit(CLK); } //define function convert unsigned char convert(unsigned char channel) { //variable declaration unsigned char i, value; unsigned char option; //before first clock initial state clrbit(CLK); setbit(CS); clrbit(DI); //1st clock clrbit(CS); setbit(DI); clock(); delay(1); //2nd clock setbit(DI); clock(); delay(1); //3rd and 4th clocks option=channel; switch(option) { case 0: //channel 0 clrbit(DI); //3rd clock clock(); delay(1); clrbit(DI); //4th clock clock(); delay(1); break; case 1: //channel 1 setbit(DI); //3rd clock clock(); delay(1); clrbit(DI); //4th clock clock(); delay(1); break; case 2: //channel 2 setbit(DI); //3rd clock clock(); delay(1); clrbit(DI); //4th clock clock(); delay(1); break; case 3: //channel 3 setbit(DI); //3rd clock clock(); delay(1); clrbit(DI); //4th clock clock(); delay(1); break; } //end switch setbit(DI); //DI is input clock(); //5th clock delay(1); //wait for MUX to settle //start clocking in to 8051 the converted digital calue from MSB value=0; //00000000 Binary for(i=0; i<8; i++) //clock 6, to clock 13 { if(DO&0x10) value=value|1; clock(); if(i<7) value=value<<1; } //end for for(i=0; i<8; i++) { clock(); }//end of for return value; } //end convert() void Initial_LCD(void) // Function initializes LCD { P0=0; // Make all bits on port 0 output bits delay(40); // 20 ms delay P0=0x34; // Block 1 EN_low(); delay(10); P0=0x34; // Block 2 EN_low(); P0=0x34; // Block 3 EN_low(); P0=0x24; // Block 4 EN_low(); P0=0x24; // Block 5 EN_low(); P0=0x64; // Block 6 EN_low(); P0=0x04; // Block 7 EN_low(); P0=0x84; // Block 8 EN_low(); P0=0x04; // Block 9 EN_low(); P0=0x14; // Block 10 EN_low(); P0=0x04; // Block 11 EN_low(); P0=0x64; // Block 12 EN_low(); P0=0x04; // Block 13 EN_low(); P0=0xE4; // Block 14 EN_low(); } void EN_low(void) // Set EN to low position, done with procedure { delay(1); // Create 0.5 ms delay clrbit(EN); // set EN to low position delay(5); // Create 2.5 ms delay } void LCD_putc(unsigned char key) { unsigned char value1, value2; // Create variables value1, value2 value1=key&0xF0; // Use OR function to separate low nibble out value1=value1|0x05; // Use AND function to make low nibble 5 P0=value1; // Send out high nibble EN_low(); value2=key&0x0F; // Use OR function to separate high nibble out value2=value2<<4; // Shift low nibble bits to high nibble position value2=value2|0x05; // Use AND function to make low nibble 5 P0=value2; // Send out low nibble EN_low(); } void LCD_puts(const unsigned char *str) { register unsigned char char1; // Create registered variable char1 while ((char1=*str++)) // While next character in the string is not null … { LCD_putc(char1); // Run function LCD_putc with input "char1" } } unsigned char scankeypad(void) { unsigned char row, col; // Declare variables row and col col=0; // set col equal to 0 for(row=0; row<ROWNUM; row++) // Create constant loop that changes rows { P2=RowTable[row]; // set P2 equal to row number's port address if(!(P2&0x10)) col=1; if(!(P2&0x20)) col=2; if(!(P2&0x40)) col=3; if(col!=0) // if col is not equal to 0 { return (col-1+COLNUM*row); // return pressed key information… delay(100); } // End of if loop } // End of for loop } // End of function |
Topic | Author | Date |
8051 MicroC Voltage Meter--Please Help | 01/01/70 00:00 | |
woefully incomplete and a suggestion | 01/01/70 00:00 | |
congratulations | 01/01/70 00:00 | |
Real Code? | 01/01/70 00:00 | |
code compiles fine in MicroIDE | 01/01/70 00:00 | |
The Development Process | 01/01/70 00:00 | |
and so what | 01/01/70 00:00 | |
Code? | 01/01/70 00:00 | |
A couple of observations | 01/01/70 00:00 | |
almost there | 01/01/70 00:00 | |
absolutely | 01/01/70 00:00 | |
Sending data to the lcd![]() | 01/01/70 00:00 |