suresh13
Guest
|
|
« Reply #4 on: September 13, 2007, 07:15:08 19:15 » |
|
Erm, i dont use CCS, but i think menu systems are one of the easiest thing that can be done on a PIC. Its all conditional statements. Could be if...else, case, or anything.
For example(sorry im using basic), but the principle is the same for C as well. I needed to develop a menu system for a automated drinks maker very urgently, so i whipped up this code in a fairly short time, so its not the best out there, but it works.
program drinks_maker 'DECLARE VARIABLES
dim hotchoc as byte dim hotchoc_str as string[3] dim coff as byte dim coff_str as string[3] dim sug as byte dim sug_str as string[3] dim mil as byte dim mil_str as string[3]
'END OF DECLARATION OF VARIABLES
''''The sub-procedures below are used because its function is used'''' ''''repetitvely in the main coding, and reduces the code size ''''
'SUB PROCEDURES
sub procedure delay delay_ms(600) end sub
sub procedure delaysmall delay_ms(80) end sub
sub procedure hot_chocolate PORTC.0 = 1 delay delay PORTC.0 = 0 PORTC.1 = 1 delay delay PORTC.1 = 0 end sub
sub procedure milk PORTC.2 = 1 delay delay PORTC.2 = 0 PORTC.3 = 1 delay delay PORTC.3 = 0 end sub
sub procedure sugar PORTC.4 = 1 delay delay PORTC.4 = 0 PORTC.5 = 1 delay delay PORTC.5 = 0 end sub
sub procedure coffee PORTC.6 = 1 delay delay PORTC.6 = 0 PORTC.7 = 1 delay delay PORTC.7 = 0 end sub
sub procedure hotwater PORTD.0 = 1 delay delay delay delay delay delay delay delay PORTD.0 = 0 end sub
sub procedure makehotchoc while hotchoc > 0 hot_chocolate dec(hotchoc) wend end sub
sub procedure makecoff while coff > 0 coffee dec(coff) wend end sub
sub procedure makesugar while sug > 0 sugar dec(sug) wend end sub
sub procedure makemil while mil > 0 milk dec(mil) wend end sub
''LCD OUTPUT SUBPROCEDURES
sub procedure clearlcd Lcd_Cmd(LCD_CLEAR) 'clear the LCD end sub
sub procedure display clearlcd Lcd_Out(1,4,"Enjoy Your") Lcd_Out(2,5,"Drink!!!") delay delay delay delay Lcd_Cmd(LCD_CLEAR) end sub
sub procedure select_go Lcd_Out(2,1,">Press select/go") end sub
sub procedure lcdhot Lcd_Out(1,2,"Hot Chocolate") end sub
sub procedure lcdcoff Lcd_Out(1,6,"Coffee") end sub
sub procedure lcdtbs Lcd_Out(2,1,"Tablespoons:") end sub
sub procedure lcdback Lcd_Out(1,3,"<<GO BACK<<") end sub
sub procedure lcdsave Lcd_Out(1,5,"Saved!") end sub
sub procedure lcdcup clearlcd Lcd_Out(1,3,"Please Place") Lcd_Out(2,2,"Cup in Holder!") end sub
sub procedure lcdheat clearlcd Lcd_Out(1,4,"Heating Up") Lcd_Out(2,2,"Please Wait...") end sub
sub procedure lcdinit clearlcd Lcd_Out(1,1,"Initializing.") delay Lcd_Out(1,1,"Initializing..") delay Lcd_Out(1,1,"Initializing...") delay Lcd_Out(1,1,"Initializing....") end sub
''END OF LCD OUTPUT SUBPROCEDURES
sub procedure hotchoc1 hotchoc = 0 clearlcd lcdhot lcdtbs delay end sub
sub procedure coff1 coff = 0 clearlcd lcdcoff lcdtbs delay end sub
sub procedure mil1 mil = 0 clearlcd Lcd_Out(1,7,"Milk") lcdtbs delay end sub
sub procedure sug1 sug = 0 clearlcd Lcd_Out(1,6,"Sugar") lcdtbs delay end sub
'END OF SUBPROCEDURES
sub procedure hotchoc2 inc(hotchoc) delay ByteToStr(hotchoc, hotchoc_str) ' Byte -> String[3] Lcd_Out(2,13,hotchoc_str) end sub
sub procedure coff2 inc(coff) delay ByteToStr(coff, coff_str) ' Byte -> String[3] Lcd_Out(2,13,coff_str) end sub
sub procedure mil2 inc(mil) delay ByteToStr(mil, mil_str) ' Byte -> String[3] Lcd_Out(2,13,mil_str) end sub
sub procedure sug2 inc(sug) delay ByteToStr(sug, sug_str) ' Byte -> String[3] Lcd_Out(2,13,sug_str) end sub
'START OF MAIN PROGRAM
main: ADCON1 = $07 'use portA as digital PORTA = $00 'clear portA TRISA = $FF 'designate portA as input PORTB = $00 'clear portB TRISB = $00 'designate portB as output (LCD to portb) PORTC = $00 'clear portC TRISC = $00 'designate portC as output PORTD = $00 'clear portD TRISD = $FC 'set portD.0,1 as output and 2,3,4,5,6,7,as input INTCON = $00 'disable all interrupts Lcd_Init(PORTB) 'initialize portB as LCD output(default 4-bit con) Lcd_Cmd(LCD_CURSOR_OFF) 'turn the LCD cursor off lcdinit
cup: clearlcd lcdcup while 1=1 if PORTA.3 = 0 then goto heat end if wend
heat: delay clearlcd lcdheat while 1=1 if PORTA.2 = 1 then goto welcome end if wend
welcome: clearlcd Lcd_Out(1,5,"Welcome.") delay Lcd_Out(2,1,"Please Press Go!") 'welcome screen while 1=1 if PORTA.0 = 1 then goto presetmode end if wend 'the program enters the menu if go(portA.0) is pressed
'MAIN MENU STRUCTURE
presetmode: clearlcd Lcd_Out(1,3,"PRESET MODE") select_go delay while 1=1 if PORTA.0 = 1 then goto manualmode end if if PORTA.1 = 1 then goto preset_one end if wend
manualmode: clearlcd Lcd_Out(1,3,"MANUAL MODE") select_go delay while 1=1 if PORTA.0 = 1 then goto memorymode end if if PORTA.1 = 1 then goto manual_one end if wend
memorymode: clearlcd Lcd_Out(1,3,"MEMORY MODE") select_go delay while 1=1 if PORTA.0 = 1 then goto presetmode end if if PORTA.1 = 1 then goto memory_one end if wend
'END OF MAIN MENU STRUCTURE
'SUB-MENU: PRESET
preset_one: clearlcd lcdhot delay while 1=1 if PORTA.0 = 1 then hot_chocolate hot_chocolate milk milk sugar sugar hotwater display goto welcome end if if PORTA.1 = 1 then goto preset_two end if wend
preset_two: clearlcd lcdcoff delay while 1=1 if PORTA.0 = 1 then coffee coffee milk milk sugar sugar hotwater display goto welcome end if if PORTA.1 = 1 then goto preset_three end if wend
preset_three: clearlcd Lcd_Out(1,2,"Hot Water Only") delay while 1=1 if PORTA.0 = 1 then hotwater display goto welcome end if if PORTA.1 = 1 then goto preset_four end if wend
preset_four: clearlcd lcdback delay while 1=1 if PORTA.0 = 1 then goto presetmode end if if PORTA.1 = 1 then goto preset_one end if wend
'END OF SUBMENU:PRESET
'SUB MENU: MANUAL
manual_one: hotchoc1 while 1=1 if Button(PORTA, 0, 50, 1)then hotchoc2 end if if PORTA.1 = 1 then goto manual_two end if wend
manual_two: coff1 while 1=1 if Button(PORTA, 0, 50, 1)then coff2 end if if PORTA.1 = 1 then goto manual_three end if wend
manual_three: sug1 while 1=1 if Button(PORTA, 0, 50, 1)then sug2 end if if PORTA.1 = 1 then goto manual_four end if wend
manual_four: mil1 while 1=1 if Button(PORTA, 0, 50, 1)then mil2 end if if PORTA.1 = 1 then goto manual_five end if wend
manual_five: clearlcd Lcd_Out(1,2,"GO: Make Drink") Lcd_Out(2,2,"SELECT: Cancel") delay while 1=1 if PORTA.0 = 1 then makemil makesugar makehotchoc makecoff hotwater display goto welcome end if if PORTA.1 = 1 then clearlcd Lcd_Out(1,4,"Cancelled!") delay delay goto welcome end if wend 'END OF SUB MENU: MANUAL
'SUB MENU: MEMORY
memory_one: clearlcd Lcd_Out(1,4,"Make Drink") Lcd_Out(2,3,"From Memory") delay while 1=1 if PORTA.0 = 1 then delay goto usermem1 end if if PORTA.1 = 1 then delay goto memory_two end if wend memory_two: clearlcd Lcd_Out(1,4,"Save Drink") Lcd_Out(2,4,"To Memory") delay while 1=1 if PORTA.0 = 1 then delay goto savemem_one end if if PORTA.1 = 1 then delay goto memory_three end if wend memory_three: clearlcd lcdback delay while 1=1 if PORTA.0 = 1 then delay goto welcome end if if PORTA.1 = 1 then delay goto memory_one end if wend 'END OF SUB MENU:MEMORY
'sub-SUB MENU MAKE DRINK:MEMORY
usermem1: clearlcd Lcd_Out(1,2,"User Memory 1") delay while 1=1 if PORTA.0 = 1 then coff = EEPROM_READ(20) delaysmall hotchoc = EEPROM_READ(22) delaysmall mil = EEPROM_READ(24) delaysmall sug = EEPROM_READ(26) delaysmall makecoff makehotchoc makemil makesugar hotwater display goto welcome end if if PORTA.1 = 1 then goto usermem2 end if wend usermem2: Lcd_Out(1,2,"User Memory 2") delay while 1=1 if PORTA.0 = 1 then coff = EEPROM_READ(30) delaysmall hotchoc = EEPROM_READ(32) delaysmall mil = EEPROM_READ(34) delaysmall sug = EEPROM_READ(36) delaysmall makecoff makehotchoc makemil makesugar hotwater display goto welcome end if if PORTA.1 = 1 then goto usermem3 end if wend
usermem3: clearlcd lcdback delay while 1=1 if PORTA.0 = 1 then goto memorymode end if if PORTA.1 = 1 then goto usermem1 end if wend
'END OF sub-SUB MENU MAKE DRINK:MEMORY
'sub-SUB MENU SAVE DRINK:MEMORY
savemem_one: hotchoc1 while 1=1 if Button(PORTA, 0, 50, 1)then hotchoc2 end if if PORTA.1 = 1 then goto savemem_two end if wend
savemem_two: coff1 while 1=1 if Button(PORTA, 0, 50, 1)then coff2 end if if PORTA.1 = 1 then goto savemem_three end if wend
savemem_three: sug1 while 1=1 if Button(PORTA, 0, 50, 1)then sug2 end if if PORTA.1 = 1 then goto savemem_four end if wend
savemem_four: mil1 while 1=1 if Button(PORTA, 0, 50, 1)then mil2 end if if PORTA.1 = 1 then goto savemem_five end if wend
savemem_five: clearlcd Lcd_Out(1,2,"GO: Save Drink") Lcd_Out(2,2,"SELECT: Cancel") delay while 1=1 if PORTA.0 = 1 then goto savemem_six end if if PORTA.1 = 1 then clearlcd Lcd_Out(1,4,"Cancelled!") delay delay goto welcome end if wend savemem_six: clearlcd Lcd_Out(1,2,"GO: #1") Lcd_Out(2,2,"SELECT: #2") delay while 1=1 if PORTA.0 = 1 then EEPROM_WRITE(20, coff) EEPROM_WRITE(22, hotchoc) EEPROM_WRITE(24, mil) EEPROM_WRITE(26, sug) clearlcd lcdsave delay goto welcome end if if PORTA.1 = 1 then EEPROM_WRITE(30, coff) EEPROM_WRITE(32, hotchoc) EEPROM_WRITE(34, mil) EEPROM_WRITE(36, sug) clearlcd lcdsave delay goto welcome end if wend
'END OF sub-SUB MENU SAVE DRINK:MEMORY
end. '''''''''''''''END OF MAIN PROGRAM'''''''''''''''
|