;THIS PROGRAMME DEVELOPED BY ANOOP MATHEW.M ;FOR MATTIOM TECHNOLOGIES (P) LTD,SNEHAPURAM ;email :anoopmathewmanjaly@yahoo.co.in, www.mattiom.com ;**************************************************** $ nomod51 $ include (89c52.mcu) ;*************************************************** ; LCD EQUALISATION ;*************************************************** lcd_port equ p0 first_line equ 80h second_line equ 0c0h lcd_clear equ 01 ;*************************************************** rs_lcd bit p3.1 en_lcd bit p3.3 back_lite bit p2.7 ;*************************************************** ; HM55 EQUALISATION ;*************************************************** din_hm55 bit p1.0 dout_hm55 bit p1.1 clk_hm55 bit p1.3 en_hm55 bit p1.4 ready_bit bit f0 ;*************************************************** x_data equ 50 ; x_data+1 equ 51 y_data equ 52 ; y_data+1 equ 53 count equ 54 tot_count equ 55 register equ 56 ;*************************************************** ; PROGRAMME INITIALISATION ;*************************************************** INITIALIZE: mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh mov sp,#80h mov x_data,#0 ; MSB mov x_data+1,#0 ; LSB mov y_data,#0 ; MSB mov y_data+1,#0 ; LSB clr rs_lcd clr en_lcd clr ready_bit call lcd_initialize ;*************************************************** ; PROGRAMME FROM HERE ;*************************************************** mov a,#first_line call cmd_write mov dptr,#msg_1 call dis_message mov a,#second_line call cmd_write mov dptr,#msg_2 call dis_message ;*************************************************** mov a,#'.' call data_write call long_delay call long_delay mov a,#'.' call data_write call long_delay call long_delay mov a,#'.' call data_write call long_delay call long_delay mov a,#'.' call data_write call long_delay call long_delay mov a,#'.' call data_write call long_delay call long_delay ;*************************************************** ; PROGRAMME LOOP HERE ;*************************************************** mov a,#lcd_clear call cmd_write call display_values call hm55_reset continue: call hm55_messure call long_delay call hm55_ready jb ready_bit,last call hm55_read call display_values last: jmp continue ;*************************************************** ; DISPLAY VALUES ;*************************************************** DISPLAY_VALUES: mov a,#first_line call cmd_write mov dptr,#msg_3 call dis_message anl x_data,#00000111b anl x_data,#00000111b mov r1,x_data mov r2,x_data+1 call binary2bcd mov a,r4 call bcd2ascii call data_write mov a,r3 call bcd2ascii call data_write ;*************************************************** mov a,#second_line call cmd_write mov dptr,#msg_4 call dis_message mov r1,y_data mov r2,y_data+1 call binary2bcd mov a,r4 call bcd2ascii call data_write mov a,r3 call bcd2ascii call data_write ret ;*************************************************** ; COMPASS FUNCTIONS ;*************************************************** HM55_READ: clr a ;read from hm55 clr c clr en_hm55 setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay mov x_data+1,a ;*************************************************** clr a clr c setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 5 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 6 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 7 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 8 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay mov x_data,a ;*************************************************** clr a clr c setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay mov y_data+1,a ;*************************************************** clr a clr c setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 5 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 6 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 7 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 8 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay mov y_data,a ;*************************************************** setb en_hm55 ret ;*************************************************** HM55_RESET: clr en_hm55 call bit_delay clr din_hm55 setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 call bit_delay setb en_hm55 ret ;*************************************************** HM55_MESSURE: clr en_hm55 call bit_delay setb din_hm55 setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 call bit_delay clr din_hm55 setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 call bit_delay setb en_hm55 ret ;*************************************************** HM55_READY: clr en_hm55 call bit_delay setb din_hm55 setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 call bit_delay clr din_hm55 setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 call bit_delay ;*************************************************** clr a ;read from hm55 clr c setb clk_hm55 ;clock pulse 1 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 2 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 3 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay setb clk_hm55 ;clock pulse 4 call bit_delay clr clk_hm55 mov c,dout_hm55 rlc a call bit_delay cjne a,#00001100b,skip clr ready_bit ret skip: setb ready_bit setb en_hm55 ret ;*************************************************** ; LCD FUNCTIONS ;*************************************************** DATA_WRITE: mov lcd_port,a ; post acc at lcd data input setb rs_lcd ; set rs high (data) call bit_delay setb en_lcd ; receive data byte call bit_delay clr en_lcd ; drop the selection line call delay_msec ret ; return to caller ;*************************************************** CMD_WRITE: mov lcd_port,a ; post acc at lcd data input clr rs_lcd ; set rs low (instruction) call bit_delay setb en_lcd ; receive instruction byte call bit_delay clr en_lcd ; drop the selection line call delay_msec ret ; return to caller ;*************************************************** LCD_INITIALIZE: mov a,#03ch ; lenght(8 bits),2lines,char5x7 call cmd_write; needs 3 times this byte (1st) call delay_msec call cmd_write ; (second) call delay_msec call cmd_write; (third) call delay_msec mov a,#00001100b call cmd_write; call delay_msec mov a,#06h ; move direction & shift display call cmd_write; call delay_msec mov a,#lcd_clear; lcd clear call cmd_write; clear display call delay_msec ret ;*************************************************** DIS_MESSAGE: clr a movc a,@a+dptr ; get byte pointed by dptr inc dptr ; point to the next byte jz dis_msg call data_write; it was data, write it to lcd jmp dis_message dis_msg: ret ;*************************************************** ; DELAY FUNCTIONS ;*************************************************** BIT_DELAY: mov r1,#25 djnz r1,$ ret ;*************************************************** DELAY_MSEC: mov r1,#25 d_mswait: mov r2,#50 djnz r2,$ djnz r1,d_mswait ret ;*************************************************** DELAY_SEC: mov r1,#10 d_swait2: mov r2,#20 d_swait1: mov r3,#40 djnz r3,$ djnz r2,d_swait1 djnz r1,d_swait2 ret ;*************************************************** LONG_DELAY: call delay_sec call delay_sec call delay_sec call delay_sec ret ;*************************************************** ; DATA CONVERTIONS ;*************************************************** BINARY2BCD: mov r5,#0 mov r6,#0 mov r7,#0 mov a,r1 mov b,#10 div ab mov r3,b ; lower byte, in r1, is transformed into 2 decade digits, mov r4,a ; it's ok that the higher one can be greater than 9 mov a,r2 ; higher byte is in r2 jz spring ; spring over if 0 mov b,#10 div ab mov r5,b ; same as for lower byte mov r6,a ; value in r5 is 256 times higher than value standing in r3, r4. mply r5 with 6, ; add to r3, mply r5 with 5, add to r4, mply r5 with 2 and replace itself in r5 mov r0,#05 ; point to r5 call transfer ; transform r5 to 3 lower positions inc r0 ; repeat from r6, now all registers are 1 higher call transfer ; transform r6 to 3 higher positions spring: mov r0,#03 ; point to lowest digit ; adjust to decimal, everything higher than 9 should be, as 1 tenth, added to higher. ; starting from the lowest digit, divide with 10, keep the rest, and add the 1/10th to ; first higher place (eg. 145, leave 5 and add 14 to the next higher) call decadjust ret ;*************************************************** TRANSFER: mov a,@r0 mov b,#6 mul ab dec r0 dec r0 add a,@r0 mov @r0,a inc r0 inc r0 mov a,@r0 mov b,#5 mul ab dec r0 add a,@r0 mov @r0,a inc r0 mov a,@r0 rl a ; mply with 2 mov @r0,a ret ;*************************************************** DECADJUST: mov a,@r0 declop: mov b,#10 div ab mov @r0,b inc r0 add a,@r0 mov @r0,a cjne r0,#7,declop ret ;*************************************************** BCD2ASCII: inc a movc a,@a+pc ret db "0123456789ABCDEF" ;**************************************************** ; MESSAGES ;**************************************************** MSG_1: DB "**INITIALIZING**",0 MSG_2: DB "Please wait",0 MSG_3: DB " X axisN(-S)=",0 MSG_4: DB " Y axisW(-E)=",0 ;*************************************************** ; END OF THE PROGRAMME ;*************************************************** END