OK. It's fairly long, so I'll have to split it:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <pins_arduino.h>
#include <rotary.h>
#include <digitalWriteFast.h>
#include <digitalWriteFast.h>
#include <LiquidCrystal.h>
#define ENCODERSWITCH 4
#define ENCODERDELAY 20
#define ENCODERSETTOFREQ 1
#define ENCODERSETTOSELECT 0
#define TRIANGLE 0
#define SAWTOOTH 1
#define SINE 2
#define SQUARE 3
#define LCDCOLUMNOFFSET 6
#define LCDCOLUMNS 16
#define LCDROWS 2
#define MAXFREQUENCY 2000000
#define CLOCKFREQUENCY 16000000
#define MINFREQUENCY 100
#define DEFAULTFREQ 1000
PROGMEM byte sineWave[] = {
1, 2, 3, 5, 6, 8, 11, 13,
16, 18, 21, 24, 27, 30, 32, 35, 38, 41,
43, 46, 49, 51, 54, 56, 57, 59, 60, 61,
62, 63, 63, 63, 63, 62, 61, 60, 59, 57,
56, 54, 51, 49, 46, 43, 41, 38, 35, 32,
30, 27, 24, 21, 18, 16, 13, 11, 8, 6,
5, 3, 2, 1, 0, 0, 0, 0, 1, 2,
3, 5, 6, 8, 11, 13, 16, 18, 21, 24,
27, 30, 32, 35, 38, 41, 43, 46, 49, 51,
54, 56, 57, 59, 60, 61, 62, 63, 63, 63,
63, 62, 61, 60, 59, 57, 56, 54, 51, 49,
46, 43, 41, 38, 35, 32, 30, 27, 24, 21,
18, 16, 13, 11, 8, 6, 5, 3, 2, 1,
};
PROGMEM byte triangle[] = {
32,34,36,38,40,42,44,46,48,50,
52,54,56,58,60,62,63,62,60,58,
56,54,52,50,48,46,44,42,40,38,
36,34,32,30,28,26,24,22,20,18,
16,14,12,10,8,6,4,2,0,2,
4,6,8,10,12,14,16,18,20,22,
24,26,28,30,
32,34,36,38,40,42,44,46,48,50,
52,54,56,58,60,62,63,62,60,58,
56,54,52,50,48,46,44,42,40,38,
36,34,32,30,28,26,24,22,20,18,
16,14,12,10,8,6,4,2,0,2,
4,6,8,10,12,14,16,18,20,22,
24,26,28,30
};
PROGMEM byte sawTooth[] = {
0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57,58,59,
60,61,62,63,
0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57,58,59,
60,61,62,63};
PROGMEM byte squareWave[] = {
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
63, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
static long incrementTable[] = {
10,20,100,500,1000,2500,5000,10000};
static char waveForms[][10] = {
"10 Hz ", "20 Hz ", "100 Hz ", "500 Hz ", "1 kHz ",
"2.5 kHz ", "5 kHz ", "10 kHz ",
"Triangle ", "Saw Tooth", "Sine ", "Square "};
#define MAXENCODERVALUES (sizeof(incrementTable) / sizeof(incrementTable[0]))
#define MAXWAVETYPES 4
int tableSize = sizeof(sineWave) / sizeof(sineWave[0]); // Waveforms all the same
int buttonRead;
volatile byte tableVals = tableSize;
volatile boolean buttonState;
volatile byte *waveTypePtr;
volatile byte index = 0;
volatile int increIndex = 0;
volatile int waveType;
volatile float increment;
volatile long frequency;
volatile long oldFrequency;
volatile long period;
Rotary myEncoder(2, 3);
LiquidCrystal lcd(12, 11, 9, 8, 7, 6);
void setup()
{
pinMode(ENCODERSWITCH, INPUT);
digitalWrite(ENCODERSWITCH, HIGH);
frequency = DEFAULTFREQ; // Start off with 1000Hz
cli(); // Turn interrupts off
InitEncoder(); // Set up encoder interrupt
InitTimer(); // Set up timer interrupt
sei(); // Turn interrupts on
lcd.begin(LCDCOLUMNS, LCDROWS);
buttonRead = ENCODERSETTOFREQ;
buttonState = false;
oldFrequency = frequency - 1;
increment = incrementTable[increIndex];
waveType = SQUARE;
waveTypePtr = squareWave;
UpdateDisplayFrequency();
lcd.setCursor(14, 0);
lcd.print("Hz");
lcd.setCursor(0, 1);
lcd.print("Incr: 10 Hz");
}