home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Acorn User 9
/
AU_CD9.iso
/
Cover_Discs
/
Back_Issues
/
1998_13
/
Regulars
/
RTR
/
LEDtst.L
< prev
Wrap
Text File
|
1998-10-09
|
12KB
|
368 lines
PIC 16C84 Assembler V1.4 by Mike Cook
File:- ADFS::Square.$.Develop.LargeLED.LEDtst
Assembled on :- Fri,09 Oct 1998 at 17:40:30
;Multiplexed LED matrix display test
;For an 10 MHz clock
;A0 - Serial out
;A1 - Serial in
;A2 - CTS allows serial input
;A3 - RTS output held until this is low
;Note for 16F84 invert the state of the PWRTE
list P=16C84
C equ 0
PCL equ 2
Z equ 2
PORTB equ 6
PORTA equ 5
TRISB equ 86H
TRISA equ 85H
EECON1 equ 88H
EEDATA equ 8
INTCON equ 0bH
EEADR equ 9
STATUS equ 3
RP0 equ 5
INC equ 1
cts equ 2
rts equ 3
;Output bits
cdat equ 1 ;Coloum data
cck equ 2 ;Coloum clock
rclr equ 3 ;Row clear
rck equ 4 ;Row clock
rdat equ 5 ;Row data
sBuf equ 0ch
;Serial send buffer
Scount equ 0dh ;Tempory Counter
Cdown equ 0eh ;Time delay countdown
rBuf equ 0fh ;Recieve buffer
ScanNo equ 10h ;Number of row we are on
RowC equ 11h ;Row counter
Sstore equ 12h ;Scrole store
Com1 equ 13h ;Command 1
Com2 equ 14h ;Command 2
save_w equ 15h ;save w reg
save_s equ 16H ;save status
save_p equ 17h ;save port LEDs
DisBuf equ 1Ah ;Display buffer
;
org 0
0000 2846 goto Start
org 4
0004 0095 movwf save_w ;save w and s regs
0005 0E03 swapf STATUS,w ;swapf doesn't affect Z like movf
0006 0096 movwf save_s
0007 0806 movf PORTB,w ;Save state of LEDs
0008 0097 movwf save_p
0009 0186 clrf PORTB ;Turn LEDs off
000A 2015 call Rx ;Recieve byte
000B 0A94 incf Com2,f ;Increment the data to put in
000C 2099 call sleft ;Scroll left command
out:
000D 0817 movf save_p,w
000E 0086 movwf PORTB ;Turn LEDs back on
000F 0E16 swapf save_s,w
0010 0083 movwf STATUS ; restore registers
0011 0E95 swapf save_w,f
0012 0E15 swapf save_w,w
0013 108B bcf INTCON,1 ;Clear edge interrupt
0014 0009 retfie
;Recieve a serial byte
Rx:
0015 3008 movlw 8 ;Number of data bits to get
0016 008D movwf Scount
Sb:
0017 1885 btfsc PORTA,1 ;Hold until start bit
0018 2817 goto Sb
0019 203B call hDelay ;Half a baud delay
Rnb:
001A 1003 bcf STATUS,C ;Clear the carry bit
001B 0C8F rrf rBuf,f ;Prepare for next bit
001C 203E call rDelay ;Full baud delay for recieve
001D 1885 btfsc PORTA,1 ;Test input
001E 178F bsf rBuf,7 ;Set if needed
001F 0B8D decfsz Scount,f ;See if finished
0020 281A goto Rnb ;Round again if not
0021 203E call rDelay ;Allow for stop bit to start
0022 080F movf rBuf,w ;Put recieved chractor into W
0023 0008 return
;Send a serial byte
Send:
0024 1985 btfsc PORTA,rts ;Only proceed when rts is low
0025 2824 goto Send
0026 3009 movlw 9 ;Number of data bits to send
0027 008D movwf Scount
0028 1005 bcf PORTA,0 ;Start bit
0029 2038 call cDelay ;Extra delay compensation
Sloop:
002A 2041 call Delay
002B 180C btfsc sBuf,0 ;Set the next bit
002C 1405 bsf PORTA,0
002D 1C0C btfss sBuf,0
002E 1005 bcf PORTA,0
002F 0C8C rrf sBuf,f ;Shift for next time
0030 0B8D decfsz Scount,f
0031 282A goto Sloop ;Round until finished
0032 1405 bsf PORTA,0 ;Stop bit
0033 2038 call cDelay ;Extra delay compensation
0034 2041 call Delay
0035 2041 call Delay
0036 2038 call cDelay ;For good measure
0037 0008 return
cDelay:
0038 3002 movlw 2 ;Small delay at end of send
0039 008E movwf Cdown
003A 2843 goto Dloop
hDelay:
003B 3015 movlw 21 ;half delay for serial recieve 10MHz clock
003C 008E movwf Cdown ; 19,200 Baud rate
003D 2843 goto Dloop
rDelay:
003E 3026 movlw 38 ;Delay for serial recieve 10MHz clock
003F 008E movwf Cdown ; 19,200 Baud rate
0040 2843 goto Dloop
Delay:
0041 3027 movlw 39 ;Delay for serial send 10MHz clock
0042 008E movwf Cdown ; 19,200 Baud rate
Dloop:
0043 0B8E decfsz Cdown,f
0044 2843 goto Dloop
0045 0008 return
Start:
0046 1683 bsf STATUS,RP0 ;SELECT REGISTER BANK 1
0047 301A movlw 1Ah ;Bits 4,3 & 2 inputs
0048 0085 movwf TRISA^80H
0049 3001 movlw 1 ;Bit 0 input rest outputs
004A 0086 movwf TRISB^80H
004B 3003 movlw 3 ;16 prescaler -ve edge interrupt
004C 0081 movwf 1 ;Option register
004D 3090 movlw 90H ;Enable bit 0 interrupt
004E 008B movwf INTCON
004F 1283 bcf STATUS,RP0 ;SELECT REGISTER BANK 0
0050 1405 bsf PORTA,0 ;Serial at Mark
0051 1105 bcf PORTA,cts ;CTS enabled
0052 0186 clrf PORTB
0053 0190 clrf ScanNo
0054 0194 clrf Com2
;Just put some test data into some memory
0055 30AA movlw 0AAh
0056 009A movwf DisBuf
0057 009B movwf DisBuf!1
0058 009C movwf DisBuf!2
0059 00A0 movwf DisBuf!6
005A 00A1 movwf DisBuf!7
005B 00A2 movwf DisBuf!8
005C 00A6 movwf DisBuf!12
005D 00A7 movwf DisBuf!13
005E 00A8 movwf DisBuf!14
005F 00AC movwf DisBuf!18
0060 00AD movwf DisBuf!19
0061 00AE movwf DisBuf!20
0062 3055 movlw 055h
0063 009D movwf DisBuf!3
0064 009E movwf DisBuf!4
0065 009F movwf DisBuf!5
0066 00A3 movwf DisBuf!9
0067 00A4 movwf DisBuf!10
0068 00A5 movwf DisBuf!11
0069 00A9 movwf DisBuf!15
006A 00AA movwf DisBuf!16
006B 00AB movwf DisBuf!17
Main:
006C 1D0B btfss 0bh,2 ;Test timer
006D 286C goto Main ;Loop until time
006E 110B bcf 0bh,2 ;Clear it for next time
006F 0A90 incf ScanNo,f
0070 3007 movlw 7 ;See if it is at end
0071 0210 subwf ScanNo,w
0072 1903 btfsc STATUS,Z ;Wrap it round after 7
0073 0190 clrf ScanNo
0074 2076 call scan
0075 286C goto Main
scan:
0076 0186 clrf PORTB ; Blank out row
0077 1003 bcf STATUS,C
0078 0D10 rlf ScanNo,w ;Scan No * 3 + DisBuf = reg address
0079 0710 addwf ScanNo,w
007A 3E1A addlw DisBuf
007B 0084 movwf 4 ;to indirect register
007C 208C call rbout ;Output first byte
007D 0A84 incf 4,f ;Next byte
007E 208C call rbout
007F 0A84 incf 4,f ;Last byte
0080 208A call hrout
0081 0810 movf ScanNo,w
0082 0091 movwf RowC ;Row Count
0083 0A91 incf RowC,f ;One more pulse
0084 1003 bcf STATUS,C
0085 0D91 rlf RowC,f
0086 0D91 rlf RowC,f
0087 0D11 rlf RowC,w
0088 0086 movwf PORTB
0089 0008 return
hrout:
008A 3004 movlw 4 ;Only 4 bits out
008B 288D goto he
rbout:
008C 3008 movlw 8 ;number of shifts to do
he:
008D 0091 movwf RowC ;shift store
008E 0800 movf 0,w ;get byte to send
008F 0092 movwf Sstore ;store it
rloop:
0090 0C92 rrf Sstore,f ;get next bit into carry
0091 1086 bcf PORTB,cdat ;Get data line right
0092 1803 btfsc STATUS,C
0093 1486 bsf PORTB,cdat
0094 1506 bsf PORTB,cck ;Toggle clock
0095 1106 bcf PORTB,cck
0096 0B91 decfsz RowC,f ;All bits done?
0097 2890 goto rloop
0098 0008 return
;Commands
sleft:
0099 301A movlw DisBuf ;Scroll memory left
009A 0084 movwf 4 ;into indirect register
009B 3007 movlw 7 ;Number of rows to scroll
009C 008C movwf sBuf ;Temp storage
009D 1003 bcf STATUS,C
slloop:
009E 0D80 rlf 0,f ;Move first byte
009F 0A84 incf 4,f
00A0 0D80 rlf 0,f ;Move second byte
00A1 0A84 incf 4,f
00A2 0D80 rlf 0,f ;Move last byte
00A3 1200 bcf 0,4 ;Blank bit fallen off the end
00A4 0A84 incf 4,f ;Move on for next time
00A5 0B8C decfsz sBuf,f ;Loop until all 7 rows are out
00A6 289E goto slloop
00A7 1814 btfsc Com2,0 ;Now put new data in
00A8 141A bsf DisBuf,0
00A9 1894 btfsc Com2,1
00AA 141D bsf DisBuf!3,0
00AB 1914 btfsc Com2,2
00AC 1420 bsf DisBuf!6,0
00AD 1994 btfsc Com2,3
00AE 1423 bsf DisBuf!9,0
00AF 1A14 btfsc Com2,4
00B0 1426 bsf DisBuf!12,0
00B1 1A94 btfsc Com2,5
00B2 1429 bsf DisBuf!15,0
00B3 1B14 btfsc Com2,6
00B4 142C bsf DisBuf!18,0
00B5 0008 return
end
Memory Usage Map ('X' = Used, '-' = Unused)
0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXX----------
54 Lables & Constants:-
Hex Name
0000 C
0002 PCL
0002 Z
0006 PORTB
0005 PORTA
0086 TRISB
0085 TRISA
0088 EECON1
0008 EEDATA
000B INTCON
0009 EEADR
0003 STATUS
0005 RP0
0001 INC
0002 cts
0003 rts
0001 cdat
0002 cck
0003 rclr
0004 rck
0005 rdat
000C sBuf
000D Scount
000E Cdown
000F rBuf
0010 ScanNo
0011 RowC
0012 Sstore
0013 Com1
0014 Com2
0015 save_w
0016 save_s
0017 save_p
001A DisBuf
000D out
0015 Rx
0017 Sb
001A Rnb
0024 Send
002A Sloop
0038 cDelay
003B hDelay
003E rDelay
0041 Delay
0043 Dloop
0046 Start
006C Main
0076 scan
008A hrout
008C rbout
008D he
0090 rloop
0099 sleft
009E slloop
0 Errors