
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
hallo, moechte ein kleines demoprog.(basic) zur verfügung stellen. darin sind eigene quasi-threads vorhanden. eine menuefuehrung wird mit einem poti umgesetzt. die aktualisierungsgeschwindigkeit vom lcddisplay wird je nach menue flexibel angepasst. für verbesserungen oder hinweise waere ich dankbar. :-) Quellcode '************************************************************************************************************************* define p1 port[1] 'nicht belegt define p7 port[7] 'Relais 1 define p8 port[8] 'Relais 2 define lcd_rs port[14] 'LCD-Display define lcd_rw port[13] 'LCD-Display define lcd_e port[15] 'LCD-Display define lcd_port byteport[2] 'LCD-Display '************************************************************************************************************************* define ad8 ad[8] 'Poti für Menue-Steuerung define ad7 ad[7] 'Temperatur-Sensor1 für Außentemperatur define ad6 ad[6] 'Lichtsensor '************************************************************************************************************************* define Adresse byte[1] 'I2C LM75; ASM-Prog define Daten byte[2] 'I2C LM75; ASM-Prog define zehntausender byte[3] 'Zahlenausgabe auf LCD-Display define tausender byte[4] 'Zahlenausgabe auf LCD-Display define hunderter byte[5] 'Zahlenausgabe auf LCD-Display define zehner byte[6] 'Zahlenausgabe auf LCD-Display define einer byte[7] 'Zahlenausgabe auf LCD-Display define value byte[8] 'Zahlenausgabe auf LCD-Display define gp byte[9] 'Zahlenausgabe auf LCD-Display define ti_out byte[10] 'Timer für sekunden thread define lcd_buf byte[11] 'LCD-Display define lcd_param byte[12] 'LCD-Display define lcd_char byte[13] 'LCD-Display define k byte[14] 'Menue-Variable define sp byte[15] 'Speed-Variable für individuelles LCD-Update und Speed für task_out define b16 byte[16] 'frei define b17 byte[17] 'frei define b18 byte[18] 'frei '************************************************************************************************************************* define temp word[10] 'Byte 19, 20 define ti2 word[11] 'Byte 21, 22 define value16 word[12] 'Byte 23, 24 '************************************************************************************************************************* gosub lcd_init gosub start_msg pause 100 '************************************************************************************************************************* k=0 sp=3 #main if (abs(second-ti_out)>sp) then gosub task_out '2 s 'if ((Daten > 29) or ((Temp-25)/10 < 5)) then beep 400,25,10 'Temperatur-Alarm 'if (FREQ2 > 29) then beep 300,25,10 'Druchfluss-Alarm 'if (ad6 < 1500) then beep 200,25,10 'Licht-Alarm goto main '************************************************************************************************************************* #task_out 'print day, month, year, hour, minute, second', LIT 'Ausgabe an s TERM-PROG ti_out=second 'Timerwert merken Adresse = &H90 'LM75 Adresse Daten = 255 'Init sys &H0101 'Asembler-Prog aufruf looktab TempTab, ad7, Temp p1 = not p1 'p7 = not P7 'p8 = not P7 if (ad8 >= 0) and (ad8 <= 42) then gosub men1 if (ad8 >= 42) and (ad8 <= 84) then gosub men2 if (ad8 > 84) and (ad8 <= 168) then gosub men3 if ad8 > 168 then gosub men4 on k gosub out_0, out_1, out_2 , out_3 return '************************************************************************************************************************* #men1 sp=3 k=k+1 return '************************************************************************************************************************* #men2 sp=1 k=1 return '************************************************************************************************************************ #men3 sp=1 k=2 return '************************************************************************************************************************* #men4 sp=0 k=3 return '************************************************************************************************************************* #out_0'dummy_label 'das dumy_label wird benötigt, da sonst das zaehlen von k nicht funktioniert return '************************************************************************************************************************* #start_msg gosub lcd_cls lcd_param = 1 : gosub lcd_gotoline lcd_param = &H20 : gosub lcd_writechar lcd_param = &H20 : gosub lcd_writechar lcd_param = &H20 : gosub lcd_writechar lcd_param = &H43 : gosub lcd_writechar 'C lcd_param = &H2D : gosub lcd_writechar '- lcd_param = &H43 : gosub lcd_writechar 'C lcd_param = &H4F : gosub lcd_writechar 'O lcd_param = &H4E : gosub lcd_writechar 'N lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H52 : gosub lcd_writechar 'R lcd_param = &H4F : gosub lcd_writechar 'O lcd_param = &H4C : gosub lcd_writechar 'L return '************************************************************************************************************************* #out_1 gosub lcd_init lcd_param = &H44 : gosub lcd_writechar 'D lcd_param = &H41 : gosub lcd_writechar 'A lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H45 : gosub lcd_writechar 'E lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = day gosub display_value16 lcd_param = &H3A : gosub lcd_writechar ': value16 = month gosub display_value16 lcd_param = &H3A : gosub lcd_writechar ': value16 = year+2000 gosub display_value16 lcd_param = 2 gosub lcd_gotoline lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H49 : gosub lcd_writechar 'I lcd_param = &H4D : gosub lcd_writechar 'M lcd_param = &H45 : gosub lcd_writechar 'E lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = hour gosub display_value16 lcd_param = &H3A : gosub lcd_writechar ': value16 = minute gosub display_value16 lcd_param = &H3A : gosub lcd_writechar ': value16 = second gosub display_value16 return '************************************************ #out_2 gosub lcd_init lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H49 : gosub lcd_writechar 'I lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = Daten if value16<0 then lcd_param=&H2D:gosub lcd_writechar value16=abs(value16):gosub display_value16 'gosub display_value16 lcd_param = &H20 : gosub lcd_writechar ' lcd_param = &HDF : gosub lcd_writechar '° lcd_param = &H43 : gosub lcd_writechar 'C lcd_param = 2 gosub lcd_gotoline lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H41 : gosub lcd_writechar 'A lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = (Temp-20)/10 if value16<0 then lcd_param=&H2D:gosub lcd_writechar value16=abs(value16):gosub display_value16 'gosub display_value16 lcd_param = &H20 : gosub lcd_writechar ' lcd_param = &HDF : gosub lcd_writechar '° lcd_param = &H43 : gosub lcd_writechar 'C return '************************************************************************************************************************* #out_3 gosub lcd_init lcd_param = &H46 : gosub lcd_writechar 'F lcd_param = &H52 : gosub lcd_writechar 'R lcd_param = &H45 : gosub lcd_writechar 'E lcd_param = &H51 : gosub lcd_writechar 'Q lcd_param = &H32 : gosub lcd_writechar '2 lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = freq2 gosub display_value16 lcd_param = &H20 : gosub lcd_writechar ' lcd_param = &H48 : gosub lcd_writechar 'H lcd_param = &H7A : gosub lcd_writechar 'z lcd_param = 2 gosub lcd_gotoline lcd_param = &H4C : gosub lcd_writechar 'L lcd_param = &H49 : gosub lcd_writechar 'I lcd_param = &H47 : gosub lcd_writechar 'G lcd_param = &H48 : gosub lcd_writechar 'H lcd_param = &H54 : gosub lcd_writechar 'T lcd_param = &H3A : gosub lcd_writechar ': lcd_param = &H20 : gosub lcd_writechar ' value16 = ad6/10*196 gosub display_value16 lcd_param = &H20 : gosub lcd_writechar ' lcd_param = &H6D : gosub lcd_writechar 'm lcd_param = &H56 : gosub lcd_writechar 'V k=0 return '************************************************************************************************************************* '+++++++++++++++ VALUE 16 AUSGEBEN ++++++++++++++++ #display_value16 value=0 zehntausender=value16/10000 if zehntausender=0 then goto dv1 value=1 lcd_param=zehntausender+&H30 gosub lcd_writechar #dv1 tausender=(value16-zehntausender*10000)/1000 if (tausender=0 and value=0) then goto dv2 value=1 lcd_param=tausender+&H30 gosub lcd_writechar #dv2 hunderter=(value16-zehntausender*10000-tausender*1000)/100 if (hunderter=0 and value=0 and gp<>4) then goto dv3 value=1 lcd_param=hunderter+&H30 gosub lcd_writechar #dv3 if gp<>4 then goto dv3_1 lcd_param=&H2E gosub lcd_writechar #dv3_1 zehner=(value16-zehntausender*10000-tausender*1000-hunderter*100)/10 if (zehner=0 and value=0 and (gp<>1 and gp<>6))then goto dv4 lcd_param=zehner+&H30 gosub lcd_writechar #dv4 if gp<>1 and gp<>6 then goto dv4_1 lcd_param=&H2E gosub lcd_writechar #dv4_1 einer=value16-zehntausender*10000-tausender*1000-hunderter*100-zehner*10 lcd_param=einer+&H30 gosub lcd_writechar return '************************************************************************************************************************* '---------------------------------------- #LCD_INIT ' alle ports 0 lcd_port = OFF ' 8-Bit-Modus aktivieren lcd_param=&H38 : gosub LCD_WRITECMD ' mit 8-Bit-Command in 4-Bit-Modus umschalten lcd_port=&B00000010 tog lcd_e tog lcd_e ' ab jetzt 4-Bit-Modus lcd_param = &H28 : gosub LCD_WRITECMD lcd_param = &H0C : gosub LCD_WRITECMD ' Display loeschen #LCD_CLS lcd_param = &H02 : gosub LCD_WRITECMD lcd_param = &H01 : gosub LCD_WRITECMD return '---------------------------------------- ' Zeilenwechsel #LCD_GOTOLINE if lcd_param = 1 then lcd_param = &H80 if lcd_param = 2 then lcd_param = &HC0 goto LCD_WRITECMD ' LCD-Kommando #LCD_WRITECMD lcd_buf = OFF goto LCD_WRITE ' Zeichenausgabe #LCD_WRITECHAR lcd_buf = &B00100000 ' Kommando oder Zeichen an Display senden #LCD_WRITE lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble tog lcd_e tog lcd_e lcd_port = lcd_buf or (lcd_param and &H0F) ' Lo-Nibble tog lcd_e tog lcd_e return end '************************************************************************************************************************* table TempTab "NTC.TAB" 'syscode muss nur einmal geladen werden!!! d.h. einmal ohne ausklammerung in c-control übertragen 'syscode "i2c.obj" '************************************************************************************************************************* 'ASM-CODE muss mit TASM.EXE in I2C.OBJ übersetzt werden 'damit meldet man das EEPROM vom I2C an und ab .org $101 jsr $08BB jsr I2C_Start lda $0A1 jsr I2C_Write lda $02A jsr I2C_Write jsr $08E5 jsr I2C_Start lda $0A1 inca jsr I2C_Write jsr $086F sta $0A2 jsr $08BB ldx #$0A0 jsr $083C ldx $066 jsr $0846 ldx $067 jsr $0846 ldx #$0A1 jsr $083C rts PORT .EQU $00 DIR .EQU $04 SDA .EQU 0 SCL .EQU 1 I2C_Start BSET SDA,DIR BSET SDA,PORT BSET SCL,PORT BCLR SDA,PORT BCLR SCL,PORT RTS I2C_Write BSET SDA,DIR LDX #8 Nextbit ROLA BCC LoBit BSET SDA,PORT BRA Clock LoBit BCLR SDA,PORT Clock BSET SCL,PORT BCLR SCL,PORT DEX BNE Nextbit BCLR SDA,DIR BSET SCL,PORT BCLR SCL,PORT RTS .end |
| Antwort schreiben |