Jag försöker att få till ett bra menysystem i en PIC men får inte det att fungera till hundra procent.
Hårdvara
Jag har en vanlig HD44780 Display kopplad på PORTB på en PIC16F648A och har för tillfället två knappar kopplare till PORTA med pulldown motstånd.
Mjukvara
Jag sitter och kodar i MikroC och kör med InternOSC.
Menyträdet har i nuvarande konfiguration 4 styck menyer som skriver ut info på displayn. Målet så här långt är bara att kunna stega i menyn med knapparna plus och minus.
Jag har bland annat problem med att minus knappen inte fungerar som den skall, nollar direkt vid tryck och reagerar inte på fler tryck.
Här kommer min kod
Kod: Markera allt
unsigned char Key_Old_State;
unsigned char Key_New_State;
//==============================================================================
// LCD START UP
//==============================================================================
void Lcd_Startup()
{
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Cmd(Lcd_CLEAR);
Lcd_Out(1, 1, "Test Meny"); // Print text to LCD, 2nd row, 1st column
Lcd_Out(2, 1, "Ver: 1.1");
}
//==============================================================================
// Meny Tree
//==============================================================================
void Meny_Tree_Case()
{
switch(Key_New_State)
{
case 0:
Lcd_Out(2, 1, "Meny Case 0!");
break;
case 1:
Lcd_Out(2, 1, "Meny Case 1!");
break;
case 2:
Lcd_Out(2, 1, "Meny Case 2!");
break;
case 3:
Lcd_Out(2, 1, "Meny Case 3!");
break;
}
}
//==============================================================================
// KEYBOARD SENS
//==============================================================================
void Key_Sens()
{
do {
Key_Old_State = Key_New_State;
if (Button(&PORTA, 1, 7, 1)) Key_New_State++; //Meny Plus
if (Button(&PORTA, 0, 7, 1)) Key_New_State--; //Meny Minus
if (Key_New_State >= 4) Key_New_State = 0; //Bara fyra steg om mer så slårunt till början igen
// if (Key_New_State < 0) Key_New_State = 3;
if (Key_New_State != Key_Old_State) Meny_Tree_Case(); //Om Key_New_State inte är samma som Key_Old_State gå till Meny_Tree_Case
}
while(1);
}
//==============================================================================
// PIC Inställningar
//==============================================================================
void Initialize()
{
CMCON = 0x07; // No comparator-thingy
// Dont Allow interrupts
INTCON = 0x00; // Disables all interrupts
// Set port directions
TRISA = 0; // All out but -MCLR
TRISB = 0; // All out
// Set port values
PORTA = 0; // Start value
PORTB = 0; // Start value
}
//==============================================================================
// Main startup
//==============================================================================
void main()
{
Initialize(); //Setup PIC
Lcd_Startup();
Meny_Tree_Case();
Key_Sens();
}
/ Jeppsson