NURULHAIZA
- 14th June 2010, 03:53
hi,
i'm currently working on a menu selection using pic 16f886 and lcd 4x20. my problem is the pic only execute the first subroutine only....here is the code sample
tx:
@ DEVICE HS_OSC
define osc 20
define ADC_bits 10
define ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
TRISA = %11111111
ADCON0 = %00000001
ADCON1 = %10010000
suhu1 var word
suhu2 var word
dta VAR WORD
volt VAR WORD
x var word
main:
ADCIN 0,dta ' ADC port=AN0
high portb.0
suhu1=(dta-215)*13 '215=utk offset sebab start dri 1v bkn start dri 0v
suhu2=suhu1-5504
SEROUT2 PORTC.6,84, [" WQ101-ADC:",dta,dec suhu2/100,46,dec2 suhu2,248,67,10]
low portb.0
PAUSE 200
GOTO main
rx(menu selection part):
@ DEVICE HS_OSC
define OSC 20
DEFINE LCD4X20 1
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
DEFINE HSER_BAUD 9600
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 129
dta var word
dta1 var word
led var portb.0
m var portB.1
ANSEL = 0 'All Digital, konfigurasi ini utk jadikan semua port
ANSELH = 0
push var byte : push = 1
goto screen1
main:
if portB.1=1 then 'arrow down
push = push+1 : goto selection : endif
if portA.1=1 then 'arrow up
push = push-1 : goto selection : endif
pause 5000
goto main
selection:
pause 200
if push=1 then screen1
if push=2 then screen2
if push=3 then screen3
if push=4 then screen4
if push=5 then screen5
if push=6 then screen6
if push=7 then screen7
if push=8 then screen8
if push=9 then
push = 1 : goto screen1 : endif
if push=0 then
push = 8 : goto screen8 : endif
goto main
screen1:
LCDOUT $FE,1,$7E, "|Mode1| |Mode5|" '$7E= ARROW PADA LCD
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
GOSUB TEMP
GOto MAIN
TEMP:high LED : pause 300
hserout ["+++"]
hserin 2000,main,[dta1(0),dta1(1)]
serout2 portb.2, 16468,[dta1(0), dta1(1)]
LCDOUT $FE,1,"STATUS: ",DTA1(0),DTA1(1):pause 2000
serin2 portc.7,84,[wait(" "),dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5),DTA(6) ,DTA(7),DTA(8),dta(9),dta(10),dta(11),dta(12),DTA( 13),DTA(14),DTA(15)]
pause 50
serout2 portc.5,16468,[dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5),DTA(6),D TA(7),DTA(8),dta(9),dta(10),dta(11),dta(12),DTA(13 ),DTA(14),DTA(15),13]
LCDOUT $FE,$C0,dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5), DTA(6),DTA(7),DTA(8),dta(9),dta(10),dta(11),dta(12 ),DTA(13),DTA(14),DTA(15)
RETURN
screen2:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0,$7E,"|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
low led 'led off when arrow at mode 2 in LCD
goto main
screen3:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94,$7E,"|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen4:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4,$7E,"|Mode4| |Mode8|"
goto main
screen5:
LCDOUT $FE,1, " |Mode1| ",$7E,"|Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen6:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| ",$7E,"|Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen7:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| ",$7E,"|Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen8:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| ",$7E,"|Mode8|"
goto main
i'm currently working on a menu selection using pic 16f886 and lcd 4x20. my problem is the pic only execute the first subroutine only....here is the code sample
tx:
@ DEVICE HS_OSC
define osc 20
define ADC_bits 10
define ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
TRISA = %11111111
ADCON0 = %00000001
ADCON1 = %10010000
suhu1 var word
suhu2 var word
dta VAR WORD
volt VAR WORD
x var word
main:
ADCIN 0,dta ' ADC port=AN0
high portb.0
suhu1=(dta-215)*13 '215=utk offset sebab start dri 1v bkn start dri 0v
suhu2=suhu1-5504
SEROUT2 PORTC.6,84, [" WQ101-ADC:",dta,dec suhu2/100,46,dec2 suhu2,248,67,10]
low portb.0
PAUSE 200
GOTO main
rx(menu selection part):
@ DEVICE HS_OSC
define OSC 20
DEFINE LCD4X20 1
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
DEFINE HSER_BAUD 9600
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 129
dta var word
dta1 var word
led var portb.0
m var portB.1
ANSEL = 0 'All Digital, konfigurasi ini utk jadikan semua port
ANSELH = 0
push var byte : push = 1
goto screen1
main:
if portB.1=1 then 'arrow down
push = push+1 : goto selection : endif
if portA.1=1 then 'arrow up
push = push-1 : goto selection : endif
pause 5000
goto main
selection:
pause 200
if push=1 then screen1
if push=2 then screen2
if push=3 then screen3
if push=4 then screen4
if push=5 then screen5
if push=6 then screen6
if push=7 then screen7
if push=8 then screen8
if push=9 then
push = 1 : goto screen1 : endif
if push=0 then
push = 8 : goto screen8 : endif
goto main
screen1:
LCDOUT $FE,1,$7E, "|Mode1| |Mode5|" '$7E= ARROW PADA LCD
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
GOSUB TEMP
GOto MAIN
TEMP:high LED : pause 300
hserout ["+++"]
hserin 2000,main,[dta1(0),dta1(1)]
serout2 portb.2, 16468,[dta1(0), dta1(1)]
LCDOUT $FE,1,"STATUS: ",DTA1(0),DTA1(1):pause 2000
serin2 portc.7,84,[wait(" "),dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5),DTA(6) ,DTA(7),DTA(8),dta(9),dta(10),dta(11),dta(12),DTA( 13),DTA(14),DTA(15)]
pause 50
serout2 portc.5,16468,[dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5),DTA(6),D TA(7),DTA(8),dta(9),dta(10),dta(11),dta(12),DTA(13 ),DTA(14),DTA(15),13]
LCDOUT $FE,$C0,dta(0),DTA(1),DTA(2),DTA(3),DTA(4),DTA(5), DTA(6),DTA(7),DTA(8),dta(9),dta(10),dta(11),dta(12 ),DTA(13),DTA(14),DTA(15)
RETURN
screen2:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0,$7E,"|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
low led 'led off when arrow at mode 2 in LCD
goto main
screen3:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94,$7E,"|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen4:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4,$7E,"|Mode4| |Mode8|"
goto main
screen5:
LCDOUT $FE,1, " |Mode1| ",$7E,"|Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen6:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| ",$7E,"|Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen7:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| ",$7E,"|Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| |Mode8|"
goto main
screen8:
LCDOUT $FE,1, " |Mode1| |Mode5|"
LCDOUT $FE,$C0+1, "|Mode2| |Mode6|"
LCDOUT $FE,$94+1, "|Mode3| |Mode7|"
LCDOUT $FE,$D4+1, "|Mode4| ",$7E,"|Mode8|"
goto main