* * Ex5.asm ---- Example program 5 for the Ep2711E9 Rev.C board * (c)2003, EVBplus.com, Written by Wayne Chu * * Function: User can adjust the trimmer pot VR1 to vary the voltage on * the PE7 of the ADC and to change brightness of the 7 segment * LED display * * ORG $c4 *** Vector jump table for BUFFALO monitor *** JSCI RMB 3 JSPI RMB 3 JPAIE RMB 3 JPAO RMB 3 JTOF RMB 3 JTOC5 RMB 3 JTOC4 RMB 3 JTOC3 RMB 3 JTOC2 RMB 3 JTOC1 RMB 3 JTIC3 RMB 3 JTIC2 RMB 3 JTIC1 RMB 3 JRTI RMB 3 JIRQ RMB 3 JXIRQ RMB 3 JSWI RMB 3 JILLOP RMB 3 JCOP RMB 3 JCLM RMB 3 * * * The 68HC11 control register address is the offset address from the * register base address $1000, so index addressing mode can also be used, * otherwise only extended addressing mode can be used. * MULTI_MODE equ $10 SINGLE_MODE equ 0 SCAN_MODE equ $20 NO_SCAN_MODE equ 0 CHANNEL_NUM: equ 7 ; reading input from PE7 * * DB6 equ $40 NOTDB6 equ $BF portb: equ 4 portd: equ 8 ddrd: equ 9 toc2: equ $18 tctl1: equ $20 tmsk1: equ $22 tflg1: equ $23 tmsk2: equ $24 adctl: equ $30 adr1: equ $31 adr2: equ $32 adr3: equ $33 adr4: equ $34 option: equ $39 REGBLK: equ $1000 TB5MS: equ 10000 ; time base of 10,000 instruction cycles * ; = 10,000 x 0.5us = 5ms at 8MHz org $00 * select: rmb 1 d5ms_flag: rmb 1 disp_data: rmb 4 disptn: rmb 4 adctl_image: rmb 1 brtness: rmb 1 turn_led_on: rmb 1 STACK: equ $8FFF * org $FFA0 ; Buffalo I/O routines upcase: rmb 3 wchek: rmb 3 dchek: rmb 3 init_sci: rmb 3 input: rmb 3 output: rmb 3 outlhlf: rmb 3 outrhlf: rmb 3 outa: rmb 3 out1byt: rmb 3 out1bsp: rmb 3 out2bsp: rmb 3 outcrlf: rmb 3 outstrg: rmb 3 outstrg0: rmb 3 inchar: rmb 3 * org $D000 ; user program starts at $D000 jmp start * Binary number: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F * Converted to segment code: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F * * Binary number: $10,$11,$12,$13,$14,$15,$16,$17 * Converted to segment code: G H h J L n o o * * Binary number: $18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$20 * Converted to segment code: P r t U u y _ -- Blank * segm: fcb $3f,$06,$5b,$4f,$66,$6d,$7d,$07 ;0-7 fcb $7f,$6f,$77,$7c,$39,$5e,$79,$71 ;8-$0f fcb $3d,$76,$74,$1e,$38,$54,$63,$5c ;10-17 * G, H, h, J L n o o fcb $73,$50,$78,$3e,$1c,$6e,$08,$40 ;18-1f * P, r, t, U, u Y - - fcb $00,$01,$48,$41,$09,$49 ;20-23 * blk, -, =, =, =, = * seven_segment: pshx pshb ldx #segm psha anda #$3f tab abx ldaa 0,x ; get segment pulb andb #$80 ; add DP aba pulb pulx rts * * this routine will read adc input on the pin pe0 and store 4 consecutive * readings at adr1-adr4. (single channel) * * adc_conv: adda #SINGLE_MODE+NO_SCAN_MODE * * if you want to read multi-channel input, change above statement to * adda #MULTI_MODE+NO_SCAN_MODE * staa adctl_image ldx #REGBLK jsr conv rts * conv: ldaa adctl_image ; clear ccf flag before testing it staa adctl,x not_ready: brclr adctl,x $80 not_ready rts start: lds #STACK ldx #REGBLK * ldaa #11111111b ldaa #$ff staa portd,x * ldaa #11111100b ; 0 =input, 1 = output ldaa #$fc staa ddrd,x * ldx #REGBLK ldaa #DB6 staa tmsk1,x bset option,x $80 ; enable adc operation cli * begin: ldaa #CHANNEL_NUM ; set channel number before calling jsr adc_conv ldaa adr1+REGBLK staa brtness * ldab #1 stab disp_data incb stab disp_data+1 incb stab disp_data+2 incb stab disp_data+3 ldx #disp_data jsr move ldaa #1 staa turn_led_on ; turn_on_led jsr sel_digit ldaa brtness ; was read from adc beq turn_off ; if =0, turn off display * ; otherwise keep on until a=0 back: iny ; make each loop=31 cycles = 15.5us dey ; 15.5 us x256 = 4ms iny ; leaves 1 ms for other task dey iny dey nop deca bne back turn_off: clr turn_led_on dec select jsr sel_digit * wait: tst d5ms_flag beq wait clr d5ms_flag jmp begin * * * this routine moves 4 bytes of data into display * pattern and converts the pattern to seven segment code. * @ enter, x points the source address * move: ldy #disptn mnext: ldaa 0,x jsr seven_segment ; convert Accu A to segment pattern, bit 7= DP staa 0,y inx iny cpy #disptn+4 bne mnext rts * * multiplexing display one digit at a time * sel_digit: ldx #REGBLK inc select ldab select andb #3 tstb beq digit3 decb beq digit2 decb beq digit1 * digit0: ldaa disptn+3 staa portb,x tst turn_led_on bne dig0_on clr portb,x dig0_on: bclr portd,x 4 bset portd,x 8 bset portd,x $10 bset portd,x $20 rts * digit1: ldaa disptn+2 staa portb,x tst turn_led_on bne dig1_on clr portb,x dig1_on: bset portd,x 4 bclr portd,x 8 bset portd,x $10 bset portd,x $20 rts * digit2: ldaa disptn+1 staa portb,x tst turn_led_on bne dig2_on clr portb,x dig2_on: bset portd,x 4 bset portd,x 8 bclr portd,x $10 bset portd,x $20 rts * digit3: ldaa disptn staa portb,x tst turn_led_on bne dig3_on clr portb,x dig3_on: bset portd,x 4 bset portd,x 8 bset portd,x $10 bclr portd,x $20 rts tmr6oc2: ldx #REGBLK * in an interrupt servicing routine the x register will be saved automatically * the rti instruction will pop the x register off stack. inc d5ms_flag ldd #TB5MS ; reload the count for 5 ms time base addd toc2,x std toc2,x bclr tflg1,x NOTDB6 rti * org JTOC2 ; BUFFALO RAM vector for OC2 jmp tmr6oc2 ; jmp to OC2 service routine end