Documente Academic
Documente Profesional
Documente Cultură
#include <LiquidCrystal.h>
// Set LCD
LiquidCrystal lcd(1,2,4,5,6,7);
#define Clk 9
#define DT 8
#define SW 10
// Inputs:
// Gnd
// Exports:
ISR(TIMER0_COMPB_vect) {
lastDT=testDT; // Save DT
testDT=(PIND>>DT)&1; // Get DT
testSW=(PIND>>SW)&1;
if (testSW!=statusSW) {
statusSW=testSW;
cntSW=10;
}
if (cntSW>0) {
cntSW--;
if (cntSW==0) {
Switch=statusSW;
UpdateSwitch=true;
/* MENU SET UP */
char* menuName[]={"Done ","Year ","Month ","Day ","Hour ","Minute ","Second ","Adjustment "};
int menuSize=sizeof(menuName)/sizeof(char*);
char menuLevel=0;
void setup() {
pinMode(DT,INPUT_PULLUP); // Rotary DT
pinMode(SW,INPUT_PULLUP); // Rotary SW
OCR0B=0xA0;
TIMSK0|=1<<OCIE0B;
// Initialise LCD
pinMode(led,OUTPUT);
digitalWrite(led,HIGH);
lcd.begin(16,2);
lcd.print("Rotary Encoder");
delay(3000);
bool processMenu(void) {
if (menuLevel!=lastMenuLevel) {
lastMenuLevel=menuLevel;
lcd.clear();
lcd.setCursor(0,0);
if (menuLevel==0) {
lcd.print("Menu:");
lcd.setCursor(0,1);
lcd.print(menuName[EncoderPos]);
if (menuNumeric[EncoderPos]=='Y') {
lcd.print((int)menuValue[EncoderPos]);
} else {
if (menuValue[EncoderPos]!=0) {
lcd.print("Y");
} else {
lcd.print("N");
} else if (menuLevel==1) {
lcd.print("Set:");
lcd.setCursor(0,1);
lcd.print(menuName[lastPos]);
if (menuNumeric[lastPos]=='Y') {
lcd.print((int)menuValue[lastPos]);
} else {
if (menuValue[lastPos]!=0) {
lcd.print("Y");
} else {
lcd.print("N");
} else {
lcd.print("Rotary Encoder?");
if (UpdateSwitch) {
UpdateSwitch=false;
if (Switch==LOW) {
if (menuLevel==-1) {
EncoderPos=0; // Done
menuValue[0]=0; // N
} else {
menuLevel=1-menuLevel;
if (menuLevel==0) {
if ((EncoderPos==0)&&(menuValue[EncoderPos]!=0)) menuLevel=-1;
} else {
EncoderPos=menuValue[lastPos];
// If encoder turned
if (lastPos!=EncoderPos) {
if (EncoderPos>=menuSize) EncoderPos=0;
if (EncoderPos<0) EncoderPos=menuSize-1;
lastPos=EncoderPos;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Menu:");
lcd.setCursor(0,1);
lcd.print(menuName[EncoderPos]);
if (menuNumeric[EncoderPos]=='Y') {
lcd.print((int)menuValue[EncoderPos]);
} else {
if (menuValue[EncoderPos]!=0) {
lcd.print("Y");
} else {
lcd.print("N");
}
}
if (menuValue[lastPos]!=EncoderPos) {
if (EncoderPos>menuValueMax[lastPos]) EncoderPos=menuValueMin[lastPos];
if (EncoderPos<menuValueMin[lastPos]) EncoderPos=menuValueMax[lastPos];
menuValue[lastPos]=EncoderPos;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set:");
lcd.setCursor(0,1);
lcd.print(menuName[lastPos]);
if (menuNumeric[lastPos]=='Y') {
lcd.print((int)menuValue[lastPos]);
} else {
if (menuValue[lastPos]!=0) {
lcd.print("Y");
} else {
lcd.print("N");
void loop() {
if (!processMenu()) { // Menu not active
int i;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Running");
lcd.setCursor(0,1);
for (i=0;i<menuSize;i++) {
if (menuNumeric[i]=='Y') {
lcd.print((int)menuValue[i]);
} else {
if (menuValue[i]!=0) {
lcd.print("Y");
} else {
lcd.print("N");
lcd.print(" ");
delay(3000);