Go Down

Topic: Binary / Hex counter. (Read 1 time) previous topic - next topic

saramakos

Hi all.  Picked up my board 5 days ago and enjoyed playing with LED chasers and LCD library.  Here is a little test I put together over the weekend for a bit of fun.  All it does is repeatedly count from 0 to 255 in either binary or hex and swaps display mode when the button is pressed.

Hardware setup is jut the LCD example from this site with a button wired onto pin 10.

Feel free to critique (constrictively! :) ) and provide ideas of how this can be cleaned up.  My next step is to move the conversion functions into a library for re-use in future projects.

Code: [Select]
/**
*  Binary/Hex count with mode button.
*  Some code courtesy of arduino.cc, rest is my own!
*/

/* include the library code: */
#include <string.h>
#include <LiquidCrystal.h>

/* Constants */
#define BIN 0
#define HEX 1
#define BUTTONPIN   10
#define MAXVAL      256
#define BOUNCEDELAY 50
#define COUNTDELAY  1000

/* Initialize the library with the numbers of the interface pins */
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte countmode;
byte buttonstate;
byte prevstate;
byte current;
long int lastupdate;
long int currenttime;

void setup()
{
   /* set up the LCD's number of rows and columns */
   lcd.begin(16, 2);

   /* Configure the pushbutton pin */
   pinMode(BUTTONPIN, INPUT);

   /* Initialise variable values */
   lastupdate = 0;
   prevstate = LOW;
   countmode = BIN;
   current = 0;

   /* Print a message to the LCD */
   printheader(countmode);
}

void loop()
{
   /* Handle the button */
   buttonstate = digitalRead(BUTTONPIN);

   if (buttonstate != prevstate)
   {
       /* Pause to allow noise to pass */
       delay(BOUNCEDELAY);

       if (buttonstate == HIGH)
       {
           /* Switch modes */
           lcd.clear();
           countmode = !countmode;
           printheader(countmode);
           prevstate = HIGH;
       }
       else
           prevstate = LOW;
   }

   printval(current, countmode);

   currenttime = millis();
   if (currenttime - lastupdate > COUNTDELAY)
   {
     lastupdate = currenttime;
     current = (current + 1) % MAXVAL;
   }
     
}

void tobin(int dec, char *bin)
{
   byte bitval = 128;

   for (byte count = 0; count < 8; count++)
   {
       if (dec & bitval)
           bin[count] = '1';
       else
           bin[count] = '0';

       bitval >>= 1;
   }

   bin[8] = '\0';

}

void tohex(int toprint, char *hex)
{
   hex[0] = hexchar(toprint >> 4);
   hex[1] = hexchar(toprint & 0x0f);
   hex[2] = 0;
}

char hexchar(char inval)
{
   if (inval <= 9)
       return inval + 48;
   else
       return inval + 55;
}

void printheader(byte mode)
{
   if (mode == BIN)
       lcd.print("Binary Counter");
   else
       lcd.print("Hex Counter   ");
}

void printval(int val, byte mode)
{
   char bitstring[9];
   
   lcd.setCursor(0, 1);

   if (mode == BIN)
       tobin(val, bitstring);
   else
       tohex(val, bitstring);

   lcd.print(bitstring);
}


Go Up