;emouse.pic - electronic mouse ;stand-alone 16F84 program to generate mouse data ;joecolquitt@clear.net.nz ; org 211298 ; rev 31.12.98 ; rev 09.01.99 ;Microsoft Mouse, 3 byte data stream ;1200 bps, 7 data bits, 1 stop bit, no parity ;1200 bps = 833.3us / bit = 8333 instruction cycles ;bit 7 6 5 4 3 2 1 0 ; ;Byte 1 0 0 L R Y7 Y6 X7 X6 ;Byte 2 0 0 Y5 Y4 Y3 Y2 Y1 Y0 ;Byte 3 0 0 X5 X4 X3 X2 X1 X0 ; ;X7 = 1 = left X7 = 0 = right ;Y7 = 1 = up Y7 = 0 = down ; L = 1 = left button ; R = 1 = right ; ;Other bits are speed ; ;First 20 movement instructions are for 1 pixel, after that ;4 pixels. Counter is reset when pushbutton is released status equ 03h carry equ status0 zero equ status2 porta equ 05h portb equ 06h mov !OPTION, W trisa equ 85h trisb equ 86h ram equ 0ch lin equ portb0 ;pushbutton for left rin equ portb1 ; right uin equ portb2 ; up din equ portb3 ; down bin equ portb4 ; left button comm equ portb5 ;data to PC start equ 00h w equ 0 ;instruction suffix = w = accumulator f equ 1 ; = f = register orgdata ram data rb ;byte to send bit equ data7 ;bit to send bcnt rb ;bit counter tdc1 rb ;time delay counter move rb ;pixel movement counter pixel rb ;movement rate counter pflags rb ;change movement rate flags lfl equ pflags0 rfl equ pflags1 ufl equ pflags2 dfl equ pflags3 config 0f2h ;10MHz crystal xxxx xx10 ;watchdog timer disabled xxxx x0xx ;power-up timer enabled xxxx 0xxx ;code not protected xxx1 xxxx org start jmp entry entry mov W, #00h ;Porta unused o/p ;*** WARNING: TRIS expanded in two instructions. Check if previous instruction is a skip instruction. ; tris porta mov W, #1fh ;Portb = oooi iiii ;*** WARNING: TRIS expanded in two instructions. Check if previous instruction is a skip instruction. ; tris portb clr Ra ;clear data latches clr Rb mov W, #80h ;Portb pull-ups off mov !OPTION, W setb comm ;idle ;---- main loop main sb lin ;look for direction pushbuttons jmp left sb rin jmp right sb uin jmp up sb din jmp down mov W, #14h ;reset movement counter mov pixel, W clr pflags ;reset rate change flags sb bin ;mouse button jmp button jmp main ;---- data output setups left snb lfl ;if high-rate is set then 4pixel move jmp left4 decsz pixel ;else decrement counter until 0 jmp left1 setb lfl ;then set flag jmp left4 left1 mov W, #9eh ;1001 1110 call send mov W, #20h ;0010 0000 (24) call send mov W, #4fh ;0100 1111 call send mov W, #0f0h ;1111 0000 call send jmp main right snb rfl jmp right4 decsz pixel jmp right1 setb rfl jmp right4 right1 mov W, #0feh ;1111 1110 call send mov W, #2fh ;0010 1111 (2b) call send mov W, #0cfh ;1100 1111 call send mov W, #0f0h ;1111 0000 call send jmp main up snb ufl jmp up4 decsz pixel jmp up1 setb ufl jmp up4 up1 mov W, #0e6h ;1110 0110 call send mov W, #3fh ;0011 1111 call send mov W, #0c8h ;1100 1000 (c9) call send mov W, #10h ;0001 0000 call send jmp main down snb dfl jmp down4 decsz pixel jmp down1 setb dfl jmp down4 down1 mov W, #0feh ;1111 1110 call send mov W, #3fh ;0011 1111 call send mov W, #0cbh ;1100 1011 (ca) call send mov W, #0f0h ;1111 0000 call send jmp main left4 mov W, #9eh ;1001 1110 call send mov W, #24h ;0010 0100 (20) call send mov W, #4fh ;0100 1111 call send mov W, #0f0h ;1111 0000 call send jmp main right4 mov W, #0feh ;1111 1110 call send mov W, #2bh ;0010 1011 (2f) call send mov W, #0cfh ;1100 1111 call send mov W, #0f0h ;1111 0000 call send jmp main up4 mov W, #0e6h ;1110 0110 call send mov W, #3fh ;0011 1111 call send mov W, #0c9h ;1100 1001 (c8) call send mov W, #10h ;0001 0000 call send jmp main down4 mov W, #0feh ;1111 1110 call send mov W, #3fh ;0011 1111 call send mov W, #0cah ;1100 1010 (cb) call send mov W, #0f0h ;1111 0000 call send jmp main button mov W, #0fch ;1111 1100 call send mov W, #3fh ;0011 1111 call send mov W, #0cfh ;1100 1111 call send mov W, #0f0h ;1111 0000 call send bhold sb bin ;wait for button release jmp bhold out mov W, #0feh ;1111 1110 call send mov W, #3fh ;0011 1111 call send mov W, #0cfh ;1100 1111 call send mov W, #0f0h ;1111 0000 call send jmp main ;---- ouput data bits send mov data, W mov W, #08h mov bcnt, W sbit sb bit ;test jmp b0 b1 clrb comm ;'1' call bitdel jmp newbit b0 setb comm ;'0' call bitdel newbit rl data decsz bcnt jmp sbit ret ;---- comms timing delay bitdel mov W, #00h ;bit-length delay mov tdc1, W lp1 decsz tdc1 jmp lp1 mov W, #00h mov tdc1, W lp2 decsz tdc1 jmp lp2 mov W, #0ach mov tdc1, W lp3 decsz tdc1 jmp lp3 ret
Interested:
Code:
Comments: