;******************************************** ; Function: delay ; Input: unsigned char ; output: void ; description: Preforms a variable delay ;******************************************** seg CODE global _initialize: ; unsigned char delay(unsigned char); ;******************************************************************** ; ; Author : ADI - Apps www.analog.com/MicroConverter ; ; Date : APRIL 2006 ; ; File : HYPERTENSION.asm ; ; Hardware : ADuC841 ; ; Description : HYPERTENSION SYSTEM. ; Rate calculations assume an 11.0592MHz. ; ;******************************************************************** ;$MOD841 ; Use 8052&ADuC841 predefined symbols ; THESE ARE LCD DEFINITIONS ;IRSLCD EQU P3.1 ;IRSLCD IS JUST TIED HIGH NOW ALL THE TIME ;ALSO WANT TO USE P3.2 FOR CS1LCD TO FREE UP P3.3 FOR SPI C86LCD EQU P2.2 CS1LCD EQU P3.2 RESLCD EQU P2.4 A0LCD EQu P2.5 WRLCD EQU p2.6 RDLCD EQU P2.7 ORG 0000h TEMP2 DATA 03CH OFFSETL DATA 03DH OFFSETH DATA 03EH ;GAIN DATA 03FH GAIN DATA 001H LOWDAC DATA 040H HIGHDAC DATA 041H COUNT DATA 042H TEMP DATA 043H TEMP1 DATA 044H SAVELOW DATA 045H SAVEHI DATA 046H ;LCD Registers Follow CMD EQU 001H DATALCD EQU 0FFH CS1_BIT EQU 010H A0_BIT EQU 004H WR_BIT EQU 002H RD_BIT EQU 001H RES_BIT EQU 008H C86_BIT EQU 020H BUS_RELEASE EQU 0F8H DISPLAY_ON EQU 0AFH DISPLAY_OFF EQU 0AEH ADC_NORMAL EQU 0A0H ADC_REVERSE EQU 0A1H DISPLAY_NORMAL EQU 0A6H DISPLAY_REVERSE EQU 0A7H ALL_POINTS_ON EQU 0A6H LCD_BIAS_1_9 EQU 0A2H LCD_BIAS_1_7 EQU 0A3H READ_MODIFY_WR EQU 0E0H ENDLCD EQU 0EEH RESET_DISPLAY EQU 0E2H COMMON_NORMAL EQU 0C0H COMMON_REVERSE EQU 0C8H POWER_SET EQU 02AH BOOSTER_CIRCUIT EQU 004H VOLTAGE_REG EQU 002H VOLTAGE_FOL EQU 001H V5_RATIO EQU 025H ELE_VOL_SET EQU 081H ELE_VOL_INIT EQU 020H ;MOV NUMBER_OF_COL, #080H ;MOV NUMBER_OF_ROWS, #040H ;MOV NUMBER_OF_PAGES, #008H ;MOV FIRST_PAGE, #000H ;MOV FIRST_COLUMN, #000H ;MOV LAST_PAGE, #007H ;MOV LAST_COLUMN, #0EFH NUMBER_OF_COL EQU 080H NUMBER_OF_ROWS EQU 040H NUMBER_OF_PAGES EQU 008H FIRST_PAGE EQU 000H FIRST_COLUMN EQU 000H LAST_PAGE EQU 007H LAST_COLUMN EQU 0EFH START_LINE_SET DATA 047H PAGE_ADD_SET DATA 048H COLUMN_ADD_HIGH DATA 049H COLUMN_ADD_LOW DATA 04AH TEMPLCD DATA 04BH TEMPLCD1 DATA 04CH SAMPLE0_63 DATA 04DH PAGE DATA 04EH BCD DATA 04FH HDATAL DATA 050H HDATAH DATA 051H FLAG BIT 052H FLAG1 BIT 053H SAVELOWDAC DATA 054H SAVEHIGHDAC DATA 055H OLDTEMP DATA 056H OLDTEMP1 DATA 057H SAVELOWDAC1 DATA 058H SAVEHIGHDAC1 DATA 059H COUNT1 DATA 05AH TEMPH DATA 05BH TEMPL DATA 05CH TH1SAVE DATA 05DH TL1SAVE DATA 03BH WORD1H DATA 05EH WORD1L DATA 05FH WORD2H DATA 060H WORD2L DATA 061H WORD3H DATA 062H WORD3L DATA 063H WORD4H DATA 064H WORD4L DATA 065H PRESSUREH DATA 066H PRESSUREL DATA 067H TEMPERATUREH DATA 068H TEMPERATUREL DATA 069H OUTPUT DATA 06AH HOUR1 DATA 06BH oldtemph DATA 06CH FREQH1 DATA 06DH FREQH2 DATA 06EH FREQL1 DATA 06FH FREQL2 DATA 070H ADDCOUNT DATA 071H AVERAGE DATA 072H ;CANNOT DO ANYTHING HERE OVER 07FH ;END OF LCD REGISTER VALUES ;____________________________________________________________________ ; BEGINNING OF CODE ;CSEG ORG 0003h JMP BEGIN ; jump to main program ORG 0000BH LCALL FREQ ;jmp begin RETI ;THIS IS TIMER 0 INTERRUPT SERVICE ROUTINE. ;ORG 0001BH ;lcall A_1 ;COUNTER 1 INTERRUPT SERVICE ROUTINE. This is working ; reti ;ORG 01000h BEGIN: ;------------------------------------------------------- clr p1.0 ;sets it as a digital input ;------Fine, but must remove OP-AMP, R and C to let high speed pulses get to P1.0 mov pllcon, #057h ;slowest possible speed LCALL BP ; MOV SP, #5FFFH MOV addcount, #005h MOV DPCON, #014H ;JUST TESTING TO SEE IF YOU NEED THIS, AUTOMATICALLY INCREMENTS DATA POINTER MOV PLLCON, #000H ;FASTEST CLOCK, 16.777216MHZ, SHOULD NOT BE SET TO ZERO FOR A 3 VOLT PART MOV ADCCON1,#0B0H ;mov hour, #011h ;mov min, #014h ;mov sec, #000h mov timecon, #051h MOV DACCON,#01Fh ; DAC0 on, 12bit, asynchronous MOV DAC0H,#008h MOV DAC0L,#000h ; DAC0 to mid-scale ANL CFG841, #0FEH ; CLEARS CFG841.0, THIS ASSIGNS EXTERNAL MEMORY STARTING AT 0000H ANL CFG841, #07FH ; CLEARS CFG841.7, THIS ASSIGNS LOWER 256 BYTES TO DATA AND STACK ; CLR CFG841.7 ; THIS ASSIGNS LOWER 256 BYTES TO DATA AND STACK ; ORL CFG841, #01h ; ENABLE INTERNAL 2K MEMORY IF NOT COMMENTED OUT ; MOV ADCCON1,#09Ch ; power up ADC, ADC Clock = Mclk/4 7.2us conv+acq time MOV ADCCON2,#1 ; select channel to convert ; mov econ, #06h ;erase all data flash ; mov eadrh, #0 ;set page address pointer ; mov eadrl, #03h ; mov econ, #1 ;read page into edata1-4 ; mov edata2, #0f3h ;overwrite byte 2 ; mov econ, #5 ;erase page ; mov econ, #2 ;write page MOV T3CON,#86h ;THIS WAS COPIED FROM A DEMO PROGRAM MOV T3FD,#08h ;AND IT SETS UP FOR 9600 BAUD MOV SCON,#52h MOV DAC0H, #00FH ;GET READY TO CALIBRATE FOR FREQUENCY MOV DAC0L, #0FFH MOV oldtemp, #011H ;WILL DECREMENT COUNT ON EACH INTERRUPT MOV TL0, #000H MOV TH0, #000H MOV TL1, #000H MOV TH1, #000H ;---------------------------------------for T2-------------- mov TH2, #000h MOV TL2, #000h ;----------------------------------------------------------- ;MOV R4, #07FH ;WILL STORE FREQUENCYS HERE AND DOWN ; LAUNCH CONTINUOUS CONVERSIONS... ;---------THIS INITIALIZES COUNTER 1 (NOT TIMER 1) AND TIMER 0 (NOT COUNTER 0)----------------- SETB EA ;ALL INTERRUPTS ALLOWED (CAN REMOVE THIS STATEMENT) ;SETB ET1 ;ENABLE INTERVAL COUNTER 1 INTERRUPTS CLR ET1 SETB ET0 ;ENABLE INTERVAL COUNTER 0 INTERRUPTS SETB TR1 ;TURN ON TIMER/COUNTER 1 SETB TR0 ;TURN ON TIMER/COUNTER 0 ;---------Support for T2----------------------------------------- SETB CNT2 ;USE COUNTER 2 and NOT TIMER 2 SETB TR2 ;TURN ON TIMER/COUNTER 2 clr exen2 ;---------------------------------------------------------------- ;MOV TMOD, #0D9H ;DOES THE FOLLOWING 4 FUNCTIONS ;ENABLES THE TIMER/COUNTER WHEN TR1 CONTROL BIT IS HIGH AND INT1NOT IS HIGH ;SELECTS THE COUNTER 1 AND NOT THE TIMER 1 ;16 BIT COUNTER OPERATION ON COUNTER 1 ;SELECTS TIMER 0 AND NOT COUNTER 0 ;ENABLES THE TIMER/COUNTER WHEN TR0 CONTROL BIT IS HIGH AND INT0NOT IS HIGH MOV TMOD, #051H ;USE THIS INSTEAD OF 0D9H OR YOU WILL GET FUNNY FREQUENCY READINGS ;----------------------------------------------------------------------------------------------- ;MOV F0L, #000H ;MOV F0H, #000H ;MOV DPTR, #0005EH ;GET READY TO STORE FREQ CAL COEFFICIENTS IN ISR mov dptr, #03000h ;3000h is high byte of highest frequency, 1201 is low byte of highest frequency, etc. ;jmp begin1 UP1: MOV A, oldtemp ;OLDTEMP STARTS AT 17, WILL WASTE ONE INTERATION TO GET RID OF TRANSIENTS CJNE A, #0FeH, UP1 ;IF OLDTEMP OVERFLOWED THEN QUIT LOOP begin1: ;WILL LOOP TO GIVE INTERRUPTS A CHANCE TO CALIBRATE FREQUENCY CLR ET1 ;DISENABLE INTERVAL COUNTER 1 INTERRUPTS, DON'T NEED THIS STUFF ANYMORE CLR ET0 ;DISENABLE INTERVAL COUNTER 0 INTERRUPTS CLR TR1 ;TURN OFF COUNTER 1 CLR TR0 ;TURN OFF TIMER 0 CLR CCONV ;MAKE SURE A/D IS IN SINGLE CONVERSION MODE LCALL SEND_FREQ ;SEND FREQUENCY CALIBRATION DATA TO THE VISUAL BASIC PROGRAM LCALL SEND_BP ;SEND THE BAROMETRIC PRESSURE LCALL LOAD_INIT ;ASSIGN CONSTANTS TO LCD MEMORY LOCATIONS LCALL INIT_DISPLAY LCALL INITIAL_ADD ;INITIALIZE LCD ADDRESS COLUMNS LCALL CLEAR_DISP MOV LOWDAC, #000H ;LOWDAC AND HIGHDAC COUNT DOWN FROM THEIR MAXIMUM VALUES MOV HIGHDAC, #000H ;TO GENERATE A RAMP THAT GOES TO THE VCO MOV COUNT, #00FH ;WANT TO COUNT 16 RAMPS FOR VCO TO STABILIZE MOV DPTR, #0100H ;POINTS TO STATIC EXTERNAL RAM CLR P1.7 ;THIS SETS PORT 1.7 UP AS A DIGITAL INPUT MOV OFFSETL, #000H MOV OFFSETH, #000H ;MOV GAIN, #008H LCALL STARTUP ;DO 255 RAMPS TO GET VCO STABILIZED LCALL LOOPCAL ;DO ONE MORE RAMP TO GENERATE CALIBRATION VALUES lcall clear_disp1 ;lcall ov3 MOV PAGE, #000h MOV A, COLUMN_ADD_HIGH MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD LCALL BLANK LCALL BLANK LCALL BLANK ;LCALL BLANK ;LCALL BLANK ;LCALL BLANK LCALL C_1 LCALL A_1 LCALL R_1 LCALL D_1 LCALL I_1 LCALL O_1 LCALL M_1 LCALL E_1 LCALL M_1 LCALL S_1 MOV A, COLUMN_ADD_HIGH MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD MOV PAGE, #001H lcall blank lcall blank lcall blank lcall blank lcall blank lcall blank lcall blank lcall blank lcall blank lcall M_1 lcall H_1 lcall Z_1 lcall Blank lcall blank lcall blank ; LCALL S_1 ; LCALL Y_1 ; LCALL S_1 ; LCALL BLANK ; LCALL one_1 ; LCALL two_1 ; LCALL three_1 ; lcall four_1 ; lcall five_1 ; lcall six_1 ; lcall seven_1 ; lcall eight_1 ; lcall nine_1 ; MOV A, COLUMN_ADD_HIGH ; MOV TEMPLCD, A ; LCALL WRITE_CMD ; MOV A, COLUMN_ADD_LOW ; MOV TEMPLCD, A ; LCALL WRITE_CMD ; MOV PAGE, #006H ; LCALL D_1 ; LCALL I_1 ; LCALL A_1 global _loop1: LOOP1: NOP ;THIS IS THE MAIN LOOP, LOOP1 IS ENTERED ONCE EVERY 4096 A/D SAMPLES CLR FLAG1 CPL FLAG ;WRITE S11 FOR ONE CYCLE, THEN WRITE PEAK ;-------------------------------------------------------------------------------- ;The next two lines should not be necessary. ;But the LCD just quites after awhile and needs to be initialized all over again lcall load_init ;Why is this necessary? Why does LCD quite after awhile lcall init_display ;Why continued ;-------------------------------------------------------------------------------- MOV SAVEHIGHDAC1, SAVEHIGHDAC MOV SAVELOWDAC1, SAVELOWDAC mov a, savehighdac anl a, #00fh orl a, #010h ;use high nibble to indicate first byte MOV SBUF,A JNB TI,$ ;WAIT TIL PRESENT CHAR IS GONE CLR TI ;START WITH SENDING A 0 TO SYNC mov a, savelowdac swap a anl a, #00fh orl a, #020h ;second byte contains next 4 bits of dac mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI ; must clear TI mov a, savelowdac anl a, #00fh orl a, #030h ;third byte coming mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI MOV A, #040h ;forth byte JB P3.4, OVER23 ;IF NOTLOCKED, DON'T STUFF A 1 INTO BIT 4 OF THE HIGH BYTE 0XH ORL A, #00fH ;BUT A 1 INTO 01001111 TO INDICATE NOT LOCKED over23: MOV SBUF,A JNB TI,$ ; wait til present char gone CLR TI ; must clear TI mov a, hdatah anl a, #00fh orl a, #050h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, hdatal swap a anl a, #00fh orl a, #060h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, hdatal anl a, #00fh orl a, #070h mov sbuf, a jnb TI, $ clr TI ;--------------------------------------------------------------------------------------- MOV PAGE, #007H ;GET READY TO WRITE TIME ON PAGE 7 OF LCD MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN add a, #000h ;REPLACE 0 WITH COLUMN NUMBER IF YOU DON'T WANT FIRST COLUMN MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD LCALL T_1 ;WRITE T LCALL I_1 ;WRITE I lcall m_1 ;WRITE M lcall e_1 ;WRITE E LCALL BLANK ;FOLLOWED BY A BLANK ON PAGE 3 OF LCD MOV TEMPH, #000h MOV TEMPL, hour ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV A, temp1 ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE swap a ANL A, #00FH LCALL PRINT MOV A, temp1 ANL A, #00FH lcall print lcall colon MOV TEMPH, #000h MOV TEMPL, min ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV A, temp1 ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE swap a ANL A, #00FH LCALL PRINT MOV A, temp1 ANL A, #00FH lcall print lcall colon MOV TEMPH, #000h MOV TEMPL, sec ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV A, temp1 ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE swap a ANL A, #00FH LCALL PRINT MOV A, temp1 ANL A, #00FH lcall print lcall blank ;--------------------------------------------------------------------------------------- LCALL LOCK ;TURN ON RED LED ON P3.4 IF IT IS LOCKED TO A SENSOR MOV PAGE, #002H ;GET READY TO WRITE SS ON PAGE 5 OF LCD MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD LCALL S_1 ;WRITE S LCALL S_1 ;WRITE SECOND S LCALL BLANK ;FOLLOWED BY A BLANK ON PAGE 3 OF LCD MOV A, HDATAL ;SUBTRACT THE OFFSET FROM HDATAH AND HDATAL, WANT IT TO START NEAR ZERO SUBB A, #07Fh MOV HDATAL, A MOV A, HDATAH SUBB A, #000H ;ADJUST THE CARRY ON HDATAH IF NECESSARY MOV HDATAH, A ;END OF SUBTRACTING #07F FROM HDATAL AND HDATAH CLR C ;DIVIDE HDATAH AND HDATAL BY 2 MOV A, HDATAH ;CLEAR THE CARRY FIRST RRC A ;DIVIDE A BY 2 WITH 0 IN THE CARRY BIT MOV HDATAH, A ;STORE NEW VALUE OF HDATAH THAT IS DIVIDED BY 2 MOV A, HDATAL ;MOVE HDATAL INTO ACCUMULATOR RRC A ;DIVIDE HDATAL BY 2 BUT ROTATE IN CARRY BIT IF CARRY IS SET FROM PREVIOUS ROTATION MOV HDATAL, A ;STORE NEW VALUE OF HDATAL THAT IS DIVIDED BY 2 MOV HDATAH, #000H ;I THINK THAT HDATAH IS ZERO ANYWAY SO LETS MAKE SURE MOV A, HDATAL SUBB A, #064H ;SUBTRACT 100 FOR A JC OVERNEXT ;IF A LESS THAN 101 THEN SKIP NEXT INSTRUCTIONS MOV HDATAL, #064H ;IF MORE THAN 100, CAP SIGNAL STRENGTH AT 100 % OVERNEXT: ;MOV HDATAH, F0H ;THESE TWO LINES ARE TO TEST THE FREQUENCY COUNTER ;MOV HDATAL, F0L ;DELETE THESE TWO LINES WHEN DONE MOV TEMPH, HDATAH MOV TEMPL, HDATAL ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV HDATAH, TEMP MOV HDATAL, TEMP1 ;HDATAH AND HDATAL ARE NOW BCD CORRECTED ;MOV A, TEMP2 ; ;ANL A, #00FH ; ;LCALL PRINT ; ;MOV A, HDATAH ;THESE NEXT FOUR LINES ARE FOR DISPLAYING MSBYTE OF FREQ ;SWAP A ;AND CAN BE DELETED WHEN WE REVERT BACK TO DISPLAYING SS ;ANL A, #00FH ; ;LCALL PRINT ; MOV A, HDATAH ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE ANL A, #00FH LCALL PRINT MOV A, HDATAL SWAP A ANL A, #00FH LCALL PRINT ;DISPLAY NEXT HIGHEST DECIMAL ADJUSTED NIBBLE MOV A, HDATAL ANL A, #00FH LCALL PRINT ;DISPLAY LOWEST DECIMAL ADJUSTED NIBBLE LCALL PERCENT ;SIGNAL STRENGTH IS PERCENT SO DISPLAY PERCENT SIGN AFTER IT LCALL BLANK ;NOT ALL CHARACTERS ARE THE SAME WIDTH SO END WITH A BLANK ;-------------------------print freq------------------------------------------------------------------- MOV PAGE, #001H ;GET READY TO WRITE SS ON PAGE 5 OF LCD MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD LCALL F_1 ;WRITE S LCALL R_1 ;WRITE SECOND S LCALL BLANK ;MOV HDATAH, F0H ;THESE TWO LINES ARE TO TEST THE FREQUENCY COUNTER ;mOV HDATAL, F0L ;DELETE THESE TWO LINES WHEN DONE mov hdatah, WORD1H ;temporarily added these two lines and deleted mov hdatal, WORD1L ;the following four lines May 13, 2007 ; mov dptr, #03000h ;movx a, @dptr ;mov hdatah, a ;movx a, @dptr ;mov hdatal, a MOV TEMPH, HDATAH MOV TEMPL, HDATAL ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV HDATAH, TEMP MOV HDATAL, TEMP1 ;HDATAH AND HDATAL ARE NOW BCD CORRECTED MOV A, TEMP2 ; ANL A, #00FH ; LCALL PRINT ; MOV A, HDATAH ;THESE NEXT FOUR LINES ARE FOR DISPLAYING MSBYTE OF FREQ SWAP A ;AND CAN BE DELETED WHEN WE REVERT BACK TO DISPLAYING SS ANL A, #00FH ; LCALL PRINT ; MOV A, HDATAH ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE ANL A, #00FH LCALL PRINT lcall PER_1 MOV A, HDATAL SWAP A ANL A, #00FH LCALL PRINT ;DISPLAY NEXT HIGHEST DECIMAL ADJUSTED NIBBLE MOV A, HDATAL ANL A, #00FH LCALL PRINT ;DISPLAY LOWEST DECIMAL ADJUSTED NIBBLE lcall Blank ;---------------------------------------------------------------------------------------- OVER11: MOV HDATAH, #000H MOV HDATAL, #000H MOV OLDTEMP, #000H MOV OLDTEMP1, #000H ;JB P3.4, OVER10 ;IF NOT LOCKED, LET US NOT INCREMENT COUNTER TO RESET DISPLAY ;INC COUNT1 ;WANT TO CLEAR LCD DISPLAY EVERY 128 TIMES ;MOV A, COUNT1 ;ANL A, #07FH ;CJNE A, #07FH, OVER10 ;LCALL CLEAR_DISP OVER10: MOV TEMP1, SAVELOWDAC ;TO DISPLAY PULSATILE WAVEFORM ON THE LCD MOV TEMP, SAVEHIGHDAC ;ALL 12 BITS, MSB 4 BITS ARE IN SAVEHIGHDAC LCALL BCDLCD ;LCD ROUTINES MESSING UP STATIC MEMORY BECAUSE SAME PORT WRITES BOTH OVER: MOV LOWDAC, #000H ;LOWDAC AND HIGHDAC COUNT DOWN FROM THEIR MAXIMUM VALUES MOV HIGHDAC, #000H ;TO GENERATE A RAMP THAT GOES TO THE VCO MOV DPTR, #0100H ;POINTS TO STATIC EXTERNAL RAM ; MOV DAC0L, #000H ; MOV DAC0H, #000H LOOP2: ;CLR C ;THESE LINES DECREMENT LOWDAC AND HIGHDAC MOV A, LOWDAC ;CLEAR CARRY BIT BECAUSE YOU WILL DO A SUBTRACTION OVER 2 BYTES ; MOV A, DAC0L SUBB A, #001H ;DECREMENT BY 1 BUT SET THE CARRY/BORROW BIT IF NECESSARY MOV LOWDAC, A ; MOV DAC0L, A MOV A, HIGHDAC ; MOV A, DAC0H SUBB A, #000H ;IF LOWDAC UNDERFLOWED, THEN MUST USE BORROW TO SUBTRACT FROM HIGHDAC ANL A, #00FH ;YOU ALWAYS WANT THE MSB BITS OF HIGHDAC TO BE ZERO MOV HIGHDAC, A ; MOV DAC0H, A MOVX A, @DPTR ;MOVE THE CALIBRATION VALUES FOR THIS RAMP VALUE TO SAVELOW AND SAVEHI MOV SAVEHI, A ; INC DPTR MOVX A, @DPTR MOV SAVELOW, A ; INC DPTR ;NEXT: MOV DAC0H, HIGHDAC ;OUTPUT HIGHDAC FIRST, THEN LOWDAC, THIS IS THE 4096 POINT RAMP, 2.5 TO 0 VOLTS DC MOV DAC0L, LOWDAC ;BOTH LOW AND HIGH ARE UPDATED WITH THIS SINGLE COMMAND ; MOV TEMP1, ADCDATAL ;THIS IS TOO SOON, HIGHDAC AND LOWDAC DID NOT GET TO THE VCO BY THE TIME ; MOV TEMP, ADCDATAH ;THAT THE A/D REGISTERS WERE SAMPLED MOV A, ADCDATAL CLR C SUBB A, #07FH ;MAKE A/D A LITTLE LOWER BECAUSE IT IS TO BE SUBTRACTED FROM CAL VALUES MOV TEMP1, A MOV A, ADCDATAH SUBB A, #000H ;SUBTRACT THE BORROW IF THERE IS ONE MOV TEMP, A ;----------COde for averaging two samples together----program does not mess up-probably slows down ; clr c ;clear carry ; mov a, temp1 ;get adcdatal value; ; addc a, oldtemp1 ;add old adcdatal value with carry ; mov temp1, a ;move result back to temp Low ; mov a, temp ;get adcdatah value ; addc a, oldtemph ;add old adcdatah value with carry from adcdatal addition ; mov temp, a ;move result back to temp high ; clr c ;clear carry ; rrc a ;divide temp high by 2 ; mov temp, a ;move result back to temp high ; mov a, temp1 ;move temp low to a ; rrc a ;divide temp low by 2 with carry ; mov temp1, a ;move result back to temp low ; ; mov oldtemp1, temp1 ;store for later averaging over two cycles ; mov oldtemph, temp ;------------------------------------------------------------------------------------------ CLR C ;CLEAR CARRY BECAUSE YOU DON'T WANT TO SUBTRACT WITH CARRY MOV A, SAVELOW ;THIS GROUP OF CODE CALIBRATES THE A/D SAMPLE SUBB A, TEMP1 MOV TEMP1, A MOV A, SAVEHI SUBB A, TEMP ;NOW THIS SUBTRACTION IS WITH CARRY MOV TEMP, A ;TEMP NOW CONTAINS THE 4 BITS FOR THE CALIBRATED HIGH A/D VALUE ; MOV DAC1H, SAVEHI ;MOVE 12 BIT ADC TO 12 BIT DAC1 OUTPUT ;; MOV DAC1L, SAVELOW ;BCDLCD CAN MODIFY TEMP AND TEMP1 NOW OVER8: ;--------------------------------------------------------------------------------------------- ;THIS SECTION LOOKS FOR THE PEAK IN THE SCAN OF 4096 POINTS AND SAVES THE PEAK IN HIGHDATAH AND HIGHDATAL JNB FLAG1, OVER5 ;IF FLAG1 IS NOT SET, THEN HAVE NOT DONE 64 VCO STEPS YET, SO SKIP CLR C ;CLEAR THE CARRY (BORROW) MOV A, HDATAL ;WILL COMPARE HIGHDATAL WITH CALIBRATED A/D VALUE SUBB A,TEMP1 ;SUBTRACT LOWER 8 BITS, WILL SET BORROW IF NECESSARY MOV A, HDATAH ;NOW DO THE REMAINING 4 HIGHER BITS SUBB A, TEMP ;SUBTRACT THE UPPER 4 BITS JNC OVER5 ;IF CARRY (BORROW) IS STILL SET, THEN TEMP AND TEMP1 IS LOWERER THAN HIGHDATA MOV HDATAL, TEMP1 ;OTHERWISE STORE NEW HIGH VALUE MOV HDATAH, TEMP ; MOV SAVELOWDAC, LOWDAC ;THIS SAVES THE PULSATILE VOLTAGE ; MOV SAVEHIGHDAC, HIGHDAC mov SAVELOWDAC, DAC0L ;THIS SAVES THE PULSATILE VOLTAGE mov SAVEHIGHDAC, DAC0H ;---------------------------------------------------------------------------------------------- OVER5: JB P1.7, OVER12 MOV DAC1H, TEMP ;MOVE 12 BIT ADC TO 12 BIT DAC1 OUTPUT MOV DAC1L, TEMP1 ;BCDLCD CAN MODIFY TEMP AND TEMP1 NOW JMP OVER14 OVER12: MOV DAC1H, SAVEHIGHDAC1 MOV DAC1L, SAVELOWDAC1 OVER14: MOV A, LOWDAC ANL A, #02FH JNZ CONT SETB FLAG1 ;FLAG1 IS SET AFTER FIRST 64 VCO STEPS TO AVOID TRANSIENTS ;JB FLAG, CONT ;ONLY WANT TO ERASE LCD EVERY OTHER LOOP THRU 4096 VCO STEPS ;LCALL BCDLCD ;ONLY WANT TO UPDATE LCD EVER OTHER 32 SWEEPS CONT: SETB SCONV ; innitiate single ADC conversion MOV A, HIGHDAC ;RESET EVERYTHING IF HIGHDAC AND LOWDAC ARE BOTH 0 JNZ LOOP6 MOV A, LOWDAC JNZ LOOP6 ret LOOP4: JMP LOOP1 LOOP6: JMP LOOP2 STARTUP: NOP DEC COUNT ;DO IT 255 TIMES TO BEGIN WITH MOV HIGHDAC, #000H MOV LOWDAC, #000H LOOP61: CLR C MOV A, LOWDAC SUBB A, #001H MOV LOWDAC, A MOV A, HIGHDAC ANL A, #00FH SUBB A, #000H MOV HIGHDAC, A SKIP2: MOV DAC0H, HIGHDAC ;OUTPUT HIGHDAC FIRST, THEN LOWDAC MOV DAC0L, LOWDAC ;BOTH LOW AND HIGH ARE UPDATED WITH THIS SINGLE COMMAND CLR C MOV A, HIGHDAC ;RESET EVERYTHING IF HIGHDAC AND LOWDAC ARE BOTH 0 JNZ LOOP61 MOV A, LOWDAC JNZ LOOP61 CLR C MOV A, COUNT ;IF COUNT IS ZERO, WE WANT TO STORE THE CALIBRATION VALUES JNZ STARTUP ;OTHERWISE LOOP RET LOOPCAL: NOP MOV LOWDAC, #000H ;LOWDAC AND HIGHDAC COUNT DOWN FROM THEIR MAXIMUM VALUES MOV HIGHDAC, #000H ;TO GENERATE A RAMP THAT GOES TO THE VCO MOV DPTR, #0100H ;POINTS TO STATIC RAM IN1: SETB SCONV ;INITIATE SINGLE ADC CONVERSION JNB ADCI,$ ;WAIT FOR A/D CONVERSION TO COMPLETE CLR ADCI CLR C MOV A, LOWDAC SUBB A, #001H MOV LOWDAC, A MOV A, HIGHDAC SUBB A, #000H ANL A, #00FH ;YOU ALWAYS WANT THE MSB BITS OF HIGHDAC TO BE ZERO MOV HIGHDAC, A ;YOU MISS THE FIRST POINT TO CALIBRATE BY DECREMENTING DAC COUNTER FIRST IN2: MOV DAC0H, HIGHDAC ;OUTPUT HIGHDAC FIRST, THEN LOWDAC MOV DAC0L, LOWDAC ;BOTH LOW AND HIGH ARE UPDATED WITH THIS SINGLE COMMAND MOV OLDTEMP1, ADCDATAH MOV OLDTEMP, ADCDATAL ;mov oldtemp1, #000h ;remove these two statements to get loopcal to work again ;mov oldtemp, #000h MOV A, OLDTEMP1 MOVX @DPTR, A ;STORE HIGH ADC DATA FIRST ; INC DPTR ;THEN STORE LOW ADC DATA MOV A, OLDTEMP MOVX @DPTR, A ;NOW TO ADC LOW DATA ; INC DPTR MOV A, HIGHDAC JNZ IN1 ;IF HIGHDAC IS DECREMENTED TO ZERO, WE ARE DONE MOV A, LOWDAC ;BOTH HIGHDAC AND LOWDAC MUST BE ZERO TO QUIT JNZ IN1 RET LOAD_INIT: MOV START_LINE_SET, #040H MOV PAGE_ADD_SET, #0B0H MOV COLUMN_ADD_HIGH, #010H MOV COLUMN_ADD_LOW, #004H SETB RDLCD SETB WRLCD CLR CS1LCD SETB RESLCD ;SET LCD RESET LINE HIGH (INACTIVE) ;SETB IRSLCD ;SET IRS HIGH FOR USING INTERNAL RESISTOR IN LCD CLR C86LCD ;SET C86 HIGH FOR USING 8080 MODE RET INIT_DISPLAY: CLR RESLCD ;RESET LCD DISPLAY LCALL DELAYLCD ;MUST HAVE A DELAY HERE, CPU WITH PLLCON = 000H IS TOO FAST SETB RESLCD ;LCD IS NOW RESET MOV A, #RESET_DISPLAY MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #ADC_NORMAL MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #LCD_BIAS_1_9 MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #ADC_REVERSE MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #COMMON_NORMAL MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #V5_RATIO MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #ELE_VOL_SET MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #ELE_VOL_INIT MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #POWER_SET ORL A, #VOLTAGE_REG ORL A, #VOLTAGE_FOL ORL A, #BOOSTER_CIRCUIT MOV TEMPLCD, A LCALL WRITE_CMD MOV A, #DISPLAY_ON MOV TEMPLCD, A LCALL WRITE_CMD RET WRITE_DATA: CLR CS1LCD ;MAKE LCD CHIP SELECT ACTIVE (LOW) SETB A0LCD ;SET A0 HIGH FOR LCD DATA MOV P0, TEMPLCD ;GET READY TO SEND DISPLAY MODE TO LCD CLR WRLCD ;WRITE TO PORT 2, LCD DATA PORT SETB WRLCD ;DRIVE WRNOT LINE LOW TO HIGH FOR LCD SETB CS1LCD ;MAKE LCD CHIP SELECT INACTIVE (HIGH) RET WRITE_CMD: CLR CS1LCD ;MAKE LCD CHIP SELECT ACTIVE (LOW) CLR A0LCD ;SET A0 LOW FOR LCD COMMAND MOV P0, TEMPLCD ;WRITE TO PORT 3, LCD DATA PORT CLR WRLCD ;DRIVE WRNOT LINE LOW TO WRITE SETB WRLCD ;DRIVE WRNOT LINE HIGH SETB CS1LCD ;MAKE LCD CHIP SELECT INACTIVE (HIGH) RET INITIAL_ADD: MOV A, START_LINE_SET MOV TEMPLCD, A LCALL WRITE_CMD INI1: MOV A, PAGE_ADD_SET MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_HIGH MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD RET ;THIS ROUTINE CLEARS THE LCD BY WRITING 0 BITS TO EVERY PIXEL CLEAR_DISP: MOV A, #0B0H ;VALUE OF PAGE_ADDRESS_SET MAY HAVE CHANGED MOV PAGE_ADD_SET, A ; MOV COUNT, #008H LP: LCALL INITIAL_ADD LCALL WRITE80 INC PAGE_ADD_SET CLR C MOV A, COUNT SUBB A, #001H ;SETS ZERO FLAG MOV COUNT, A ;THIS DECREMENTS COUNT JNZ LP MOV A, #0B0H MOV PAGE_ADD_SET, A LCALL INITIAL_ADD RET CLEAR_DISP1: MOV A, #0B3H ;VALUE OF PAGE_ADDRESS_SET MAY HAVE CHANGED MOV PAGE_ADD_SET, A ;This routine clears pages 4,5,6 to prepare for graphing MOV COUNT, #004H LPx: LCALL INITIAL_ADD ;lcall write80 mov temp1, #090h mov temp, #000h ;----------------------This code draws the top and bottom line of the graphical box mov a, count cjne a, #004H, ov1 mov temp, #001h ov1: cjne a, #001H, ov2 mov temp, #080H ;----------------------------------------------------- ov2: lcall back1 INC PAGE_ADD_SET CLR C MOV A, COUNT SUBB A, #001H ;SETS ZERO FLAG MOV COUNT, A ;THIS DECREMENTS COUNT JNZ LPx ov3: LCALL INITIAL_ADD mov temp, #0fFH MOV PAGE, #003h lcall lcd2 lcall INITIAL_ADD mov temp, #0fFH MOV PAGE, #004H lcall lcd2 lcall INITIAL_ADD mov temp, #0fFH MOV PAGE, #005h lcall lcd2 lcall INITIAL_ADD MOV PAGE,#006h mov temp, #0fFH lcall lcd2 MOV COLUMN_ADD_HIGH, #018h MOV COLUMN_ADD_LOW, #003h LCALL INITIAL_ADD mov temp, #0fFH MOV PAGE, #003h lcall lcd2 lcall INITIAL_ADD mov temp, #0fFH MOV PAGE, #004H lcall lcd2 lcall INITIAL_ADD mov temp, #0fFH MOV PAGE, #005h lcall lcd2 lcall INITIAL_ADD MOV PAGE,#006h mov temp, #0fFH lcall lcd2 MOV COLUMN_ADD_HIGH, #010h MOV COLUMN_ADD_LOW, #000h RET WRITE80: MOV TEMP, #000H ;TEMPORARILY CHANGED FROM 00H TO 05H TO TRY TO GET SOMETHING ON THE DISPLAY MOV TEMP1, #080H ;was #080, but new LCD seems to have an extra 16, or so, columns BACK1: CLR CS1LCD SETB A0LCD MOV P0, TEMP CLR WRLCD SETB WRLCD SETB CS1LCD CLR C MOV A, TEMP1 SUBB A, #001H MOV TEMP1, A JNZ BACK1 RET ;THIS DELAY IS NECESSARY IN RESETTING THE LCD DELAYLCD: MOV A, #00FH CLR C BR1: SUBB A, #001H JNZ BR1 RET ;------------------------NONE OF THIS STUFF IS USED BECAUSE IT DRAWS A GRAPH ON THE LCD WHICH IS NO LONGER REQUIRED BCDLCD: NOP JNB P3.4, OVER22 ;IF NOT LOCKED, LET US NOT DISPLAY GARBAGE RET OVER22: ;-----------------This increments to the next column address inc addcount mov a, addcount swap a anl a, #00FH orl a, #010H ;MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN MOV TEMPLCD, A LCALL WRITE_CMD mov a, addcount anl a, #00FH ;MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD ;------------------------------------------------------------ ; MOV A, TEMP1 ;MOVE CALIBRATED LOW ADC VALUE TO ACCUMULATOR ; MOV TEMPLCD, A ;SAVE LOW ADC VALUE FOR ROUNDING OPERATION ; ANL A, #0F0H ; MOV TEMP1, A ;MASKED OFF LOWER FOUR BITS ; MOV A, TEMP ;MOVE CALIBRATED HIGH ADC VALUE TO ACCUMULATOR ; ANL A, #00FH ;GET ONLY LOWER FOUR BITS ; ORL A, TEMP1 ;MSB AND LSB NIBBLES ARE REVERSED ; SWAP A ;GET THE NIBBLES CORRECT ; MOV TEMP, A ;TEMP NOW CONTAINS THE MSB 8 BITS OF THE A/D CONVERSION ; MOV A, TEMPLCD ;IF LOWER 4 BITS OR 12 BIT CONVERSION ARE GREATER THAN 1/2 ; ANL A, #008H ;CHECK TO SEE IF GREATER THAN 1/2 OF THE EQUAVILANT OF A 9TH BIT ; JZ NEXT2 ;IF NOT GREATER THAN 1/2 THEN SKIP ; MOV A, TEMP ;BUT IF GREATER THAN 1/2, THEN ADD 1 TO ROUND UP ; ADD A, #001H ;STORE A BACK INTO TEMP ; MOV TEMP, A ;ROUNDING IS NECESSARY OR LCD LINE IS BUMPY NEXT2: ;MOVE 8 MSB TO TEMP, HIGH NIBBLE OF TEMP1 WILL CONTAIN THE 4 LSB, LOW NIBBLE OF TEMP1 WILL HAVE ZEROES MOV A, TEMP1 ;LOW ADC CLR C RLC A ;CIRCULAR ROTATE LEFT THROUGH CARRY MOV TEMP1, A ;TEMP IS MULTIPLIED BY 2 MOV A, TEMP ;HIGH ADC RLC A ;MULTIPLY BY 2 AND MOVE CARRY INTO LSB MOV TEMP, A MOV A, TEMP1 ;LOW ADC CLR C RLC A ; MOV TEMP1, A ;TEMP IS MULTIPLIED BY 2 MOV A, TEMP ;HIGH ADC RLC A ;MULTIPLY BY 2 AND MOVE CARRY INTO LSB MOV TEMP, A MOV A, TEMP1 ;LOW ADC CLR C RLC A ; MOV TEMP1, A ;TEMP IS MULTIPLIED BY 2 MOV A, TEMP ;HIGH ADC RLC A ;MULTIPLY BY 2 AND MOVE CARRY INTO LSB MOV TEMP, A MOV A, TEMP1 ;LOW ADC CLR C RLC A ; MOV TEMP1, A ;TEMP IS MULTIPLIED BY 2 MOV A, TEMP ;HIGH ADC RLC A ;MULTIPLY BY 2 AND MOVE CARRY INTO LSB MOV TEMP, A ;TEMP NOW CONTAINS MSB 8 BITS, HIGH NIBBLE OF TEMP1 CONTAINS THE LSB 4 BITS ;ACCUMULATE THE AVERAGE OVER 128 lcd POINTS, AVERAGE WILL BE MULTIPLIED BY 2 LATER. clr c MOV A, TEMP adDC A, OFFSETL MOV OFFSETL, A MOV A, offseth ADDC a, #000h mov OFFSETh, A ;accumulating 128 samples in offseth, average = 2*offseth ;---------------------------------------------------------------- mov a, temp ; (temp-average)*4 + average subb a, average clr c rlc a clr c rlc a ;clr c ; rlc a ;addc a, #0C0H addc a, average mov temp, a ;---------------------------------------------------------------- ;NOW MULTIPLY THE NUMBER BY GAIN ;MOV B, GAIN ;MOV A, TEMP1 ;LOW ADC ;MUL AB ;MOV TEMP1, A ;TEMP1 GETS THE LOW 8 BIT RESULT ;MOV TEMP2, B ;TEMP2 GETS THE HIGH 8 BIT RESULT ;MOV B, GAIN ;MOV A, TEMP ;HIGH ADC ;MUL AB ;ADD A, TEMP2 ;LOW 8 BIT RESULT IS IN A, ADD TO IT THE HIGH 8 BITS FROM THE PREVIOUS MULTIPLICATION ;MOV TEMP, A ;TEMP GETS THE LOW 8 BIT RESULT, NEED TO SCALE SO HIGH 8 BIT RESULT IS ALWAYS ZERO ;--------------------------------------------------------------- MOV A, TEMP ; MOV A, AVERAGE ;REPLACE TEMP WITH AVERAGE TEMPORARILY TO SEE IF IT IS WORKING CLR C RRC A CLR C RRC A CLR C RRC A ANL A, #01FH MOV SAMPLE0_63, A CLR C RRC A CLR C RRC A CLR C RRC A ;Divide by 2 one more time to address pages 0 - 3 ; CPL A ;NOW MAKE PAGE 7 TO BE PAGE 0, PAGE 6 TO BE PAGE 1, ETC. ; ANL A, #007H ;TO GET DISPLAY RIGHT SIDE UP ADD A, #003H ;Add 3 to A to access only pages 3 to 6 MOV PAGE, A ;THIS IS THE PAGE TO WRITE TO MOV A, SAMPLE0_63 ANL A, #007H LCALL CONVERT MOV BCD, A MOV A, PAGE ANL A, #007H CLR C ADD A, #0B0H ; MOV A, #0B2H MOV TEMPLCD, A ;THIS SETS THE PAGE LCALL WRITE_CMD ;------------This code exits so that top and bottom lines of the box are not erased by graph mov temp, #000h mov a, page cjne a, #003h, tj1 mov temp, #001h tj1: cjne a, #006h, tj2 mov temp, #080h tj2: MOV A, BCD orl a, temp ; MOV A, #001H ;---------------------------------------------------------------------------------------- MOV TEMPLCD, A ;ALWAYS WRITE TO TEMPLCD BEFORE CALLING A LCD ROUTINE TO WRITE LCALL WRITE_DATA ;-----------------------------CLEAR PAGES 3-6 AFTER 128 WRITES------------------- mov a, addcount clr c subb a, #080H jnz overn lcall clear_disp1 ;------------------------------------------------------------------------------ mov a, offseth clr c rlc a Mov average, a ;average now contains the average of 128 LCD points ;------------------------------------------------------------------------------ mov offsetl, #000H mov offseth, #000H mov addcount, #005H ;MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN MOV TEMPLCD, A LCALL WRITE_CMD mov a, addcount anl a, #00FH ;MOV A, COLUMN_ADD_LOW MOV TEMPLCD, A LCALL WRITE_CMD overn: RET CONVERT: CJNE A, #007H, SIX ;THESE ARE ALL REVERSED BECAUSE THE PAGES HAVE BEEN REVERSED MOV A, #080H RET SIX: CJNE A, #006H, FIVE MOV A, #040H RET FIVE: CJNE A, #005H, FOUR MOV A, #020H RET FOUR: CJNE A, #004H, THREE MOV A, #010H RET THREE: CJNE A, #003H, TWO MOV A, #008H RET TWO: CJNE A, #002H, ONE MOV A, #004H RET ONE: CJNE A, #001H, ZERO MOV A, #002H RET ZERO: MOV A, #001H RET DELAY: ; delay 10ms X A MOV A, #001H MOV R5,A DLY2: MOV R7,#090h DLY1: MOV R6,#00Fh DJNZ R6,$ DJNZ R7,DLY1 DJNZ R5,DLY2 RET ;-------------------------------------------------END OF NOT USED STUFF-------------------------------------- LOCK: CLR C MOV A, HDATAL ;HDATA SHOULD BE APPROXIMATELY 00h 7Fh WITH NO SIGNAL BECAUSE WE HAVE ADDED 7Fh TO IT SUBB A, #08fH ;WILL SUBTRACT A NUMBER A LITTLE BIT BIGGER THAN 007Fh MOV A, HDATAH SUBB A, #000H ;DETERMINE IF THE BORROW IS SET OR NOT JC LIGHTNOT ;IF BORROW IS SET, THEN SENSOR DID NOT PUSH SIGNAL ABOVE 08FH CLR P3.4 ;TURN RED LED ON RET LIGHTNOT: SETB P3.4 ;TURN RED LED OFF RET ;THIS WRITES 8 BITS TO A VERTICLE LINE CORRESPONDING TO A PAGE. COLUMN MUST BE SET IN ADVANCE AND WILL AUTOINCREMENT LCD2: MOV A, PAGE CLR C ADD A, #0B0H MOV TEMPLCD, A ;THIS SETS THE PAGE LCALL WRITE_CMD MOV A, TEMP MOV TEMPLCD, A ;ALWAYS WRITE TO TEMPLCD BEFORE CALLING A LCD ROUTINE TO WRITE LCALL WRITE_DATA RET ;THE FOLLOWING IS A COLLECTION OF FONTS, COLUMN AND PAGE MUST BE SET IN ADVANCE, COLUMN AUTOINCREMENTS AFTER EACH WRITE A_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07EH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #011H LCALL LCD2 MOV TEMP, #011H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07EH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET B_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #03AH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET C_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #03EH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #041H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET D_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #03EH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET E_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #049H LCALL LCD2 MOV TEMP, #049H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET F_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #005H LCALL LCD2 MOV TEMP, #005H LCALL LCD2 MOV TEMP, #005H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET G_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #03EH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #079H LCALL LCD2 MOV TEMP, #079H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET H_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #008H LCALL LCD2 MOV TEMP, #008H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET I_1: MOV TEMP, #000H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET l_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #040H LCALL LCD2 MOV TEMP, #040H LCALL LCD2 MOV TEMP, #040H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET M_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07EH LCALL LCD2 MOV TEMP, #00CH LCALL LCD2 MOV TEMP, #018H LCALL LCD2 MOV TEMP, #00CH LCALL LCD2 MOV TEMP, #07EH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET O_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #03EH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #03EH LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET R_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #031H LCALL LCD2 MOV TEMP, #031H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #04EH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET P_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #031H LCALL LCD2 MOV TEMP, #031H LCALL LCD2 MOV TEMP, #03FH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET S_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #046H LCALL LCD2 MOV TEMP, #04FH LCALL LCD2 MOV TEMP, #079H LCALL LCD2 MOV TEMP, #061H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET T_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #001H LCALL LCD2 MOV TEMP, #001H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #001H LCALL LCD2 MOV TEMP, #001H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET Y_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #003H LCALL LCD2 MOV TEMP, #007H LCALL LCD2 MOV TEMP, #07CH LCALL LCD2 MOV TEMP, #07CH LCALL LCD2 MOV TEMP, #007H LCALL LCD2 MOV TEMP, #003H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET Z_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #071H LCALL LCD2 MOV TEMP, #079H LCALL LCD2 MOV TEMP, #05DH LCALL LCD2 MOV TEMP, #04FH LCALL LCD2 MOV TEMP, #047H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET PER_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #040H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET BLANK: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET one_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #002H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #000H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 RET two_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #071H LCALL LCD2 MOV TEMP, #079H LCALL LCD2 MOV TEMP, #049H LCALL LCD2 MOV TEMP, #04FH LCALL LCD2 MOV TEMP, #046H ;LCALL LCD2 ;MOV TEMP, #000H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET three_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #041H LCALL LCD2 MOV TEMP, #049H LCALL LCD2 MOV TEMP, #049H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #036H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET four_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #018H LCALL LCD2 MOV TEMP, #014H LCALL LCD2 MOV TEMP, #012H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07fH LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET five_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #047H LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #07dH LCALL LCD2 MOV TEMP, #038H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET six_1: mov temp, #000h LCALL LCD2 MOV TEMP, #03eH LCALL LCD2 MOV TEMP, #07fH LCALL LCD2 MOV TEMP, #045H LCALL LCD2 MOV TEMP, #07dH LCALL LCD2 MOV TEMP, #038H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET seven_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #001H LCALL LCD2 MOV TEMP, #071H LCALL LCD2 MOV TEMP, #07dH LCALL LCD2 MOV TEMP, #00fH LCALL LCD2 MOV TEMP, #003H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET eight_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #036H LCALL LCD2 MOV TEMP, #07fH LCALL LCD2 MOV TEMP, #049H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #036H LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET nine_1: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #00eH LCALL LCD2 MOV TEMP, #01fH LCALL LCD2 MOV TEMP, #011H LCALL LCD2 MOV TEMP, #07FH LCALL LCD2 MOV TEMP, #07eH LCALL LCD2 ;MOV TEMP, #000H ;LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET PERCENT: MOV TEMP, #000H LCALL LCD2 MOV TEMP, #026H LCALL LCD2 MOV TEMP, #015H LCALL LCD2 MOV TEMP, #00BH LCALL LCD2 MOV TEMP, #034H LCALL LCD2 MOV TEMP, #02AH LCALL LCD2 MOV TEMP, #019H LCALL LCD2 MOV TEMP, #000H LCALL LCD2 RET COLON: mov temp, #066h lcall lcd2 mov temp, #066h lcall lcd2 ret ;THIS ROUTINE DISPLAY ON THE LCD THE NUMBER CONTAINS IN THE LOWER NIBBLE OF A, ;UPPER NIBBLE OF A MUST BE MASKED OFF BEFORE ENTERING THIS ROUTINE ;PAGE MUST BE SET AND STARTING COLUMN MUST BE SET BEFORE ENTERING THIS ROUTINE ;STARTING COLUMN ON THIS LCD WITH S6B0724 CONTROLLER IS 4, NOT O PRINT: CJNE A, #000H, X1 LCALL o_1 RET X1: CJNE A, #001H, X2 LCALL ONE_1 RET X2: CJNE A, #002H, X3 LCALL TWO_1 RET X3: CJNE A, #003H, X4 LCALL THREE_1 RET X4: CJNE A, #004H, X5 LCALL FOUR_1 RET X5: CJNE A, #005H, X6 LCALL FIVE_1 RET X6: CJNE A, #006H, X7 LCALL SIX_1 RET X7: CJNE A, #007H, X8 LCALL SEVEN_1 RET X8: CJNE A, #008H, X9 LCALL EIGHT_1 RET X9: CJNE A, #009H, X10 LCALL NINE_1 RET X10: RET ;THIS ROUTINE CONVERTS A 12 BIT NUMBER TO BCD ;HDATAH CONTAINS 0000XXXX WHICH REPRESENTS THE MSB 4 BITS ;HDATAL CONTAINS XXXXXXXX WHICH REPRESENT THE FOLLOWING 8 BITS ;BCD CORRECTED HIGH BYTE IS RETURNED IN TEMP ;BCD CORRECTED LOW BYTE IS RETURNED IN TEMP1 BCDX: MOV TEMP, #000H MOV TEMP1, #000H MOV TEMP2, #000H MOV A, TEMPH ANL A, #080H JZ SKIP1H MOV A, TEMP1 ADD A, #068H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #027H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #003H DA A MOV TEMP2, A SKIP1H: MOV A, TEMPH ANL A, #040H JZ SKIP1J MOV A, TEMP1 ADD A, #084H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #063H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #001H DA A MOV TEMP2, A SKIP1J: MOV A, TEMPH ANL A, #020H JZ SKIP1K MOV A, TEMP1 ADD A, #092H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #081H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP1K: MOV A, TEMPH ANL A, #010H JZ SKIP1L MOV A, TEMP1 ADD A, #096H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #040H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP1L: MOV A, TEMPH ANL A, #008H JZ SKIP1 MOV A, TEMP1 ADD A, #048H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #020H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP1: MOV A, TEMPH ANL A, #004H JZ SKIP2A MOV A, TEMP1 ADD A, #024H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #010H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP2A: MOV A, TEMPH ANL A, #002H JZ SKIP3 MOV A, TEMP1 ADD A, #012H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #005H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP3: MOV A, TEMPH ANL A, #001H JZ SKIP4 MOV A, TEMP1 ADD A, #056H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #002H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP4: MOV A, TEMPL ANL A, #080H JZ SKIP5 MOV A, TEMP1 ADD A, #028H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #001H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP5: MOV A, TEMPL ANL A, #040H JZ SKIP6 MOV A, TEMP1 ADD A, #064H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP6: MOV A, TEMPL ANL A, #020H JZ SKIP7 MOV A, TEMP1 ADD A, #032H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP7: MOV A, TEMPL ANL A, #010H JZ SKIP8 MOV A, TEMP1 ADD A, #016H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP8: MOV A, TEMPL ANL A, #008H JZ SKIP9 MOV A, TEMP1 ADD A, #008H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP9: MOV A, TEMPL ANL A, #004H JZ SKIP10 MOV A, TEMP1 ADD A, #004H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP10: MOV A, TEMPL ANL A, #002H JZ SKIP11 MOV A, TEMP1 ADD A, #002H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP11: MOV A, TEMPL ANL A, #001H JZ SKIP12 MOV A, TEMP1 ADD A, #001H DA A MOV TEMP1, A MOV A, TEMP ADDC A, #000H DA A MOV TEMP, A MOV A, TEMP2 ADDC A, #000H DA A MOV TEMP2, A SKIP12: RET FREQ: ;CLR ET1 ;DISENABLE INTERVAL COUNTER 1 INTERRUPTS ;CLR ET0 ;DISENABLE INTERVAL COUNTER 0 INTERRUPTS CLR TR1 ;TURN OFF COUNTER 1 CLR TR0 ;TURN OFF TIMER 0 ; MOV TEMPH, TH1 ;MOV TEMPL, TL1 ;subtract 15 counts because timer continues 15 past, until it is turned off ;----------------------T2 Support-------------------------- clr TR2 ; MOV TEMPH, TH1 ;MOV TEMPL, TL1 ;subtract 15 counts because timer continues 15 past, until it is turned off mov temph, th2 mov templ, tl2 ;----------------------------------------------------------- mov th1save, temph mov tl1save, templ CLR C mov a, tempL ;code to multiply by 2 rlc a mov tempL,a mov a, temph rlc a mov temph, a ;CLR C ;MOV A, TEMPL ;SUBB A, #00FH ;MOV TEMPL, A ;MOV A, TEMPH ;SUBB a, #000h ;mov temph, a ;mov tl1, templ ;mov th1, temph MOV A, OLDTEMP CLR C CJNE A, #011H, OVXY SUBB A, #001H MOV OLDTEMP, A MOV DAC0H, #00FH MOV DAC0L, #0FFH JMP NEWDACZ OVXY: mov a, tEMPH movx @dptr, a mov a, tEMPL movx @dptr, a MOV A, oldtemp CLR C SUBB A, #001H MOV oldtemp, A CJNE A, #0FFH, NEWDACX JMP NEWDACY NEWDACX: MOV DAC0H, A MOV DAC0L, #0FFH ;SET DAC UP FOR NEXT VCO FREQUENCY JMP NEWDACZ NEWDACY: MOV DAC0H, #000H MOV DAC0L, #000H NEWDACZ: mov th1, #000h ;reset counter values mov tl1, #000h ;mov th0, #0d4h ;MOV TL0, #0D0H ;IT WILL COUNT UP TO 65536 IN 1 MILLISECOND, WHICH IS FFFFH - D4D0H = 11056 DECIMAL ;mov th0, #0a8h ;mov tl0, #09ah MOV TH0, #028H MOV TL0, #010H ;--------------------------------T2 Support------------------ mov th2, #000h mov tl2, #000h ;------------------------------------------------------------ ;SETB ET1 ;ENABLE INTERVAL COUNTER 1 INTERRUPTS ;SETB ET0 ;ENABLE INTERVAL COUNTER 0 INTERRUPTS SETB TR1 ;TURN ON COUNTER 1 SETB TR0 ;TURN ON TIMER 0 ;----------------------------------T2 Suport----------------------- setb TR2 ;------------------------------------------------------------------ RET SEND_FREQ: mov dptr, #03000h mov oldtemp, #012h up2: dec oldtemp movx a, @dptr mov temph, a movx a, @dptr mov templ, a mov a, temph swap a anl a, #00fh orl a, #080h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI ;lcall delay100 mov a, temph anl a, #00fh orl a, #090h mov sbuf, a jnb ti, $ clr ti ;lcall delay100 mov a, tempL swap a anl a, #00fh orl a, #0a0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI ;lcall delay100 mov a, tempL anl a, #00fh orl a, #0b0h mov sbuf, a jnb ti, $ clr ti ;lcall delay100 mov a, oldtemp cjne a, #000h, up2 mov dptr, #03002h movx a, @dptr mov freqh1, a movx a, @dptr mov freqh2, a mov dptr, #03022h movx a, @dptr mov freql1, a movx a, @dptr mov freql2, a ret BP: MOV SPICON,#033h ;LEADING EDGE OF CLOCK, will reset the barometric pressure unit first MOV OUTPUT, #015H CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #055H CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #040H CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #01DH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #050H CALL SENDSPI jnb ispi, $ ;CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV WORD1H,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV WORD1L,SPIDAT ; send value received by SPI.. call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #01DH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #060H CALL SENDSPI jnb ispi, $ ;CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV WORD2H,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV WORD2L,SPIDAT ; send value received by SPI.. call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #01DH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #090H CALL SENDSPI jnb ispi, $ ;CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV WORD3H,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV WORD3L,SPIDAT ; send value received by SPI.. call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #01DH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #0A0H CALL SENDSPI jnb ispi, $ ;CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV WORD4H,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV WORD4L,SPIDAT ; send value received by SPI.. call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #00FH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #040H CALL SENDSPI jnb ispi, $ CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV PRESSUREH,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV PRESSUREL,SPIDAT ; send value received by SPI.. call delay10 MOV SPICON,#033h ;LEADING EDGE OF CLOCK MOV OUTPUT, #00FH CALL SENDSPI ; trigger SPI send/receive transfer jnb ispi, $ call delay10 MOV OUTPUT, #020H CALL SENDSPI jnb ispi, $ CALL DELAY100 call delay10 MOV SPICON,#037h ;TRAILING EDGE CLOCKS MOV OUTPUT, #000H CALL SENDSPI jnb ispi, $ MOV TEMPERATUREH,SPIDAT ; send value received by SPI.. call delay10 CALL SENDSPI jnb ispi, $ MOV TEMPERATUREL,SPIDAT ; send value received by SPI.. call delay10 RET ;____________________________________________________________________ ; SUBROUTINES SENDSPI: ; sends the value in ACC out the SPI port. also ; receives simultaneously into SPIDAT. SPI interrupt ; is triggered when transfer is complete. ; CLR SS ; must pull slave's SS pin low first MOV SPIDAT,OUTPUT ; trigger data transfer RET ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DELAY100: ; delays approximately 100ms PUSH ACC PUSH B MOV A,#006 ; DLY10: MOV B,#229 ; DJNZ B,$ ; DJNZ ACC,DLY10 ; POP B POP ACC RET DELAY10: ; delays approximately 100ms PUSH ACC PUSH B MOV A,#008 ; DLY20: MOV B,#007 ; DJNZ B,$ ; DJNZ ACC,DLY20 ; POP B POP ACC RET SEND_BP: mov a, WORD1H swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD1H anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD1L swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD1L anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD2H swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD2H anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD2L swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD2L anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD3H SWAP A anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD3H anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD3L swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD3L anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD4H swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD4H anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD4L swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, WORD4L anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, PRESSUREH swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, PRESSUREH anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, PRESSUREL swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, PRESSUREL anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, TEMPERATUREH swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, TEMPERATUREH anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, TEMPERATUREL swap a anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI mov a, TEMPERATUREL anl a, #00fh orl a, #0C0h mov sbuf, a JNB TI,$ ; wait til present char gone CLR TI RET global _bplcd: LCALL INIT_DISPLAY LCALL INITIAL_ADD ;INITIALIZE LCD ADDRESS COLUMNS MOV PAGE, #002H ;GET READY TO WRITE SS ON PAGE 5 OF LCD MOV A, COLUMN_ADD_HIGH ;RESET COLUMN TO FIRST COLUMN mov a, #015h MOV TEMPLCD, A LCALL WRITE_CMD MOV A, COLUMN_ADD_LOW mov a, #0h MOV TEMPLCD, A LCALL WRITE_CMD lcall B_1 lcall P_1 lcall BLANK MOV TEMPH, HDATAH MOV TEMPL, HDATAL ;MOVE HDATA TO TEMP TO GET READY TO CALL BCDX LCALL BCDX ;THIS WILL CONVERT ANY TWO BYTES TO BCD AND STORE CONVERSION IN HDATAH AND HDATAL MOV HDATAH, TEMP MOV HDATAL, TEMP1 ;HDATAH AND HDATAL ARE NOW BCD CORRECTED ;MOV A, TEMP2 ; ;ANL A, #00FH ; ;LCALL PRINT ; ;MOV A, HDATAH ;THESE NEXT FOUR LINES ARE FOR DISPLAYING MSBYTE OF FREQ ;SWAP A ;AND CAN BE DELETED WHEN WE REVERT BACK TO DISPLAYING SS ;ANL A, #00FH ; ;LCALL PRINT ; MOV A, HDATAH ;DISPLAY HIGHEST DECIMAL ADJUSTED NIBBLE ANL A, #00FH LCALL PRINT MOV A, HDATAL SWAP A ANL A, #00FH LCALL PRINT ;DISPLAY NEXT HIGHEST DECIMAL ADJUSTED NIBBLE MOV A, HDATAL ANL A, #00FH LCALL PRINT ;DISPLAY LOWEST DECIMAL ADJUSTED NIBBLE mov a, #000h LCALL INIT_DISPLAY LCALL INITIAL_ADD ;INITIALIZE LCD ADDRESS COLUMNS RET ;__________________________________________________________ global_lcdfreq: ret ;____________________________________________________________________ END end