Advertisement
Leo_F

Untitled

Mar 6th, 2018
3,087
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 13.73 KB | None | 0 0
  1. ;***************************************************
  2. ;*** Lab 6 Nivå 1  -  Leo Frössling  -  20/02-18 ***
  3. ;***************************************************
  4.    
  5.    
  6.     #include <p18F4520.inc>
  7.    
  8.     CONFIG  OSC = HS
  9.     CONFIG  PWRT = OFF
  10.     CONFIG  WDT = OFF
  11.     CONFIG  PBADEN = OFF
  12.     CONFIG  LVP = OFF
  13.    
  14.         org 0x000000
  15. PORST   GOTO    MAIN
  16.    
  17.     org 0x000008
  18. INTERUPT    BTFSC   PIR1,RCIF   ; if RX int...
  19.         CALL    ESRXISR, FAST   ;          ... read char
  20.         RETFIE
  21.    
  22.     org 0x000020
  23.  
  24. ;******************************************************************************
  25. ; *** COL toolbox 1.1 AC ******************************************************
  26. ; *** Needs: RA1,2,3,5,RE0,1,2,RC0 ********************************************
  27. ; *** RAM usage: 0x000 ********************************************************
  28. ;******************************************************************************
  29.  
  30. IC8COL      equ     0x000
  31.        
  32. EC8INIT     BCF     TRISA, RA1
  33.         BCF     TRISA, RA2
  34.         BCF     TRISA, RA3
  35.         BCF     TRISA, RA5
  36.         BCF     TRISE, RE0
  37.         BCF     TRISE, RE1
  38.         BCF     TRISE, RE2
  39.         BCF     TRISC, RC0
  40.         CLRF        IC8COL
  41.         CALL        EC8FREE
  42.        
  43.         RETURN
  44.        
  45. EC8COLQ     MOVF        IC8COL, W
  46.        
  47.         RETURN
  48.        
  49. EC8NEXTQ    INCF        IC8COL, W
  50.         BTFSC       WREG, 3
  51.         CLRF        WREG
  52.        
  53.         RETURN
  54.        
  55. EC8FREE     BCF     PORTA, RA1
  56.         BCF     PORTA, RA2
  57.         BCF     PORTA, RA3
  58.         BCF     PORTA, RA5
  59.         BCF     PORTE, RE0
  60.         BCF     PORTE, RE1
  61.         BCF     PORTE, RE2
  62.         BCF     PORTC, RC0
  63.        
  64.         RETURN
  65.        
  66. EC8NEXT     CALL        EC8NEXTQ
  67.         MOVWF       IC8COL
  68.        
  69.         RLNCF       WREG
  70.         RLNCF       WREG
  71.         ADDWF       PCL
  72.         BSF     PORTA, RA1
  73.         RETURN
  74.         BSF     PORTA, RA2
  75.         RETURN     
  76.         BSF     PORTA, RA3
  77.         RETURN     
  78.         BSF     PORTA, RA5
  79.         RETURN
  80.         BSF     PORTE, RE0
  81.         RETURN
  82.         BSF     PORTE, RE1
  83.         RETURN
  84.         BSF     PORTE, RE2
  85.         RETURN
  86.         BSF     PORTC, RC0
  87.         RETURN
  88.        
  89. ;*** END COL toolbox***********************************************************
  90.        
  91. ;****************************************************************
  92. ;*** 8*8 LED Matrix toolbox 1.0 AC ******************************
  93. ;*** Needs: FSR0 & PDx ******************************************
  94. ;*** RAM usage: 0x010..0x017 ************************************
  95. ;****************************************************************
  96. S88DISP equ 0x010           ; Shared 8 Byte LED buffer
  97. ;*** External E88INIT * Initialize HW/SW ***
  98. E88INIT     CLRF    TRISD
  99.         LFSR    0,S88DISP       ; FSR0 ptr to LED buffer.
  100.         CLRF    S88DISP+0
  101.         CLRF    S88DISP+1
  102.         CLRF    S88DISP+2
  103.         CLRF    S88DISP+3
  104.         CLRF    S88DISP+4
  105.         CLRF    S88DISP+5
  106.         CLRF    S88DISP+6
  107.         CLRF    S88DISP+7
  108.         RETURN
  109. ;*** External E88VIEW ***
  110. E88VIEW     MOVFF   PLUSW0, PORTD
  111.         RETURN
  112. ;*** END 8*8 LED Matrix *****************************************
  113.        
  114. ;****************************************************************
  115. ;*** KEY toolbox 1.0 ********************************************
  116. ;*** Needs: RB0,2,4,5 *******************************************
  117. ;*** RAM usage: 0x003-0x005 *************************************
  118. ;*** Dependencies: COL toolbox **********************************
  119. ;****************************************************************
  120. IKTEMP  equ 0x003
  121. IKPREV  equ 0x004
  122. IKTIME  equ 0x005
  123.    
  124. EKINIT      BSF     TRISB, RB0
  125.         BSF     TRISB, RB2
  126.         BSF     TRISB, RB4
  127.         BSF     TRISB, RB5
  128.         SETF    IKPREV      ; No key pressed
  129.         CLRF    IKTIME
  130.         RETURN
  131.        
  132. EKDOWNQ     CALL    EC8COLQ     ; Every 8:th time...
  133.         DECFSZ  WREG
  134.         GOTO    LKDOWNQ
  135.         DCFSNZ  IKTIME      ; ...dec repeat counter,
  136.         INCF    IKTIME      ;            but only to one!
  137. LKDOWNQ     SETF    WREG        ; Key pressed? (Assume not!)
  138.         BTFSS   PORTB, RB0
  139.         CLRF    WREG
  140.         BTFSS   PORTB, RB2
  141.         MOVLW   0x01
  142.         BTFSS   PORTB, RB4
  143.         MOVLW   0x02
  144.         BTFSS   PORTB, RB5
  145.         MOVLW   0x03
  146.         BTFSC   WREG, 7
  147.         RETURN          ; No! return!
  148.         MOVWF   IKTEMP      ; Yes, Which...
  149.         CALL    EC8COLQ     ;   ...column...
  150.         RLNCF   WREG
  151.         RLNCF   WREG
  152.         IORWF   IKTEMP      ;   ...add row...
  153.         MOVF    IKPREV, W
  154.         XORWF   IKPREV, W       ;   ...same???...
  155.         BNZ     LKNEW
  156.        
  157.         MOVF    IKTEMP, W       ;   ... yes, repeat?
  158.         DECFSZ  IKTIME
  159.         SETF    WREG        ;      ...no return 0xFF!
  160.         RETURN
  161.        
  162. LKNEW       MOVF    IKTEMP, W       ;   ...no! new key!!!
  163.         MOVWF   IKPREV      ;          remember it!
  164.         CLRF    IKTIME      ;          reset repeat cnt
  165.         RETURN
  166. ;*** END KEY toolbox ********************************************
  167.        
  168. ;******************************************************************************
  169. ;   DELAY PACKAGE 10*80MS
  170. ;   RAM USAGE: 0x07C - 0x07D
  171. ;
  172. ;******************************************************************************
  173.            
  174. ELDSHORT    EQU     0x07B
  175. ELDLONG     EQU     0x07A
  176. ELDELONG    EQU     0x079
  177.        
  178. ED80MS      CLRF        ELDSHORT
  179.         CLRF        ELDLONG
  180.         MOVLW       0x001
  181.         MOVWF       ELDELONG
  182.        
  183. ELDLOOP     DECFSZ      ELDSHORT
  184.         GOTO        ELDLOOP
  185.         DECFSZ      ELDLONG
  186.         GOTO        ELDLOOP
  187.         DECFSZ      ELDELONG
  188.         GOTO        ELDLOOP
  189.        
  190.         RETURN
  191.        
  192. ;END DELAY PACKAGE 80MS********************************************************
  193.        
  194. ;******************************************************************************
  195. ;   DELAY PACKAGE 10MS
  196. ;   RAM USAGE: 0x07E - 0x07F
  197. ;
  198. ;******************************************************************************
  199.            
  200. SDSHORT     EQU     0x07E
  201. SDLONG      EQU     0x07F
  202.        
  203. ED10MS      CLRF        SDSHORT
  204.         MOVLW       0x01
  205.         MOVWF       SDLONG
  206.        
  207. SDLOOP      DECFSZ      SDSHORT
  208.         GOTO        SDLOOP
  209.         DECFSZ      SDLONG
  210.         GOTO        SDLOOP
  211.        
  212.         RETURN
  213.        
  214. ;END DELAY PACKAGE 10MS********************************************************
  215.  
  216. ;*************************************************
  217. ;*** Delay 2ms ***********************************
  218. ;*** RAM: 0x00..0x01 *****************************
  219. ;*************************************************
  220. ID2MSVAR1   equ 0x40
  221. ID2MSVAR2   equ 0x41
  222. ED2MSSTART    
  223.         MOVLW   0x07
  224.         MOVWF   ID2MSVAR1
  225. ID2MSLOOP1    
  226.         CLRF    ID2MSVAR2
  227. ID2MSLOOP2
  228.         DECFSZ  ID2MSVAR2
  229.         GOTO    ID2MSLOOP2
  230.         DECFSZ  ID2MSVAR1
  231.         GOTO    ID2MSLOOP1
  232.         RETURN
  233. ;***************************** END Delay 2ms  ***
  234.        
  235. ;*************************************************
  236. ;*** Delay 79ms **********************************
  237. ;*** RAM: 0x00..0x01 *****************************
  238. ;*************************************************
  239. ID79MSVAR1  equ 0x42
  240. ID79MSVAR2  equ 0x43
  241. ED79MSSTART    
  242.         CLRF    ID79MSVAR1
  243. ID79MSLOOP1    
  244.         CLRF    ID79MSVAR2
  245. ID79MSLOOP2
  246.         DECFSZ  ID79MSVAR2
  247.         GOTO    ID79MSLOOP2
  248.         DECFSZ  ID79MSVAR1
  249.         GOTO    ID79MSLOOP1
  250.         RETURN
  251. ;***************************** END 79ms Delay ***
  252.        
  253. ;************************************************************
  254. ;*** LCD toolbox 2.0 AC *************************************
  255. ;*** Need FSR1 (temp), PORTD, (short wr), RB1 EN & RB3 RS ***
  256. ;*** (RS = 1 DATA, RS = 0 INSTRUCTION )**********************
  257. ;*** 0xFF=\n, 0xFe=\cmd, 0xFD=%d ****************************
  258. ;*** RAM: 0x0F0 *********************************************
  259. ;*** Dependencies: - ****************************************
  260. ;************************************************************
  261. ILDCNT  equ 0x0F0           ; Internal delay counter
  262.    
  263. ELINIT      SETF    ILDCNT      ; LCD I/O not busy!
  264.    
  265. ELWRMSG     INCFSZ  ILDCNT      ; Busy?
  266.         RETURN          ; ...yes, return
  267.         SETF    ILDCNT      ; ...no: reset delay cnt!
  268.         TBLRD*+         ; Getnext cmd/chr...
  269.         MOVF    TABLAT, W   ;             ... to WREG
  270.         BTFSS   STATUS, N   ; CMD?
  271.         GOTO    PRNTCH      ; ...no: Write char!
  272.         INFSNZ  WREG        ; Case \0?
  273.         GOTO    LLNULL      ;          Yes, null ch!
  274.         INFSNZ  WREG        ; Case \x?
  275.         GOTO    LLESCCH     ;          Yes, escape ch!
  276.                     ; Default: variable!
  277. LLINSVA     TBLRD*+         ; Load variable adress...
  278.         MOVFF   TABLAT, FSR1L ; ... get adress...
  279.         CLRF    FSR1H       ; ... into FSR1...
  280.         MOVF    INDF1, W    ; ...get data through F1...
  281.         ADDLW   '0'     ; ...make it an ascii digit!
  282.         GOTO    PRNTCH      ; ...and display it!
  283.        
  284. LLESCCH     TBLRD*+         ; Next is the cmd...
  285.         MOVLW   0x80        ; ... could take some time...
  286.         MOVWF   ILDCNT
  287.         MOVF    TABLAT, W       ; ...Get the cmd...
  288.         GOTO    COMNWRT     ; ... and transfer it!
  289.        
  290. LLNULL      DECF    TBLPTRL     ; Adjust tblptr...
  291.         RETURN          ; ...and return!
  292.        
  293. ;************************************************
  294. ;*** LCD toolbox ********************************
  295.    
  296. LCD_DATA    equ PORTD
  297. LCD_CTRL    equ PORTB
  298. RS      equ RB3
  299. EN      equ RB1
  300.        
  301. ELCDINIT
  302.         CLRF    TRISD       ; PORTD = Output
  303.         BCF     TRISB, RB1      ; PORTB = Output
  304.         BCF     TRISB, RB3
  305.         BCF     LCD_CTRL, EN   ; Enable idle low
  306.         MOVLW   0x38        ; init. LCD 2 lines, 5x7 matrix
  307.         CALL    COMNWRT     ; call command subroutine
  308.         CALL    ED79MSSTART
  309.         MOVLW   0x0C        ; display on, cursor off
  310.         CALL    COMNWRT     ; call command subroutine
  311.         CALL    ED2MSSTART
  312.         MOVLW   0x01        ; clear LCD
  313.         CALL    COMNWRT     ; call command subroutine
  314.         CALL    ED2MSSTART
  315.         MOVLW   0x06        ; shift cursor right
  316.         CALL    COMNWRT     ; call command subroutine
  317.         CALL    ED2MSSTART
  318.         MOVLW   0x80        ; cursor at line 1, pos.
  319.         CALL    COMNWRT     ; call command subroutine
  320.         CALL    ED2MSSTART
  321.         RETURN
  322.        
  323. ELCDCLEAR
  324.         MOVLW   0x01        ; clear LCD
  325.         CALL    COMNWRT     ; call command subroutine
  326.         CALL    ED2MSSTART
  327.        
  328.         RETURN
  329.  
  330. ELCDPRNT
  331. LOADMSG
  332.         TBLRD*+         ; Read ASCII from program memory
  333.         MOVF    TABLAT, W
  334.         BZ      EXIT
  335.         CALL    PRNTCH      ; Print ASCII
  336.         BRA     LOADMSG
  337. EXIT        RETURN
  338.        
  339. COMNWRT             ; send command to LCD
  340.     MOVWF   LCD_DATA        ; copy wreg to LCD DATA pin
  341.     BCF     LCD_CTRL, RS    ; RS = 0 for command
  342.     BSF     LCD_CTRL, EN    ; E = 1 for high pulse
  343.     CALL    ED2MSSTART
  344.     BCF     LCD_CTRL, EN    ; E = 0 for H-to-L pulse
  345.     RETURN
  346.    
  347. DATAWRT             ; write data to LCD
  348.     MOVWF   LCD_DATA        ; copy wreg to LCD DATA pin
  349.     BSF     LCD_CTRL, RS    ; RS = 1 for data
  350.     BSF     LCD_CTRL, EN    ; EN = 1 for high pulse
  351.     CALL    ED2MSSTART
  352.     BCF     LCD_CTRL, EN    ; E = 0 for H-to-L pulse
  353.     RETURN
  354.    
  355. PRNTCH
  356.     CALL    DATAWRT     ; call display subroutine
  357.     CALL    ED2MSSTART
  358.     RETURN
  359.    
  360. ;***************************** END LCD toolbox ***
  361.    
  362. ;*************************************************
  363. ;*** Serial Toolbox 1.0 AC ***********************
  364. ;*************************************************
  365. TX  equ RC6
  366. RX  equ RC7
  367. ESRXISR     MOVLW   B'00010000' ; Shift back cursor
  368.         CALL    COMNWRT
  369.         MOVF    RCREG, W    ; READ RX FIFO!
  370.         CALL    PRNTCH      ; Print recieved char on LCD
  371.         RETURN  FAST
  372.        
  373. ESINIT      MOVLW   B'00100000' ; Enable transmit and choose low baud rate
  374.         MOVWF   TXSTA       ; write to reg
  375.         MOVLW   B'10010000' ; Enable recieve and serial port itself
  376.         MOVWF   RCSTA
  377.         MOVLW   D'15'       ; 9600 bps (Fosc / (64 * Speed) - 1)
  378.         MOVWF   SPBRG       ; write to reg
  379.         BCF TRISC, TX   ; Make TX pin of PORTC output
  380.         BSF TRISC, RX   ; Make RX pin of PORTC input
  381.        
  382.         BSF RCSTA, SPEN ; Enable the serial port
  383.        
  384.         BSF PIE1, RCIE  ; Enable recice interrupt enable
  385.         BSF INTCON, PEIE ; Enable peripheral interrupt enable
  386.         RETURN
  387.        
  388. ESWRITE     BTFSS   PIR1,TXIF   ; WRITE, POLLED, BUSY?
  389.         GOTO    ESWRITE     ; YES : CHECK AGAIN...
  390.         MOVWF   TXREG       ; NO! : WRITE CHAR &
  391.         RETURN          ;       RETURN!
  392. ;*** END Serial Toolbox **************************
  393.        
  394. MAIN        CALL        EC8INIT
  395.         CALL        E88INIT
  396.         CALL        EKINIT
  397.         CALL        ELINIT
  398.         CALL        ELCDINIT
  399.         CALL        ESINIT
  400.         LFSR        1,S88DISP
  401.         BSF     INTCON, GIE ; < Allow Global interrupt! >
  402.        
  403.         MOVLW   low(LCDTEXT)
  404.         MOVWF   TBLPTRL         ; Load in to TABLPTRL
  405.         MOVLW   high(LCDTEXT)   ; Get high byte of code table
  406.         MOVWF   TBLPTRH         ; Load in to TABLEPTRH          ; Fetch data from TABLPTR
  407.         CALL    LOADMSG
  408.                
  409.        
  410. LOOP        CLRF        PORTD       ; Clear PORTD      
  411.         CALL        EC8NEXT     ; Advance to and activate next column
  412.         CALL        EKDOWNQ     ; Check if any key in column is pressed
  413.         BTFSS       WREG,7      ; Button pressed?                                          
  414.         CALL        BTN_PRESS   ;    ... yes, call BTN_PRESS
  415.         CALL        EC8FREE     ; Turn off all columns
  416.         MOVF        IKTEMP, W   ; Move last pressed key to work
  417.         CALL        GET_NRCODE  ; Look up 7seg code in table
  418.         MOVWF       PORTD       ; Present code on PORTD
  419.         BSF     PORTA, RA1  ; Activate Column 0
  420.         CALL        ED10MS      ; Let it glow for a while..
  421.         BCF     PORTA, RA1  ; Turn off Column 0
  422.        
  423.         GOTO        LOOP
  424.  
  425.        
  426. BTN_PRESS   CALL        GET_ASCIICODE   ; Get ASCII for button number
  427.         CALL        ESWRITE     ; Send ASCII over serial port
  428.         RETURN
  429.        
  430. GET_ASCIICODE   RLNCF   WREG            ; Multiplay WREG with 2
  431.         MOVWF   TBLPTRL         ; Load in to TABLPTRL
  432.         MOVLW   high(ASCIICODES)    ; Get high byte of code table
  433.         MOVWF   TBLPTRH         ; Load in to TABLEPTRH
  434.         TBLRD*              ; Fetch data from TABLPTR
  435.         MOVF    TABLAT, W       ; Load fetched data to work
  436.         RETURN     
  437.        
  438. GET_NRCODE  RLNCF   WREG            ; Multiplay WREG with 2
  439.         MOVWF   TBLPTRL         ; Load in to TABLPTRL
  440.         MOVLW   high(NUMBERCODES)   ; Get high byte of code table
  441.         MOVWF   TBLPTRH         ; Load in to TABLEPTRH
  442.         TBLRD*              ; Fetch data from TABLPTR
  443.         MOVF    TABLAT, W       ; Load fetched data to work
  444.         RETURN
  445.        
  446. NUMBERCODES org 0x500   ; 7seg TABLE
  447.         DB      B'00111111' ; 0
  448.         DB      B'00000110' ; 1
  449.         DB      B'01011011' ; 2
  450.         DB      B'01001111' ; 3
  451.         DB      B'01100110' ; 4
  452.         DB      B'01101101' ; 5
  453.         DB      B'01111100' ; 6
  454.         DB      B'00000111' ; 7
  455.         DB      B'01111111' ; 8
  456.         DB      B'01100111' ; 9
  457.         DB      B'01110111' ; A
  458.         DB      B'01111100' ; b
  459.         DB      B'00111001' ; C
  460.         DB      B'01011110' ; d
  461.         DB      B'01111001' ; E
  462.         DB      B'01110001' ; F
  463.        
  464. ASCIICODES  org 0x600   ; ASCII Table
  465.         DB      B'00110000' ; 0
  466.         DB      B'00110001' ; 1
  467.         DB      B'00110010' ; 2
  468.         DB      B'00110011' ; 3
  469.         DB      B'00110100' ; 4
  470.         DB      B'00110101' ; 5
  471.         DB      B'00110110' ; 6
  472.         DB      B'00110111' ; 7
  473.         DB      B'00111000' ; 8
  474.         DB      B'00111001' ; 9
  475.         DB      B'01000001' ; A
  476.         DB      B'01000010' ; b
  477.         DB      B'01000011' ; C
  478.         DB      B'01000100' ; d
  479.         DB      B'01000101' ; E
  480.         DB      B'01000110' ; F
  481.  
  482. LCDTEXT     org 0x700
  483.         DB      "Recieved: ", 0x00
  484.        
  485.         END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement