home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 9 / AU_CD9.iso / Cover_Discs / Back_Issues / 1998_13 / Regulars / RTR / LEDtst.L < prev   
Text File  |  1998-10-09  |  12KB  |  368 lines

  1. PIC 16C84 Assembler V1.4 by Mike Cook
  2. File:- ADFS::Square.$.Develop.LargeLED.LEDtst
  3. Assembled on :- Fri,09 Oct 1998 at 17:40:30
  4.  
  5. ;Multiplexed LED matrix display test
  6. ;For an 10 MHz clock
  7. ;A0 - Serial out
  8. ;A1 - Serial in
  9. ;A2 - CTS allows serial input
  10. ;A3 - RTS output held until this is low
  11.  
  12. ;Note for 16F84 invert the state of the PWRTE
  13.               list   P=16C84
  14.  
  15.  
  16.        C             equ 0          
  17.        PCL           equ 2          
  18.        Z             equ 2          
  19.        PORTB         equ 6          
  20.        PORTA         equ 5          
  21.        TRISB         equ 86H          
  22.        TRISA         equ 85H          
  23.        EECON1        equ 88H          
  24.        EEDATA        equ 8          
  25.        INTCON        equ 0bH          
  26.        EEADR         equ 9          
  27.        STATUS        equ 3          
  28.        RP0           equ 5          
  29.        INC           equ 1          
  30.        cts           equ 2          
  31.        rts           equ 3          
  32. ;Output bits
  33.        cdat          equ 1          ;Coloum data
  34.        cck           equ 2          ;Coloum clock
  35.        rclr          equ 3          ;Row clear
  36.        rck           equ 4          ;Row clock
  37.        rdat          equ 5          ;Row data
  38.  
  39.        sBuf          equ 0ch          
  40. ;Serial send buffer
  41.        Scount        equ 0dh          ;Tempory Counter
  42.        Cdown         equ 0eh          ;Time delay countdown
  43.        rBuf          equ 0fh          ;Recieve buffer
  44.        ScanNo        equ 10h          ;Number of row we are on
  45.        RowC          equ 11h          ;Row counter
  46.        Sstore        equ 12h          ;Scrole store
  47.        Com1          equ 13h          ;Command 1
  48.        Com2          equ 14h          ;Command 2
  49.        save_w        equ 15h          ;save w reg
  50.        save_s        equ 16H          ;save status
  51.        save_p        equ 17h          ;save port LEDs
  52.        DisBuf        equ 1Ah          ;Display buffer
  53.  
  54.  
  55. ;
  56.               org    0
  57. 0000   2846   goto   Start          
  58.               org    4
  59. 0004   0095   movwf  save_w         ;save w and s regs
  60. 0005   0E03   swapf  STATUS,w       ;swapf doesn't affect Z like movf
  61. 0006   0096   movwf  save_s         
  62. 0007   0806   movf   PORTB,w        ;Save state of LEDs
  63. 0008   0097   movwf  save_p         
  64. 0009   0186   clrf   PORTB          ;Turn LEDs off
  65.  
  66. 000A   2015   call   Rx             ;Recieve byte
  67.  
  68. 000B   0A94   incf   Com2,f         ;Increment the data to put in
  69. 000C   2099   call   sleft          ;Scroll left command
  70.  
  71. out:
  72.  
  73. 000D   0817   movf   save_p,w       
  74. 000E   0086   movwf  PORTB          ;Turn LEDs back on        
  75. 000F   0E16   swapf  save_s,w       
  76. 0010   0083   movwf  STATUS         ; restore registers
  77. 0011   0E95   swapf  save_w,f       
  78. 0012   0E15   swapf  save_w,w       
  79. 0013   108B   bcf    INTCON,1       ;Clear edge interrupt
  80. 0014   0009   retfie                
  81.  
  82.  
  83. ;Recieve a serial byte
  84. Rx:
  85.  
  86. 0015   3008   movlw  8              ;Number of data bits to get
  87. 0016   008D   movwf  Scount         
  88. Sb:
  89. 0017   1885   btfsc  PORTA,1        ;Hold until start bit
  90. 0018   2817   goto   Sb             
  91. 0019   203B   call   hDelay         ;Half a baud delay
  92. Rnb:
  93. 001A   1003   bcf    STATUS,C       ;Clear the carry bit
  94. 001B   0C8F   rrf    rBuf,f         ;Prepare for next bit  
  95. 001C   203E   call   rDelay         ;Full baud delay for recieve
  96. 001D   1885   btfsc  PORTA,1        ;Test input
  97. 001E   178F   bsf    rBuf,7         ;Set if needed
  98. 001F   0B8D   decfsz Scount,f       ;See if finished
  99. 0020   281A   goto   Rnb            ;Round again if not
  100. 0021   203E   call   rDelay         ;Allow for stop bit to start
  101. 0022   080F   movf   rBuf,w         ;Put recieved chractor into W
  102. 0023   0008   return                
  103.  
  104.  
  105. ;Send a serial byte
  106. Send:
  107.  
  108. 0024   1985   btfsc  PORTA,rts      ;Only proceed when rts is low
  109. 0025   2824   goto   Send           
  110. 0026   3009   movlw  9              ;Number of data bits to send
  111. 0027   008D   movwf  Scount         
  112. 0028   1005   bcf    PORTA,0        ;Start bit
  113. 0029   2038   call   cDelay         ;Extra delay compensation
  114. Sloop:
  115. 002A   2041   call   Delay          
  116. 002B   180C   btfsc  sBuf,0         ;Set the next bit
  117. 002C   1405   bsf    PORTA,0        
  118. 002D   1C0C   btfss  sBuf,0         
  119. 002E   1005   bcf    PORTA,0        
  120. 002F   0C8C   rrf    sBuf,f         ;Shift for next time
  121. 0030   0B8D   decfsz Scount,f       
  122. 0031   282A   goto   Sloop          ;Round until finished
  123. 0032   1405   bsf    PORTA,0        ;Stop bit
  124. 0033   2038   call   cDelay         ;Extra delay compensation
  125. 0034   2041   call   Delay          
  126. 0035   2041   call   Delay          
  127. 0036   2038   call   cDelay         ;For good measure
  128. 0037   0008   return                
  129.  
  130. cDelay:
  131.  
  132. 0038   3002   movlw  2              ;Small delay at end of send
  133. 0039   008E   movwf  Cdown          
  134. 003A   2843   goto   Dloop          
  135.  
  136. hDelay:
  137.  
  138. 003B   3015   movlw  21             ;half delay for serial recieve 10MHz clock
  139. 003C   008E   movwf  Cdown          ; 19,200 Baud rate
  140. 003D   2843   goto   Dloop          
  141.  
  142. rDelay:
  143.  
  144. 003E   3026   movlw  38             ;Delay for serial recieve 10MHz clock
  145. 003F   008E   movwf  Cdown          ; 19,200 Baud rate
  146. 0040   2843   goto   Dloop          
  147.  
  148. Delay:
  149.  
  150. 0041   3027   movlw  39             ;Delay for serial send 10MHz clock
  151. 0042   008E   movwf  Cdown          ; 19,200 Baud rate
  152. Dloop:
  153. 0043   0B8E   decfsz Cdown,f        
  154. 0044   2843   goto   Dloop          
  155. 0045   0008   return                
  156.  
  157.  
  158. Start:
  159.  
  160. 0046   1683   bsf    STATUS,RP0     ;SELECT REGISTER BANK 1
  161. 0047   301A   movlw  1Ah            ;Bits 4,3 & 2 inputs
  162. 0048   0085   movwf  TRISA^80H      
  163. 0049   3001   movlw  1              ;Bit 0 input rest outputs
  164. 004A   0086   movwf  TRISB^80H      
  165. 004B   3003   movlw  3              ;16 prescaler -ve edge interrupt
  166. 004C   0081   movwf  1              ;Option register
  167. 004D   3090   movlw  90H            ;Enable bit 0 interrupt
  168. 004E   008B   movwf  INTCON         
  169.  
  170. 004F   1283   bcf    STATUS,RP0     ;SELECT REGISTER BANK 0
  171.  
  172.  
  173. 0050   1405   bsf    PORTA,0        ;Serial at Mark
  174.  
  175. 0051   1105   bcf    PORTA,cts      ;CTS enabled
  176. 0052   0186   clrf   PORTB          
  177. 0053   0190   clrf   ScanNo         
  178. 0054   0194   clrf   Com2           
  179.  
  180. ;Just put some test data into some memory
  181. 0055   30AA   movlw  0AAh           
  182. 0056   009A   movwf  DisBuf         
  183. 0057   009B   movwf  DisBuf!1       
  184. 0058   009C   movwf  DisBuf!2       
  185.  
  186. 0059   00A0   movwf  DisBuf!6       
  187. 005A   00A1   movwf  DisBuf!7       
  188. 005B   00A2   movwf  DisBuf!8       
  189.  
  190. 005C   00A6   movwf  DisBuf!12      
  191. 005D   00A7   movwf  DisBuf!13      
  192. 005E   00A8   movwf  DisBuf!14      
  193.  
  194. 005F   00AC   movwf  DisBuf!18      
  195. 0060   00AD   movwf  DisBuf!19      
  196. 0061   00AE   movwf  DisBuf!20      
  197.  
  198. 0062   3055   movlw  055h           
  199. 0063   009D   movwf  DisBuf!3       
  200. 0064   009E   movwf  DisBuf!4       
  201. 0065   009F   movwf  DisBuf!5       
  202.  
  203. 0066   00A3   movwf  DisBuf!9       
  204. 0067   00A4   movwf  DisBuf!10      
  205. 0068   00A5   movwf  DisBuf!11      
  206.  
  207. 0069   00A9   movwf  DisBuf!15      
  208. 006A   00AA   movwf  DisBuf!16      
  209. 006B   00AB   movwf  DisBuf!17      
  210.  
  211. Main:
  212.  
  213. 006C   1D0B   btfss  0bh,2          ;Test timer
  214. 006D   286C   goto   Main           ;Loop until time
  215. 006E   110B   bcf    0bh,2          ;Clear it for next time
  216. 006F   0A90   incf   ScanNo,f       
  217. 0070   3007   movlw  7              ;See if it is at end
  218. 0071   0210   subwf  ScanNo,w       
  219. 0072   1903   btfsc  STATUS,Z       ;Wrap it round after 7
  220. 0073   0190   clrf   ScanNo         
  221. 0074   2076   call   scan           
  222. 0075   286C   goto   Main           
  223.  
  224. scan:
  225.  
  226. 0076   0186   clrf   PORTB          ; Blank out row
  227. 0077   1003   bcf    STATUS,C       
  228. 0078   0D10   rlf    ScanNo,w       ;Scan No * 3 + DisBuf = reg address
  229. 0079   0710   addwf  ScanNo,w       
  230. 007A   3E1A   addlw  DisBuf         
  231. 007B   0084   movwf  4              ;to indirect register
  232. 007C   208C   call   rbout          ;Output first byte
  233. 007D   0A84   incf   4,f            ;Next byte
  234. 007E   208C   call   rbout          
  235. 007F   0A84   incf   4,f            ;Last byte
  236. 0080   208A   call   hrout          
  237. 0081   0810   movf   ScanNo,w       
  238. 0082   0091   movwf  RowC           ;Row Count
  239. 0083   0A91   incf   RowC,f         ;One more pulse
  240. 0084   1003   bcf    STATUS,C       
  241. 0085   0D91   rlf    RowC,f         
  242. 0086   0D91   rlf    RowC,f         
  243. 0087   0D11   rlf    RowC,w         
  244. 0088   0086   movwf  PORTB          
  245. 0089   0008   return                
  246.  
  247. hrout:
  248.  
  249. 008A   3004   movlw  4              ;Only 4 bits out
  250. 008B   288D   goto   he             
  251. rbout:
  252. 008C   3008   movlw  8              ;number of shifts to do
  253. he:
  254. 008D   0091   movwf  RowC           ;shift store
  255. 008E   0800   movf   0,w            ;get byte to send
  256. 008F   0092   movwf  Sstore         ;store it
  257. rloop:
  258. 0090   0C92   rrf    Sstore,f       ;get next bit into carry
  259. 0091   1086   bcf    PORTB,cdat     ;Get data line right
  260. 0092   1803   btfsc  STATUS,C       
  261. 0093   1486   bsf    PORTB,cdat     
  262. 0094   1506   bsf    PORTB,cck      ;Toggle clock
  263. 0095   1106   bcf    PORTB,cck      
  264. 0096   0B91   decfsz RowC,f         ;All bits done?
  265. 0097   2890   goto   rloop          
  266. 0098   0008   return                
  267.  
  268. ;Commands
  269.  
  270. sleft:
  271.  
  272. 0099   301A   movlw  DisBuf         ;Scroll memory left
  273. 009A   0084   movwf  4              ;into indirect register
  274. 009B   3007   movlw  7              ;Number of rows to scroll
  275. 009C   008C   movwf  sBuf           ;Temp storage
  276. 009D   1003   bcf    STATUS,C       
  277. slloop:
  278. 009E   0D80   rlf    0,f            ;Move first byte
  279. 009F   0A84   incf   4,f            
  280. 00A0   0D80   rlf    0,f            ;Move second byte
  281. 00A1   0A84   incf   4,f            
  282. 00A2   0D80   rlf    0,f            ;Move last byte
  283. 00A3   1200   bcf    0,4            ;Blank bit fallen off the end
  284. 00A4   0A84   incf   4,f            ;Move on for next time
  285. 00A5   0B8C   decfsz sBuf,f         ;Loop until all 7 rows are out
  286. 00A6   289E   goto   slloop         
  287. 00A7   1814   btfsc  Com2,0         ;Now put new data in
  288. 00A8   141A   bsf    DisBuf,0       
  289. 00A9   1894   btfsc  Com2,1         
  290. 00AA   141D   bsf    DisBuf!3,0     
  291. 00AB   1914   btfsc  Com2,2         
  292. 00AC   1420   bsf    DisBuf!6,0     
  293. 00AD   1994   btfsc  Com2,3         
  294. 00AE   1423   bsf    DisBuf!9,0     
  295. 00AF   1A14   btfsc  Com2,4         
  296. 00B0   1426   bsf    DisBuf!12,0    
  297. 00B1   1A94   btfsc  Com2,5         
  298. 00B2   1429   bsf    DisBuf!15,0    
  299. 00B3   1B14   btfsc  Com2,6         
  300. 00B4   142C   bsf    DisBuf!18,0    
  301. 00B5   0008   return                
  302.  
  303. end
  304.  
  305. Memory Usage Map ('X' = Used, '-' = Unused)
  306.  
  307. 0000   : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
  308. 0040   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
  309. 0080   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXX----------
  310.  
  311. 54 Lables & Constants:-
  312. Hex    Name
  313. 0000   C
  314. 0002   PCL
  315. 0002   Z
  316. 0006   PORTB
  317. 0005   PORTA
  318. 0086   TRISB
  319. 0085   TRISA
  320. 0088   EECON1
  321. 0008   EEDATA
  322. 000B   INTCON
  323. 0009   EEADR
  324. 0003   STATUS
  325. 0005   RP0
  326. 0001   INC
  327. 0002   cts
  328. 0003   rts
  329. 0001   cdat
  330. 0002   cck
  331. 0003   rclr
  332. 0004   rck
  333. 0005   rdat
  334. 000C   sBuf
  335. 000D   Scount
  336. 000E   Cdown
  337. 000F   rBuf
  338. 0010   ScanNo
  339. 0011   RowC
  340. 0012   Sstore
  341. 0013   Com1
  342. 0014   Com2
  343. 0015   save_w
  344. 0016   save_s
  345. 0017   save_p
  346. 001A   DisBuf
  347. 000D   out
  348. 0015   Rx
  349. 0017   Sb
  350. 001A   Rnb
  351. 0024   Send
  352. 002A   Sloop
  353. 0038   cDelay
  354. 003B   hDelay
  355. 003E   rDelay
  356. 0041   Delay
  357. 0043   Dloop
  358. 0046   Start
  359. 006C   Main
  360. 0076   scan
  361. 008A   hrout
  362. 008C   rbout
  363. 008D   he
  364. 0090   rloop
  365. 0099   sleft
  366. 009E   slloop
  367.  
  368. 0 Errors