*#cpu ATMEL 89C2051 * -> TSA5055 SP5055 !!!! * Frequency BASE : KHz * Base unit is Frequency * If CKEY_3CM is '0' then ADD CHANNEL '9' to current channel ORG $0000 ; AJMP *+$0032 * Interrupt area ; DS $0032-2 MOV SP,#?stk -1 LCALL main forever SJMP forever MEMTIMEOUT EQU 10*3 ; 1,5 seconden CMODE_VCO EQU 0 CMODE_MEMORY EQU 1 CKEY_UP EQU P3.0 CKEY_DOWN EQU P3.1 CKEY_MODE EQU P3.2 CKEY_3CM EQU P3.4 C1323SW EQU P3.7 C3CMSW EQU P3.5 CMEM_MODE EQU 255 CMEM_CHANNEL EQU 254 CMEM_MAGIC EQU 253 CMEM_BANDSW EQU 252 CLCD_CURSORON EQU 12 CLCD_CURSOROFF EQU 13 CMAGIC EQU 99 CMAXCHANNELS EQU 10 LCD_MAXX EQU 8 ; '8' for 1 line LCD, '16' for 2 line LCD-Displays main ACALL LCD_init ACALL I2C_INIT MOV A,EEPROM CJNE A,#1,?startup3 ; OK, er is dus GEEN EEPROM MOV MODE,#CMODE_VCO MOV CHANNEL,#0 MOV FREQ,#0 ; 1252 MHz MOV FREQ+1,#19 MOV FREQ+2,#26 MOV FREQ+3,#160 MOV DPTR,#NOEEPROMTEXT ACALL LCD_line MOV R1,#6 MOV R2,#0 ACALL Delay ACALL LCD_clear MOV BANDSW,#0 AJMP CHANGE_LOOP ?startup3 MOV R0,#CMEM_MAGIC ACALL eeread CJNE A,#CMAGIC,?startup2 ******** REPROG indien P3.0 en P3.1 ingedrukt is op 1252.000 KHz *** OF indien CMEM_MAGIC in EEPROM <> MAGIC JB P3.0,?main1 JB P3.1,?main1 ?startup2 ACALL I2C_INIT MOV R0,#0 MOV R1,#(CMAXCHANNELS*2)-1 ?startuploop MOV A,#0 ACALL eewrite INC R0 MOV A,#19 ACALL eewrite INC R0 MOV A,#26 ACALL eewrite INC R0 MOV A,#160 ACALL eewrite INC R0 DJNZ R1,?startuploop ; Set Channel 20 to 10 GHz offset frequency ; = 9.050.000 KHz MOV A,#0 ACALL eewrite INC R0 MOV A,#138 ACALL eewrite INC R0 MOV A,#23 ACALL eewrite INC R0 MOV A,#144 ACALL eewrite ; Standaard op VCO zetten MOV R0,#CMEM_MODE MOV A,#CMODE_VCO ACALL eewrite ; Standaard, channel 0 MOV R0,#CMEM_CHANNEL MOV A,#0 ACALL eewrite ; Standaard, 23 cm MOV R0,#CMEM_BANDSW MOV A,#0 ACALL eewrite MOV R0,#CMEM_MAGIC MOV A,#CMAGIC ACALL eewrite ?main1 MOV BANDSW,#0 MOV DPTR,#Text1 ACALL LCD_line MOV R1,#6 MOV R2,#0 ACALL Delay ACALL LCD_clear MOV R0,#CMEM_MODE ACALL eeread MOV MODE,A MOV R0,#CMEM_BANDSW ACALL eeread MOV BANDSW,A MOV R0,#CMEM_CHANNEL ACALL eeread MOV CHANNEL,A ACALL readchannel MOV DPTR,#SMALLSTEP MOV R0,#RASTER ACALL COPYCtoI ACALL I2C_INIT CHANGE_LOOP MOV R0,#FREQ MOV R1,#GETAL ACALL COPYRtoR ACALL LCD_clear ; Tel 3 cm offset erbij op indien deze mode geselecteerd is. SETB C3CMSW MOV A,BANDSW CJNE A,#CMAXCHANNELS,?CHANGELP1 CLR C3CMSW MOV A,CHANNEL CJNE A,#CMAXCHANNELS-1,?ERBIJ_LPb SJMP ?CHANGELP1 ?ERBIJ_LPb ; 3 cm mode. ; Tel de offset er even bij op... ACALL readoffset MOV R0,#GETAL+3 MOV R1,#OFFSET+3 MOV R2,#4 CLR C ?ERBIJ_LPa MOV A,@R0 ADDC A,@R1 MOV @R0,A DEC R0 DEC R1 DJNZ R2,?ERBIJ_LPa ?CHANGELP1 ACALL PRINT_DEC MOV R0,#BEWAAR ; Vermenigvuldig eerst met 16 CLR A MOV @R0,A INC R0 MOV @R0,A INC R0 MOV @R0,A INC R0 ;Check hier of we onder de 2000 Mhz zitten... SETB C1323SW MOV SW2313,#1 MOV R1,#16 ; #16 indien TSA5511, bij TSA5055: #8 CLR C MOV A,FREQ+1 SUBB A,#30 JC KLN2000MHZ CLR C1323SW MOV SW2313,#0 MOV R1,#8 KLN2000MHZ MOV A,R1 MOV @R0,A ; @R0 -> VERMENIGVULDIGER -> 4 BYTES ; @R1 -> VERMENIGVULDIG TAL -> 4 BYTES ; @R2 <- RESULT -> 4 BYTES ; Aangezien MUL32 alle registers sloopt (R0,R1 en R2), moet FREQ bewaard worden... MOV R0,#FREQ MOV R1,#BEWAAR2 ACALL COPYRtoR MOV R1,#BEWAAR ; * 16 MOV R2,#GETAL ; Sla op in GETAL ACALL MULT32 ; GETAL = FREQ * 16 ; Haal Freq weer op. MOV R0,#BEWAAR2 MOV R1,#FREQ ACALL COPYRtoR ; @R0 -> DELER -> 4 BYTES ; @R1 -> DEELTAL -> 4 BYTES ; @R0 <- RESULTAAT -> 4 BYTES ; @R2 <- REST -> 4 BYTES ; @R0 = @R0 DIV @R1 ; @R2 = @R0 MOD @R1 MOV DPTR,#DUIZEND ; Sla deeltal op in bewaar MOV R0,#BEWAAR ACALL COPYCtoI MOV R0,#GETAL ; FREQ * 16 MOV R1,#BEWAAR ; 1000 MOV R2,#BEWAAR2 ; MODULES register ACALL DIV32 ; GETAL = (FREQ * 16) / 1000 ; Dit levert in de regel een 16 bits waarde op. MOV XPOS,#11 MOV YPOS,#0 ACALL LCD_xypos MOV A,#'[' ACALL LCD_char MOV A,CHANNEL ADD A,#$30 ACALL LCD_char MOV A,#']' ACALL LCD_char MOV R0,#GETAL+2 MOV A,[R0] MOV R1,A INC R0 MOV A,[R0] MOV R2,A ACALL synthwrite ACALL mode_status KEY_LOOP JB CKEY_UP,?KEY1 ; Up toets gedrukt ; Check status van MODE MOV A,MODE CJNE A,#CMODE_VCO,?KEY1A ; VCO MODE ACALL ERBIJ INC KEYCOUNT MOV MEMLOCK,#MEMTIMEOUT AJMP KEY_LOOP_END ?KEY1A ; CHANNEL MODE MOV A,CHANNEL INC CHANNEL CJNE A,#CMAXCHANNELS-1,?KEY1B ; We zijn al aan het einde. MOV CHANNEL,#0 ?KEY1B ; Even opslaan... MOV R0,#CMEM_CHANNEL MOV A,CHANNEL ACALL eewrite ACALL readchannel MOV R1,#0 ; Wacht ongeveer 300 ms MOV R2,#300 ACALL Delay SJMP KEY_LOOP_END ?KEY1 JB CKEY_DOWN,?KEY2 ; Down toets gedrukt ; Check status van MODE MOV A,MODE CJNE A,#CMODE_VCO,?KEY2A ; VCO MODE ACALL ERAF INC KEYCOUNT MOV MEMLOCK,#MEMTIMEOUT SJMP KEY_LOOP_END ?KEY2A ; CHANNEL MODE MOV A,CHANNEL DEC CHANNEL CJNE A,#0,?KEY2B ; We zijn al aan het einde. MOV CHANNEL,#CMAXCHANNELS-1 ?KEY2B ; Even opslaan... MOV R0,#CMEM_CHANNEL MOV A,CHANNEL ACALL eewrite ACALL readchannel MOV R1,#0 ; Wacht ongeveer 300 ms MOV R2,#300 ACALL Delay AJMP KEY_LOOP_END ?KEY2 JB CKEY_MODE,?KEY6 ; MODE geselecteerd INC MODE ANL MODE,#1 ; Wacht even tot ie losgelaten is. ?KEY2a JNB CKEY_MODE,?KEY2a MOV R0,#CMEM_MODE MOV A,MODE ACALL eewrite ACALL mode_status AJMP ?KEY_LOOP1 ?KEY6 JB CKEY_3CM,?KEY7 ; 3 CM / 13/23 CM toggle MOV A,BANDSW CJNE A,#0,?KEY6a ; Gelijk aan 0 dus maak nu CMAXCHANNELS MOV BANDSW,#CMAXCHANNELS SJMP ?KEY6b ?KEY6a MOV BANDSW,#0 ?KEY6b ; Wacht even tot ie losgelaten is. JNB CKEY_3CM,?KEY6b MOV R0,#CMEM_BANDSW MOV A,BANDSW ACALL eewrite ACALL readchannel SJMP ?KEY_LOOP1 ?KEY7 MOV KEYCOUNT,#0 MOV DPTR,#SMALLSTEP MOV R0,#RASTER ACALL COPYCtoI MOV R1,#0 ; Wacht ongeveer 50 ms MOV R2,#50 ACALL Delay ; Als MEMLOCK > 0 dan aftellen tot 0, indien daarna 0, ; FREQ in EEPROM geheugen schrijven MOV A,MEMLOCK CJNE A,#0,?MEMLOCK1 AJMP KEY_LOOP ?MEMLOCK1 DEC MEMLOCK MOV A,MEMLOCK CJNE A,#0,?MEMLOCK2 ; Naar EEPROM schrijven die hap... ACALL writechannel ?MEMLOCK2 AJMP KEY_LOOP KEY_LOOP_END ; Bepaal hier hoe lang we moeten wachten ; KEYCOUNT = 1 ? MOV A,KEYCOUNT CJNE A,#1,?KEY_LOOP2 ; Eerste ronde... Kleine stapjes. MOV DPTR,#SMALLSTEP MOV R0,#RASTER ACALL COPYCtoI SJMP ?KEY_LOOP1 ?KEY_LOOP2 CJNE A,#15,?KEY_LOOP3 ; 15e ronde... Grote stapen. MOV DPTR,#MEDIUMSTEP MOV R0,#RASTER ACALL COPYCtoI SJMP ?KEY_LOOP1 ?KEY_LOOP3 CJNE A,#50,?KEY_LOOP4 ; 50e ronde... Grote stapen. MOV DPTR,#LARGESTEP MOV R0,#RASTER ACALL COPYCtoI SJMP ?KEY_LOOP1 ?KEY_LOOP4 CJNE A,#2,?KEY_LOOP1 ; 10 * 100ms wachten, tenzij toets losgelaten. MOV R3,#10 ?KEY3 MOV R1,#0 ; Wacht ongeveer 100 ms MOV R2,#100 ACALL Delay MOV A,P3 ANL A,#1FH CJNE A,#1FH,?KEY4 ; Al weer losgelaten MOV KEYCOUNT,#0 AJMP KEY_LOOP ?KEY4 DJNZ R3,?KEY3 AJMP CHANGE_LOOP ?KEY_LOOP1 MOV R1,#0 ; Wacht ongeveer 100 ms MOV R2,#100 ACALL Delay AJMP CHANGE_LOOP ******************************************* * modestatus ******************************************* mode_status PUSH A PUSH 0 MOV A,MODE MOV R0,#'M' CJNE A,#CMODE_VCO,?CURSORSKIP ; CHANNEL MODE MOV R0,#'F' ?CURSORSKIP MOV XPOS,#15 MOV YPOS,#0 ACALL LCD_xypos MOV A,R0 ACALL LCD_char ; ; MOV XPOS,#0 ; INC YPOS ; ACALL LCD_xypos ; MOV DPTR,#TEXT3CM ; MOV A,BANDSW ; CJNE A,#0,?LLCD ; MOV DPTR,#TEXT23CM ; MOV A,SW2313 ; CJNE A,#0,?LLCD ; MOV DPTR,#TEXT13CM ;?LLCD ; ACALL LCD_line ; MOV DPTR,#TEXTCM ; ACALL LCD_line ; POP 0 POP A RET * LCD_init * Initialyse LCD display LCD_init MOV A,#$28 ACALL LCD_command MOV A,#$28 ACALL LCD_command MOV A,#$01 ACALL LCD_command MOV A,#$06 ACALL LCD_command MOV A,#$0C ACALL LCD_command MOV A,#$0C ACALL LCD_command MOV XPOS,#0 MOV YPOS,#0 RET * LCD_data * Send data to display * Input A LCD_data LCD_char INC XPOS PUSH A MOV A,XPOS CJNE A,#LCD_MAXX+1,?LCD_char1 MOV XPOS,#0 INC YPOS ANL YPOS,#1 ACALL LCD_xypos ?LCD_char1 POP A SETB P1.5 SJMP LCD_senddata * LCD_data * Send data to display * Input A LCD_command CLR P1.5 SJMP LCD_senddata * LCD_senddata * Input A LCD_senddata PUSH 1 PUSH 2 PUSH A PUSH A MOV A,P1 ANL A,#240 MOV P1,A POP A PUSH A * P1 = P1 OR (CMD SHR 4) AND 0x0f (Bits 7..4) SWAP A ANL A,#0fh ORL P1,A * Clock P1.4 SETB P1.4 NOP CLR P1.4 MOV A,P1 ANL A,#240 MOV P1,A POP A * P1 = P1 OR (CMD AND 0x0f) (Bits 3..0) ANL A,#0fh ORL P1,A * Clock P1.4 SETB P1.4 NOP CLR P1.4 * Delay 1ms MOV R1,#0 MOV R2,#1 ACALL Delay POP A POP 2 POP 1 RET * LCD_line * Send data to display * Input DPTR in C-SEGMENT LCD_line CLR A MOVC A,[A+DPTR] INC DPTR CJNE A,#0,?LCD_line1 RET ?LCD_line1 ACALL LCD_data SJMP LCD_line RET * LCD_xypos * Set XY position on display * XPOS (0..63) * YPOS (0..1) LCD_xypos MOV A,XPOS ; Auto correct if just 1 line LCD display SUBB A,#LCD_MAXX JC ?LCD_xypos1 MOV XPOS,A INC YPOS ?LCD_xypos1 MOV A,YPOS SWAP A ; * 16 RL A ; * 2 RL A ; * 2 ANL A,#$C0 ADD A,#$80 ADD A,XPOS AJMP LCD_command * LCD_clear * Clears the display LCD_clear PUSH ACC PUSH 1 PUSH 2 MOV A,#01 ACALL LCD_command MOV XPOS,#0 MOV YPOS,#0 ACALL LCD_xypos POP 2 POP 1 POP ACC RET * LCD_BCD * Print A in BCD on display ;LCD_BCD: ; PUSH A ; PUSH A ; SWAP A ; ACALL LCD_BCD1 ; POP A ; ACALL LCD_BCD1 ; POP A ; RET ;LCD_BCD1: ; ANL A,#0FH ; PUSH A ; CLR C ; SUBB A,#10 ; POP A ; JC LCD_BCD1OK ; ADD A,#7 ; HEX CONVERSIE A..F ;LCD_BCD1OK: ; ADD A,#30H ; ACALL LCD_char ; RET * Delay R1 R2 ms (MSB LSB) Delay PUSH ACC PUSH DPL PUSH DPH ?AC1 CJNE R2,#0,?AC2 * LSB CJNE R1,#0,?AC2 * MSB POP DPH POP DPL POP ACC ? RET ?AC2 MOV A,#229 * 1 ms at 11059200 Hz (crystal - 72000) / 48000 ?AC3 INC DPTR * WASTE DJNZ A,?AC3 * Loop DEC R2 * Reduce count CJNE R2,#-1,?AC1 * No Carry DEC R1 * Reduce High SJMP ?AC2 * And proceed ******************************************************************** * 32 Bits deler ; @R0 -> DELER -> 4 BYTES ; @R1 -> DEELTAL -> 4 BYTES ; @R0 <- RESULTAAT -> 4 BYTES ; @R2 <- REST -> 4 BYTES ; @R0 = @R0 DIV @R1 ; @R2 = @R0 MOD @R1 ; LOCAL VAR'S : ; R4 = TELLER; ; R5 = SCRATCH ; A = ACC; DIV32: PUSH 4 PUSH 5 MOV R4,#32 ; CLEAR REST MOV R5,#4 PUSH 0 PUSH 2 POP 0 DIV32LP1: MOV @R0,#0 INC R0 DJNZ R5,DIV32LP1 POP 0 ; CLEAR CARRY CLR C DIV32LPX: ; DELER (RESULT) = (DELER SHL 1) OR CARRY MOV R5,#4 PUSH 0 PUSH PSW ; STORE CARRY ETC. MOV A,R0 ADD A,#3 MOV R0,A POP PSW DIV32LP2: MOV A,@R0 RLC A MOV @R0,A DEC R0 DJNZ R5,DIV32LP2 POP 0 ; REST = (REST SHL 1) OR CARRY MOV R5,#4 PUSH 0 PUSH PSW ; STORE CARRY ETC. MOV A,R2 ; REST POINTER ADD A,#3 MOV R0,A POP PSW DIV32LP3: MOV A,@R0 RLC A MOV @R0,A DEC R0 DJNZ R5,DIV32LP3 POP 0 ; REST = REST - DEELTAL - CARRY MOV R5,#4 PUSH 0 PUSH 1 PUSH PSW ; STORE CARRY ETC. MOV A,R2 ; REST POINTER ADD A,#3 MOV R0,A MOV A,R1 ADD A,#3 MOV R1,A POP PSW DIV32LP4: MOV A,@R0 SUBB A,@R1 MOV @R0,A DEC R0 DEC R1 DJNZ R5,DIV32LP4 POP 1 POP 0 ; IF CARRY, DUS REST IS NEGATIEF DAN : REST = REST + DEELTAL JNC DIV32LP6 MOV R5,#4 PUSH 0 PUSH 1 MOV A,R2 ; REST POINTER ADD A,#3 MOV R0,A MOV A,R1 ADD A,#3 MOV R1,A CLR C DIV32LP5: MOV A,@R0 ADDC A,@R1 MOV @R0,A DEC R0 DEC R1 DJNZ R5,DIV32LP5 POP 1 POP 0 ; SETB C ; CARRY = NOT CARRY DIV32LP6: CPL C ; HERHAAL TOTDAT TELLER = 0 DJNZ R4,DIV32LPX ; DELER (RESULT) = (DELER SHL 1) OR CARRY MOV R5,#4 PUSH 0 PUSH PSW ; STORE CARRY ETC. MOV A,R0 ADD A,#3 MOV R0,A POP PSW DIV32LP7: MOV A,@R0 RLC A MOV @R0,A DEC R0 DJNZ R5,DIV32LP7 POP 0 ; EINDE DIV32 DIV32END: POP 5 POP 4 RET ; @R0 -> VERMENIGVULDIGER -> 4 BYTES ; @R1 -> VERMENIGVULDIG TAL -> 4 BYTES ; @R2 <- RESULT -> 4 BYTES MULT32 PUSH 3 PUSH 4 MOV R4,#4 ; CLEAR RESULT PUSH 0 PUSH 2 POP 0 MULT32LP1 MOV @R0,#0 INC R0 DJNZ R4,MULT32LP1 POP 0 ; TELLER = 32 MOV R3,#32 ; SHIFT MULTR 1 PLAATS NAAR RECHTS. MULT32LPX MOV R4,#4 PUSH 0 CLR C MULT32LP2 MOV A,@R0 RRC A MOV @R0,A INC R0 DJNZ R4,MULT32LP2 ; 32 BITS = 4 BYTES POP 0 JNC MULT32LP3 ; RESULT (R2) = RESULT (R2) + MULTD (R1) PUSH 0 PUSH 1 PUSH 2 ; RESULT POP 0 ; NU EVEN OP R0 MOV A,R0 ADD A,#3 MOV R0,A ; LSB VAN RESULT MOV A,R1 ADD A,#3 MOV R1,A CLR C MOV R4,#4 MULT32LP4 MOV A,@R0 ; A = (RESULT) ADDC A,@R1 ; A = A + (MULTD) MOV @R0,A ; (RESULT) = A DEC R0 DEC R1 DJNZ R4,MULT32LP4 ; 4 BYTES (32 BITS) POP 1 POP 0 MULT32LP3 ; SHIFT MULTD 1 PLAATS NAAR LINKS ( * 2) MOV R4,#4 PUSH 1 MOV A,R1 ADD A,#3 ; LSB VAN MULTD MOV R1,A CLR C MULT32LP5 MOV A,@R1 RLC A MOV @R1,A DEC R1 DJNZ R4,MULT32LP5 ; 32 BITS = 4 BYTES POP 1 DJNZ R3,MULT32LPX POP 4 POP 3 RET *********************************************************** * Reken ;* COPY CODE NAAR INTERN DPTR -> @R0 COPYCtoI: PUSH 0 PUSH 1 PUSH ACC PUSH DPH PUSH DPL MOV R1,#4 COPYCTOILP: MOV A,#0 MOVC A,@A+DPTR MOV @R0,A INC DPTR INC R0 DJNZ R1,COPYCTOILP POP DPL POP DPH POP ACC POP 1 POP 0 RET ;**** @R0 -> GETAL **** ;**** DPTR -> AF TE TREKKEN WAARDE **** AFTREKKEN: PUSH ACC PUSH DPH PUSH DPL PUSH 0 PUSH 1 PUSH 2 PUSH 4 MOV R3,#0 AFTR_LP2: ACALL BACKUP MOV A,R0 ADD A,#3 MOV R0,A MOV R1,#3 MOV R2,#4 CLR C AFTR_LP: MOV A,R1 MOVC A,@A+DPTR MOV R4,A MOV A,@R0 SUBB A,R4 ; @R0 - (DPTR) -> KAN CARRY ONTSTAAN. MOV @R0,A DEC R0 DEC R1 DJNZ R2,AFTR_LP JC AFTR_LP1 INC R3 INC R0 ;COMPENSATIE INC R1 ; " SJMP AFTR_LP2 AFTR_LP1: ACALL RESTORE POP 4 POP 2 POP 1 POP 0 POP DPL POP DPH POP ACC RET BACKUP: PUSH 0 PUSH 1 PUSH 2 PUSH ACC MOV R0,#GETAL MOV R1,#BEWAAR MOV R2,#4 BACKUP_LP: MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,BACKUP_LP POP ACC POP 2 POP 1 POP 0 RET RESTORE: PUSH 0 PUSH 1 PUSH 2 PUSH ACC MOV R0,#BEWAAR MOV R1,#GETAL MOV R2,#4 RESTORE_LP: MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,RESTORE_LP POP ACC POP 2 POP 1 POP 0 RET COPYRtoR: PUSH 0 PUSH 1 PUSH 2 PUSH ACC MOV R2,#4 COPYRtoR_LP2: MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,COPYRtoR_LP2 POP ACC POP 2 POP 1 POP 0 RET PRINT_DEC: PUSH DPH PUSH DPL PUSH 1 MOV R0,#GETAL MOV R1,#BEWAAR2 ACALL COPYRtoR ;; MOV A,@R0 ;; ANL A,#80H ;; JZ PRINT_POS ;; ACALL CONV_NEG ;; MOV A,#'-' ;; SJMP PRINT_VER PRINT_POS: ;; MOV A,#' ' PRINT_VER: ; ACALL LCD_char ; TX SPATIE OF "-" MOV PUNT,#0 MOV R1,#10 MOV DPTR,#REEKS MOV FLAG,#0 MOV BLANKS,#1 PRINT_DEC1: ACALL AFTREKKEN INC PUNT MOV A,R3 PUSH ACC MOV A,FLAG CJNE A,#0,PRINT_DEC2 POP ACC ANL A,#0FFH JNZ PRINT_DEC4 INC BLANKS MOV A,PUNT CJNE A,#10,PRINT_DEC3 MOV A,#'0' PRINT_DEC6: ACALL LCD_char SJMP PRINT_DEC3 PRINT_DEC4: MOV FLAG,#1 PUSH ACC PRINT_DEC2: POP ACC ADD A,#30H ACALL LCD_char ACALL ADD_PUNT PRINT_DEC3: INC DPTR INC DPTR INC DPTR INC DPTR DJNZ R1,PRINT_DEC1 PUSH 0 MOV R0,#BEWAAR2 MOV R1,#GETAL ACALL COPYRtoR MOV R0,BLANKS MOV A,#' ' PRINT_DEC7: ACALL LCD_char DJNZ R0,PRINT_DEC7 POP 0 POP 1 POP DPL POP DPH RET ADD_PUNT: PUSH ACC PUSH B MOV A,PUNT CJNE A,#10,ADD_PUNTOK SJMP ADD_PUNTSK ADD_PUNTOK: ADD A,#2 MOV B,#3 DIV AB MOV A,B ; MODULES CJNE A,#0,ADD_PUNTSK MOV A,#'.' ACALL LCD_char ADD_PUNTSK: POP B POP ACC RET ;******************** ;** GETAL = -GETAL ** ;******************** ;;CONV_NEG: ;; PUSH 0 ;; PUSH 1 ;; PUSH 2 ;; PUSH ACC ;; MOV R0,#GETAL ;; MOV R1,#BEWAAR ;; ACALL COPYRtoR ; COPY GETAL -> BEWAAR ;; ;; MOV R2,#4 ;; MOV A,#0 ;;CONV_NEGLP: ;; MOV @R0,A ; GETAL = 0 ;; INC R0 ;; DJNZ R2,CONV_NEGLP ;; ;; MOV R0,#GETAL+3 ;; MOV R1,#BEWAAR+3 ; GETAL = GETAL - BEWAAR ;; MOV R2,#4 ; 0 = 0 - BEWAAR ;; CLR C ; IMMERS 2-CPL ;;CO_ERAF_LP: ;; MOV A,@R0 ;; SUBB A,@R1 ;; MOV @R0,A ;; DEC R0 ;; DEC R1 ;; DJNZ R2,CO_ERAF_LP ;; POP ACC ;; POP 2 ;; POP 1 ;; POP 0 ;; RET ;************** ERBIJ ************** ;* FREQ := FREQ + RASTER * ;*********************************** ERBIJ: PUSH 0 PUSH 1 PUSH 2 PUSH ACC MOV R0,#FREQ+3 MOV R1,#RASTER+3 MOV R2,#4 CLR C ERBIJ_LP: MOV A,@R0 ADDC A,@R1 MOV @R0,A DEC R0 DEC R1 DJNZ R2,ERBIJ_LP POP ACC POP 2 POP 1 POP 0 RET ;************** ERAF ************** ;* FREQ := FREQ - RASTER * ;********************************** ERAF: PUSH 0 PUSH 1 PUSH 2 PUSH ACC MOV R0,#FREQ+3 MOV R1,#RASTER+3 MOV R2,#4 CLR C ERAF_LP: MOV A,@R0 SUBB A,@R1 MOV @R0,A DEC R0 DEC R1 DJNZ R2,ERAF_LP POP ACC POP 2 POP 1 POP 0 RET REEKS DW 15258,51712 DW 1525,57600 DW 152,38528 DW 15,16960 DW 1,34464 DW 0,10000 DUIZEND DW 0,1000 DW 0,100 DW 0,10 DW 0,1 ;****************************************************************************** ;** ** ;** I2C-BUS CONTROLLER V1.00 by PE1MTH ** ;** Theo Gosselink JR. ** ;** ** ;** Last update : 17-10-1999 ** ;** ** ;****************************************************************************** ;** ** ;** P1_6 -> SCL ** ;** P1_7 -> SDA ** ;** ** ;** ** ;** ** ;** ** ;** ** ;** ** ;****************************************************************************** ;>>>>> SCL = 96H -> P1.6 ;>>>>> SDA = 97H -> P1.7 SCL: EQU P1.6 SDA: EQU P1.7 ;>>>>> PCF8574 = 8 BIT I/O EXTENDER (PIO) ;>>>>> PCF8573 = CLOCK CALENDER PCF8574: EQU 20H XR24C02: EQU 50H TSA5511: EQU 61H I2C_START: CLR SCL SETB SDA JB SDA,I2C_STRT_1 SJMP I2C_START I2C_STRT_1: SETB SCL JNB SCL,I2C_STRT_1 ; IF SCL ACTIVE THEN MULTI-MASTER ACTIVE NOP CLR SDA NOP CLR SCL RET I2C_STOP: CLR SDA NOP NOP SETB SCL NOP NOP SETB SDA RET ;******************************************** ;** ** ;** I2C_ADRES ** ;** ** ;** A = 0 : WRITE , A = 1 : READ ** ;** R0 -> ADRES ** ;** ** ;** RETOUR : ** ;** C <- ACK 0 = ACK 1 = NO ACK ** ;******************************************** I2C_ADRES: PUSH 1 PUSH A MOV A,R0 POP 0 ACALL I2C_START MOV R1,#8 RL A ORL A,#1 CJNE R0,#0,I2C_ADRES1 ANL A,#0FEH I2C_ADRES1: RLC A SETB SDA JC I2C_ADRES2 CLR SDA I2C_ADRES2: ACALL I2C_CLOCK DJNZ R1,I2C_ADRES1 SETB SDA NOP NOP CLR C JNB SDA,I2C_ADRES3 SETB C ; ACALL I2C_ACK I2C_ADRES3: ACALL I2C_CLOCK POP 1 RET I2C_CLOCK: NOP SETB SCL NOP CLR SCL NOP RET ;******************************************** ;** ** ;** I2C_SEND ** ;** ** ;** R0 -> DATA ** ;** C <- ACK ** ;** ** ;******************************************** I2C_SEND: PUSH 1 MOV A,R0 MOV R1,#8 I2C_SEND1: RLC A SETB SDA JC I2C_SEND2 CLR SDA I2C_SEND2: ACALL I2C_CLOCK DJNZ R1,I2C_SEND1 SETB SDA NOP CLR C JNB SDA,I2C_SEND3 SETB C ; ACALL I2C_ACK I2C_SEND3: ACALL I2C_CLOCK POP 1 RET ;******************************************** ;** ** ;** I2C_READ ** ;** ** ;** A -> ACK 0 = ACK 1 = NO ACK ** ;** R0 <- DATA ** ;** ** ;******************************************** I2C_READ: PUSH 1 PUSH A CLR SCL NOP SETB SDA NOP MOV R1,#8 I2C_READ1: SETB SCL NOP CLR C JNB SDA,I2C_READ2 SETB C I2C_READ2: RLC A CLR SCL NOP DJNZ R1,I2C_READ1 MOV R0,A POP A CJNE A,#0,I2C_READ3 ;** SEND ACK ! ** CLR SDA I2C_READ3: NOP SETB SCL POP 1 RET ;******************************************** ;** ** ;** I2C_ACK ** ;** ** ;** A -> ACK 0 = ACK 1 = NO ACK ** ;** ** ;** IF NO ACK THEN PRINT ERROR... ** ;** ** ;******************************************** I2C_ACK: RET ;******************************************** ;** ** ;** I2C_INIT ** ;** ** ;******************************************** I2C_INIT: ACALL I2C_START ACALL I2C_STOP ; SETUP I2C_BUS VERKEER (EERSTE KEER) MOV R0,#XR24C02 MOV A,#0 ; WRITE MODE ACALL I2C_ADRES MOV EEPROM,#0 JNC ?I2C_INIT MOV EEPROM,#1 ?I2C_INIT ACALL I2C_STOP MOV R0,#TSA5511 MOV A,#0 ; WRITE MODE ACALL I2C_ADRES JC ?I2C_INIT2 ; JNC ?I2C_INIT2 MOV DPTR,#NOTSA5511TEXT ACALL LCD_line ACALL I2C_STOP DEAD SJMP DEAD ?I2C_INIT2 ACALL I2C_STOP RET *-------------------------------------- * TSA5511 write Interface routines *-------------------------------------- * * Write data to synth: synthwrite * Input R1 (MSB) R2 (LSB) freq * synthwrite PUSH 0 MOV R0,#TSA5511 MOV A,#0 ; WRITE MODE ACALL I2C_ADRES ; Start transfer JNC ?SYNTHWR1 ; NO ACK (Chip NIET gevonden) POP 0 RET ?SYNTHWR1 PUSH 1 ; Get HIGH data POP 0 ACALL I2C_SEND ; Write to chip PUSH 2 POP 0 ; Get LOW data ACALL I2C_SEND ; Write to chip MOV R0,#8EH ; Get CTRL1 data ACALL I2C_SEND ; Write to chip MOV R0,#00H ; Get CTRL2 data ACALL I2C_SEND ; Write to chip ACALL I2C_STOP POP 0 RET *-------------------------------------- * X2404/X2416 EEPROM Interface routines *-------------------------------------- * * Write data to EEPROM: eewrite * Input R0 = ADRESS * Input A = DATA * eewrite ; R0 -> Adress PUSH A MOV A,EEPROM ; Lees aanwezigheids status uit. CJNE A,#1,?eewritesk POP A RET ?eewritesk POP A PUSH 0 PUSH A PUSH 0 PUSH 1 MOV R1,#0 ; Even geduld indien ie nog druk is... ?eewrite1 MOV R0,#XR24C02 MOV A,#0 ; WRITE MODE ACALL I2C_ADRES JNC ?eewrite2 DJNZ R1,?eewrite1 ?eewrite2 MOV R1,#0 MOV R2,#1 ACALL Delay POP 1 POP 0 ACALL I2C_SEND ; Write to chip (MEMORY ADRES) POP 0 ACALL I2C_SEND ; Write to chip (DATA) ACALL I2C_STOP POP 0 RET * * Read data from EEPROM: eeread * Input R0 -> ADRES * Output A eeread PUSH 0 PUSH 0 PUSH 1 MOV R1,#0 ; Even geduld indien ie nog druk is... ?eeread1 MOV R0,#XR24C02 MOV A,#0 ; WRITE MODE ACALL I2C_ADRES JNC ?eeread2 DJNZ R1,?eeread1 ?eeread2 POP 1 POP 0 ACALL I2C_SEND ; Write to chip (MEMORY ADRES) NOP NOP NOP NOP NOP MOV R0,#XR24C02 MOV A,#1 ; READ MODE ACALL I2C_ADRES MOV A,#1 ; NO ACK ACALL I2C_READ MOV A,R0 POP 0 ACALL I2C_STOP RET ************************************************** * readchannel * Read channel * ************************************************** readchannel ; Check eerst even of er een EEPROM is. PUSH 0 PUSH 1 PUSH A MOV A,EEPROM CJNE A,#0,?readchannel2 MOV A,CHANNEL ADDC A,BANDSW ?readchannel1 ; * 4 vermenigvuldigen RL A RL A MOV R0,A MOV R1,#FREQ ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A ?readchannel2 POP A POP 1 POP 0 RET ************************************************** * readoffset * Read Offset for 10 GHz. * * ************************************************** readoffset PUSH 0 PUSH 1 PUSH A MOV R0,#(CMAXCHANNELS*2-1)*4 MOV R1,#OFFSET ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A INC R0 INC R1 ACALL eeread MOV @R1,A POP A POP 1 POP 0 RET ************************************************** * writechannel * Write Channel * ************************************************** writechannel PUSH 0 PUSH 1 MOV R1,#FREQ ; * 4 vermenigvuldigen PUSH A MOV A,CHANNEL ADDC A,BANDSW ?writechannel1 RL A RL A MOV R0,A MOV A,[R1] ACALL eewrite INC R1 INC R0 MOV A,[R1] ACALL eewrite INC R1 INC R0 MOV A,[R1] ACALL eewrite INC R1 INC R0 MOV A,[R1] ACALL eewrite POP A POP 1 POP 0 RET Text1 STR '23/13/3cm TX 1.0' DB 0 TEXT23CM STR ' 23' DB 0 TEXT13CM STR ' 13' DB 0 TEXT3CM STR ' 3' DB 0 TEXTCM STR ' cm. Transmit' DB 0 NOEEPROMTEXT STR 'XR24C02?' DB 0 NOTSA5511TEXT STR 'TSA5511?' DB 0 Offset10GHZ DW 138,56032 ; 9050.000 KHz SMALLSTEP DW 0,250 MEDIUMSTEP DW 0,2000 LARGESTEP DW 0,10000 ORG $0008 FREQ DS 4 GETAL DS 4 BEWAAR DS 4 BEWAAR2 DS 4 RASTER DS 4 RASTERTEMP DS 4 OFFSET DS 4 FLAG: DS 1 ; OOK DOOR ANDERE ROUTINES TE GEBRUIKEN... PUNT: DS 1 ; " BLANKS: DS 1 ; " XPOS DS 1 YPOS DS 1 EEPROM DS 1 ; EPROM Aanwezig? KEYCOUNT DS 1 ; Teller voor keyboard delay bepaling MEMLOCK DS 1 ; Teller (vertraging) waarna het systeem gaat schrijven MODE DS 1 ; Bepaald in welke modes het systeem zich bevindt. CHANNEL DS 1 ; Geheugen kanaal BANDSW DS 1 ; 23/13 of 3 cm keuze SW2313 DS 1 ; 23 of 13 cm keuze ?stk EQU * ; End of allocated memory