fork download
  1. ;Hand Data Terminal for FADEC
  2. list p = 16f627a
  3. include "P16f627a.inc"
  4. __CONFIG 0x1f14
  5.  
  6. lcdbuf equ 0x20 ;0x20...0x3f 32bytes for LCD buffer
  7.  
  8. ;-----------------------------global registers starting at 0x70------------------------------
  9.  
  10. rxbuf equ 0x70 ;serial reception buffer
  11. debounce equ 0x71 ;debounce counter for keys
  12. txbuf equ 0x72 ;transmit buffer holds code to be sent when key pressed
  13. txcnt equ 0x73 ;transmitted byte counter
  14. W_temp equ 0x74
  15. STA_temp equ 0x75
  16. FSR_temp equ 0x76
  17. rxcnt equ 0x77 ;received byte counter
  18. delay_h equ 0x78
  19. delay_l equ 0x79
  20. lcdcnt equ 0x7a
  21. baud_h equ 0x7b
  22. baud_l equ 0x7c
  23. baudcnt equ 0x7d
  24. remap equ 0x7e ;temporary register for remapping characters
  25.  
  26. org 0
  27. GOTO starthere
  28.  
  29. org 0x04
  30. isr0
  31. BTFSS STATUS, RP0
  32. GOTO isr1
  33. BCF STATUS, RP0
  34. MOVWF W_temp
  35. BSF STATUS, RP0
  36. MOVF STATUS, W
  37. BCF STATUS, RP0
  38. GOTO isr2
  39.  
  40. isr1
  41. MOVWF W_temp
  42. MOVF STATUS, W
  43.  
  44. isr2
  45. MOVWF STA_temp
  46. MOVF FSR, W
  47. MOVWF FSR_temp
  48. BCF STATUS, RP0
  49. BTFSS INTCON, RBIF
  50. GOTO isr7
  51. BSF STATUS, RP0
  52. BSF TRISB, 0x04
  53. BSF TRISB, 0x05
  54. BSF TRISB, 0x06
  55. BSF TRISB, 0x07
  56. BCF OPTION_REG, NOT_RBPU
  57. BCF STATUS, RP0
  58. MOVF PORTB, W
  59. BCF INTCON, RBIF
  60. COMF PORTB, W
  61. ANDLW 0xf0
  62. BTFSC STATUS, Z
  63. GOTO isr6
  64. MOVLW 0x04
  65. MOVWF debounce
  66.  
  67. ;check for pressed keys
  68. BTFSC PORTB, 0x07
  69. GOTO isr3
  70. MOVLW 0x41 ;DATA + pressed, send 0x41
  71. MOVWF txbuf
  72. GOTO isr5
  73. isr3
  74. BTFSC PORTB, 0x06
  75. GOTO isr4
  76. MOVLW 0x42 ;DATA - pressed, send 0x42
  77. MOVWF txbuf
  78. GOTO isr5
  79. isr4
  80. BTFSS PORTB, 0x05
  81. MOVLW 0x44 ;MENU - pressed, send 0x44
  82. BTFSS PORTB, 0x04
  83. MOVLW 0x43 ;MENU + pressed, send 0x43
  84.  
  85. isr5
  86. MOVWF txbuf
  87. CLRF txcnt
  88. MOVLW 0xde ;
  89. MOVWF TXREG
  90. BSF STATUS, RP0 ;enable serial transmit interrupt
  91. BSF PIE1, TXIE
  92. BCF STATUS, RP0
  93. isr6
  94. BCF INTCON, RBIF
  95.  
  96. ;Serial communication interrupt
  97. isr7
  98. BTFSS PIR1, RCIF
  99. GOTO isr13
  100. CLRWDT
  101. MOVF RCREG, W
  102. MOVWF rxbuf ;store received byte in rxbuf
  103. MOVF rxcnt, W
  104. BTFSS STATUS, Z
  105. GOTO isr8
  106.  
  107. MOVF rxbuf, W ;check for first data block alignment byte
  108. SUBLW 0xfc
  109. BTFSS STATUS, Z
  110. GOTO isr12
  111. INCF rxcnt, F
  112. GOTO isr12
  113. isr8
  114. DECF rxcnt, W
  115. BTFSS STATUS, Z
  116. GOTO isr9
  117. MOVF rxbuf, W ;check for second data block alignment byte
  118. SUBLW 0xfd
  119. BTFSS STATUS, Z
  120. GOTO isr11
  121. INCF rxcnt, F
  122. GOTO isr12
  123. isr9
  124. MOVF rxcnt, W ;store receiverd serial data to RAM starting at 0x20
  125. ADDLW (lcdbuf - 2) ;(0x1e + 2)
  126. MOVWF FSR
  127. MOVF rxbuf, W
  128. MOVWF INDF
  129. INCF rxcnt, F
  130. MOVLW 0x32
  131. SUBWF rxcnt, W
  132. BTFSS STATUS, Z
  133. GOTO isr12
  134. CLRF rxcnt
  135. MOVLW 0x4
  136. SUBWF txcnt, W
  137. BTFSS STATUS, Z
  138. GOTO isr12
  139. BTFSS PORTB, 0x6
  140. GOTO isr10
  141. BTFSC PORTB, 0x7
  142. GOTO isr12
  143. isr10
  144. DECFSZ debounce, F
  145. GOTO isr12
  146. INCF debounce, F
  147. CLRF txcnt
  148. MOVLW 0xde
  149. MOVWF TXREG
  150. BSF STATUS, RP0
  151. BSF PIE1, TXIE
  152. BCF STATUS, RP0
  153. GOTO isr12
  154.  
  155.  
  156. isr11
  157. CLRF rxcnt
  158. isr12
  159. BCF PIR1, RCIF
  160. isr13
  161. BTFSS PIR1, TXIF
  162. GOTO isr18
  163. BSF STATUS, RP0
  164. BTFSS PIE1, TXIE
  165. GOTO isr18
  166. BCF STATUS, RP0
  167. MOVF txcnt, W
  168. BTFSS STATUS, Z
  169. GOTO isr14
  170. MOVLW 0xdf
  171. MOVWF TXREG
  172. INCF txcnt, F
  173. GOTO isr17
  174.  
  175.  
  176. isr14
  177. DECF txcnt, W
  178. BTFSS STATUS, Z
  179. GOTO isr15
  180. MOVLW 0x70
  181. MOVWF TXREG
  182. INCF txcnt, F
  183. GOTO isr17
  184.  
  185.  
  186. isr15
  187. MOVLW 0x2
  188. SUBWF txcnt, W
  189. BTFSS STATUS, Z
  190. GOTO isr16
  191. MOVF txbuf, W
  192. MOVWF TXREG
  193. INCF txcnt, F
  194. GOTO isr17
  195.  
  196.  
  197. isr16
  198. MOVLW 0x70
  199. ADDWF txbuf, W
  200. MOVWF TXREG
  201. INCF txcnt, F
  202. BSF STATUS, RP0
  203. BCF PIE1, TXIE
  204. BCF STATUS, RP0
  205. isr17
  206. BCF PIR1, TXIF
  207. isr18
  208. BCF STATUS, RP0
  209. MOVF FSR_temp, W
  210. MOVWF FSR
  211. MOVF STA_temp, W
  212. MOVWF STATUS
  213. MOVF W_temp, W
  214. RETFIE
  215.  
  216.  
  217. ;--------------------------------------initialisation-------------------------------------------
  218. ;main code starts here
  219. ; org 0x9a
  220. starthere
  221. BCF INTCON, GIE
  222. BSF STATUS, RP0
  223. MOVLW 0xf7
  224. MOVWF TRISB
  225. MOVLW 0x10
  226. MOVWF TRISA ;make PORTA,4 input
  227. ; BSF TRISB, 0x0
  228. ; BSF TRISB, 0x4
  229. ; BSF TRISB, 0x5
  230. ; BSF TRISB, 0x6
  231. ; BSF TRISB, 0x7
  232. BCF OPTION_REG, NOT_RBPU
  233. BCF STATUS, RP0
  234. MOVLW 0x20
  235. MOVWF FSR
  236. init1 ;clear RAM page 0
  237. CLRF INDF
  238. INCF FSR, F
  239. MOVF FSR, W
  240. SUBLW 0x7f
  241. BTFSS STATUS, Z
  242. GOTO init1
  243.  
  244. CLRF PORTA ;Initialize PORTA by
  245. ;setting
  246. ;output data latches
  247. MOVLW 0x07 ;Turn comparators off and
  248. MOVWF CMCON ;enable pins for I/O
  249. ;functions
  250. ; BSF STATUS, RP0
  251. ; MOVLW 0x10
  252. ; MOVWF TRISA ;make PORTA,4 input
  253. ; BSF TRISB, 0
  254. ; BCF TRISB, 3
  255. ; BCF STATUS, RP0
  256. BCF PORTB, 3
  257. CLRF PORTA
  258. CALL wait200
  259. CALL wait200
  260. MOVLW 0x03 ;initialise LCD
  261. MOVWF PORTA
  262. CALL lcd_strobe
  263. CALL wait200
  264. CALL lcd_strobe
  265. CALL wait1d5
  266. CALL lcd_strobe
  267. CALL wait1d5
  268. MOVLW 0x02
  269. MOVWF PORTA
  270. CALL lcd_strobe
  271. CALL wait1d5
  272. MOVLW 0x28
  273. CALL lcd_cntl
  274. CALL wait1d5
  275. MOVLW 0x0c
  276. CALL lcd_cntl
  277. CALL wait1d5
  278. MOVLW 0x06
  279. CALL lcd_cntl
  280. CALL wait1d5
  281.  
  282.  
  283. ; display start screen from table
  284. strtscrn
  285. MOVLW 0x01
  286. MOVWF lcdcnt
  287. strtscrn1
  288. CLRF baudcnt ;copy table constant to LCD frame buffer RAM
  289. MOVLW 0x4f ;from 0x50~0x6f to display start screen
  290. MOVWF baud_l
  291. strtscrn2
  292. INCF baud_l, F
  293. MOVF baud_l, W
  294. MOVWF FSR
  295. MOVF baudcnt, W
  296. CALL table
  297. MOVWF INDF
  298. INCF baudcnt, F
  299. MOVF baudcnt, W
  300. SUBLW 0x20
  301. BTFSC STATUS, Z
  302. GOTO strtscrn3
  303. GOTO strtscrn2
  304.  
  305. strtscrn3
  306. CALL fb2lcd
  307. CALL wait200
  308. DECFSZ lcdcnt, F
  309. GOTO strtscrn1
  310.  
  311. ;auto baud routine
  312. baud
  313. ; GOTO baud10 ;***skip auto baud -- manual selection
  314. MOVLW 0x19
  315. MOVWF baudcnt
  316. baud0 ;wait for some activity on the RxD line (24 cycles)
  317. DECFSZ baudcnt, F
  318. GOTO baud1
  319. GOTO baud4 ;after 24 cycles start actual measurement
  320.  
  321.  
  322. baud1
  323. CLRWDT
  324. baud2 ;wait till RxD is low
  325. BTFSC PORTB, 0
  326. GOTO baud2
  327. baud3
  328. BTFSS PORTB, 0 ;wait till RxD is high
  329. GOTO baud3
  330. GOTO baud0
  331. ;--------------------------- after 24 signal toggles on RxD come here, RxD is high ------------------------
  332. baud4
  333. MOVLW 0xff
  334. MOVWF baud_h
  335. MOVWF baud_l
  336. MOVLW 0x19
  337. MOVWF baudcnt
  338. baud5
  339. DECFSZ baudcnt, F
  340. GOTO baud6
  341. GOTO baud10
  342.  
  343. baud6
  344. MOVLW 0x20
  345. MOVWF T1CON ;run timer 1 at 1/4 Fcyc
  346. CLRF TMR1L
  347. CLRF TMR1H
  348. baud7
  349. BTFSC PORTB, 0 ;wait till RxD goes low
  350. GOTO baud7
  351. BSF T1CON, 0 ;start timer1
  352. baud8
  353. BTFSS PORTB, 0
  354. GOTO baud8 ;wait till RxD goes high
  355. BCF T1CON, 0 ;stop timer1
  356. MOVF TMR1L, W
  357. SUBWF baud_l, W
  358. MOVF TMR1H, W
  359. BTFSS STATUS, C
  360. INCF TMR1H, W
  361. SUBWF baud_h, W
  362. BTFSS STATUS, C
  363. GOTO baud9
  364. MOVF TMR1L, W
  365. MOVWF baud_l
  366. MOVF TMR1H, W
  367. MOVWF baud_h
  368. baud9
  369. GOTO baud5
  370.  
  371. baud10 ;baud rate is evaluated
  372. MOVF baud_l, W
  373. BSF STATUS, RP0
  374. ; MOVLW 103 ;*** test 2400 Baud manually
  375. MOVWF SPBRG ;write baud rate register
  376. BSF TXSTA, TXEN ;configure serial port
  377. BSF TXSTA, BRGH
  378. BSF TRISB, 1
  379. BSF TRISB, 2
  380. BCF PIE1, TXIE
  381. BSF PIE1, RCIE
  382. BCF STATUS, RP0
  383. BSF RCSTA, SPEN
  384. BSF RCSTA, CREN
  385. BSF INTCON, PEIE ;enable interrupts
  386. BSF INTCON, GIE
  387.  
  388. ;-----------------------------from here interrupts are active---------------------------------
  389. ;here we go
  390.  
  391. rxlcd1
  392. MOVLW 0x22
  393. SUBWF rxcnt, W
  394. BTFSS STATUS, Z
  395. GOTO rxlcd1 ;wait until 34 bytes of data have been received
  396. MOVLW 0x1f
  397. MOVWF lcdcnt
  398. rxlcd2 ;copy displayable part of received data to frame buffer RAM
  399. INCF lcdcnt, F
  400. MOVF lcdcnt, W
  401. MOVWF FSR
  402. MOVF INDF, W
  403. MOVWF baud_h
  404. MOVLW 0x30
  405. ADDWF FSR, F
  406. MOVF baud_h, W
  407. MOVWF INDF
  408. MOVF lcdcnt, W
  409. SUBLW 0x3f
  410. BTFSS STATUS, Z
  411. GOTO rxlcd2
  412. CALL fb2lcd
  413. GOTO rxlcd1
  414.  
  415.  
  416. ;subroutines start here
  417.  
  418.  
  419. ;delay by 200ms
  420. wait200
  421. MOVLW 0xff
  422. MOVWF delay_h
  423. CLRF delay_l
  424. wait2001
  425. DECFSZ delay_l, F
  426. GOTO wait2001
  427. DECFSZ delay_h, F
  428. GOTO wait2001
  429. RETURN
  430.  
  431.  
  432. ;delay by 1.5ms
  433. wait1d5
  434. MOVLW 0x2
  435. MOVWF delay_h
  436. CLRF delay_l
  437. wait1d51
  438. DECFSZ delay_l, F
  439. GOTO wait1d51
  440. DECFSZ delay_h, F
  441. GOTO wait1d51
  442. RETURN
  443.  
  444. ;copy frame buffer contents to LCD
  445. fb2lcd
  446. MOVLW 0x80
  447. CALL lcd_cntl ;move cursor to address 0
  448. CLRF baudcnt
  449. MOVLW 0x4f
  450. MOVWF baud_l
  451. fb2lcd1
  452. INCF baud_l, F
  453. MOVF baud_l, W
  454. MOVWF FSR
  455. MOVF INDF, W
  456. CALL lcd_write
  457. INCF baudcnt, F
  458. MOVF baudcnt, W
  459. SUBLW 0x10
  460. BTFSC STATUS, Z
  461. GOTO fb2lcd2
  462. GOTO fb2lcd1
  463. fb2lcd2
  464. MOVLW 0xc0 ;***LCD second line
  465. ;was MOVLW 0xa8
  466. CALL lcd_cntl
  467. fb2lcd3
  468. INCF baud_l, F
  469. MOVF baud_l, W
  470. MOVWF FSR
  471. MOVF INDF, W
  472. CALL lcd_write
  473. INCF baudcnt, F
  474. MOVF baudcnt, W
  475. SUBLW 0x20
  476. BTFSC STATUS, Z
  477. GOTO fb2lcd4
  478. GOTO fb2lcd3
  479. fb2lcd4
  480. RETURN
  481.  
  482.  
  483. ;send enable to LCD (E)
  484. lcd_strobe
  485. BSF PORTA, 7
  486. NOP
  487. NOP
  488. NOP
  489. BCF PORTA, 7
  490. RETURN
  491.  
  492. ;send control byte to LCD
  493. lcd_cntl
  494. BCF PORTB,3
  495. MOVWF delay_l
  496. SWAPF delay_l, W
  497. ANDLW 0x0f
  498. MOVWF PORTA
  499. CALL lcd_strobe
  500. MOVF delay_l, W
  501. ANDLW 0x0f
  502. MOVWF PORTA
  503. CALL lcd_strobe
  504. CALL wait1d5
  505. CALL wait1d5
  506. CALL wait1d5
  507. RETURN
  508.  
  509.  
  510. ;send displayable data byte to LCD
  511. lcd_write
  512. ;-------- character remapping for " " and " " for PowerTip LCD ---------------
  513. MOVWF remap ;temporarily store value
  514. SUBLW 0xdf ;check for " " character
  515. BTFSS STATUS,Z
  516. GOTO remap1
  517. MOVLW 0xd2
  518. GOTO remap3
  519. remap1
  520. MOVF remap,W
  521. SUBLW 0xe4 ;check for " " character
  522. BTFSS STATUS,Z
  523. GOTO remap2
  524. MOVLW 0xc8
  525. GOTO remap3
  526. remap2
  527. MOVF remap,W
  528. remap3
  529. ;--------------------------- character remapping finished -----------------------------
  530. BSF PORTB, 3
  531. MOVWF delay_l
  532. SWAPF delay_l, W
  533. ANDLW 0x0f
  534. MOVWF PORTA
  535. CALL lcd_strobe
  536. MOVF delay_l, W
  537. ANDLW 0x0f
  538. MOVWF PORTA
  539. CALL lcd_strobe
  540. CALL wait1d5
  541. BCF PORTB, 3
  542. RETURN
  543.  
  544.  
  545. ;start screen lookup table
  546. org 0x300
  547. table
  548. MOVWF baud_h
  549. MOVLW 0x3
  550. MOVWF PCLATH
  551. MOVF baud_h, W
  552. ADDWF PCL, F
  553. RETLW 0x54 ;T
  554. RETLW 0x65 ;e
  555. RETLW 0x72 ;r
  556. RETLW 0x6d ;m
  557. RETLW 0x69 ;i
  558. RETLW 0x6e ;n
  559. RETLW 0x61 ;a
  560. RETLW 0x6c ;l
  561. RETLW 0x20 ;_
  562. RETLW 0x56 ;V
  563. RETLW 0x20 ;_
  564. RETLW 0x31 ;1
  565. RETLW 0x2e ;.
  566. RETLW 0x31 ;1
  567. RETLW 0x20 ;_
  568. RETLW 0x20 ;_
  569. RETLW 0x43 ;C
  570. RETLW 0x6f ;o
  571. RETLW 0x6e ;n
  572. RETLW 0x6e ;n
  573. RETLW 0x65 ;e
  574. RETLW 0x63 ;c
  575. RETLW 0x74 ;t
  576. RETLW 0x69 ;i
  577. RETLW 0x6e ;n
  578. RETLW 0x67 ;g
  579. RETLW 0x2e ;.
  580. RETLW 0x2e ;.
  581. RETLW 0x2e ;.
  582. RETLW 0x20 ;_
  583. RETLW 0x20 ;_
  584. RETLW 0x20 ;_
  585.  
  586.  
  587.  
Success #stdin #stdout 0.02s 25656KB
stdin
Standard input is empty
stdout
;Hand Data Terminal for FADEC
                                            list         p = 16f627a
                                            include "P16f627a.inc"
                                            __CONFIG   0x1f14

lcdbuf                 equ                      0x20                    ;0x20...0x3f 32bytes for LCD buffer

;-----------------------------global registers starting at 0x70------------------------------

rxbuf                    equ                      0x70                    ;serial reception buffer
debounce          equ                      0x71                    ;debounce counter for keys
txbuf                    equ                      0x72                    ;transmit buffer holds code to be sent when key pressed
txcnt                    equ                      0x73                    ;transmitted byte counter
W_temp              equ                      0x74
STA_temp          equ                      0x75
FSR_temp          equ                      0x76
rxcnt                    equ                      0x77                    ;received byte counter
delay_h               equ                      0x78
delay_l                equ                      0x79
lcdcnt                 equ                      0x7a
baud_h               equ                      0x7b
baud_l                equ                      0x7c
baudcnt             equ                      0x7d
remap                 equ                      0x7e                    ;temporary register for remapping characters

               org         0
               GOTO   starthere            

               org         0x04
isr0
               BTFSS   STATUS,              RP0                      
               GOTO   isr1                      
               BCF       STATUS,              RP0       
               MOVWF              W_temp
               BSF       STATUS,              RP0
               MOVF   STATUS,              W                          
               BCF       STATUS,              RP0       
               GOTO   isr2                      

isr1
               MOVWF              W_temp
               MOVF   STATUS,              W                          

isr2
               MOVWF              STA_temp
               MOVF   FSR,      W                          
               MOVWF              FSR_temp
               BCF       STATUS,              RP0       
               BTFSS   INTCON,            RBIF      
               GOTO   isr7        
               BSF       STATUS,              RP0       
               BSF       TRISB,  0x04                    
               BSF       TRISB,  0x05                    
               BSF       TRISB,  0x06                    
               BSF       TRISB,  0x07                    
               BCF       OPTION_REG,  NOT_RBPU
               BCF       STATUS,              RP0       
               MOVF   PORTB,               W
               BCF       INTCON,            RBIF
               COMF   PORTB,               W
               ANDLW               0xf0
               BTFSC  STATUS,              Z                           
               GOTO   isr6        
               MOVLW              0x04     
               MOVWF              debounce

;check for pressed keys
               BTFSC  PORTB,               0x07
               GOTO   isr3
               MOVLW              0x41                                                  ;DATA + pressed, send 0x41
               MOVWF              txbuf
               GOTO   isr5        
isr3
               BTFSC  PORTB,               0x06
               GOTO   isr4        
               MOVLW              0x42                                                  ;DATA - pressed, send 0x42
               MOVWF              txbuf
               GOTO   isr5        
isr4
               BTFSS   PORTB,               0x05
               MOVLW              0x44                                                  ;MENU - pressed, send 0x44
               BTFSS   PORTB,               0x04
               MOVLW              0x43                                                  ;MENU + pressed, send 0x43

isr5
               MOVWF              txbuf
               CLRF     txcnt     
               MOVLW              0xde                                                  ;
               MOVWF              TXREG                
               BSF       STATUS,              RP0                                     ;enable serial transmit interrupt
               BSF       PIE1,     TXIE
               BCF       STATUS,              RP0       
isr6
               BCF       INTCON,            RBIF

;Serial communication interrupt
isr7
               BTFSS   PIR1,     RCIF
               GOTO   isr13     
               CLRWDT            
               MOVF   RCREG,              W
               MOVWF              rxbuf                                                 ;store received byte in rxbuf
               MOVF   rxcnt,    W           
               BTFSS   STATUS,              Z                           
               GOTO   isr8
               
               MOVF   rxbuf,    W                                                       ;check for first data block alignment byte
               SUBLW 0xfc
               BTFSS   STATUS,              Z                           
               GOTO   isr12     
               INCF     rxcnt,    F             
               GOTO   isr12     
isr8
               DECF    rxcnt,    W           
               BTFSS   STATUS,              Z                           
               GOTO   isr9        
               MOVF   rxbuf,    W                                                       ;check for second data block alignment byte
               SUBLW 0xfd
               BTFSS   STATUS,              Z                           
               GOTO   isr11     
               INCF     rxcnt,    F             
               GOTO   isr12     
isr9
               MOVF   rxcnt,    W                                                       ;store receiverd serial data to RAM starting at 0x20
               ADDLW               (lcdbuf - 2)                       ;(0x1e + 2)
               MOVWF              FSR       
               MOVF   rxbuf,    W           
               MOVWF              INDF
               INCF     rxcnt,    F             
               MOVLW              0x32
               SUBWF               rxcnt,    W
               BTFSS   STATUS,              Z                           
               GOTO   isr12     
               CLRF     rxcnt     
               MOVLW              0x4        
               SUBWF               txcnt,    W
               BTFSS   STATUS,              Z                           
               GOTO   isr12     
               BTFSS   PORTB,               0x6
               GOTO   isr10     
               BTFSC  PORTB,               0x7
               GOTO   isr12     
isr10
               DECFSZ              debounce,         F                           
               GOTO   isr12     
               INCF     debounce,         F             
               CLRF     txcnt     
               MOVLW              0xde
               MOVWF              TXREG                
               BSF       STATUS,              RP0       
               BSF       PIE1,     TXIE
               BCF       STATUS,              RP0       
               GOTO   isr12     


isr11
               CLRF     rxcnt     
isr12
               BCF       PIR1,     RCIF
isr13
               BTFSS   PIR1,     TXIF       
               GOTO   isr18     
               BSF       STATUS,              RP0       
               BTFSS   PIE1,     TXIE      
               GOTO   isr18     
               BCF       STATUS,              RP0       
               MOVF   txcnt,    W           
               BTFSS   STATUS,              Z             
               GOTO   isr14     
               MOVLW              0xdf
               MOVWF              TXREG                
               INCF     txcnt,    F             
               GOTO   isr17     


isr14
               DECF    txcnt,    W           
               BTFSS   STATUS,              Z                           
               GOTO   isr15     
               MOVLW              0x70
               MOVWF              TXREG                
               INCF     txcnt,    F             
               GOTO   isr17     


isr15
               MOVLW              0x2        
               SUBWF               txcnt,    W
               BTFSS   STATUS,              Z                           
               GOTO   isr16     
               MOVF   txbuf,    W           
               MOVWF              TXREG                
               INCF     txcnt,    F             
               GOTO   isr17     


isr16
               MOVLW              0x70
               ADDWF               txbuf,    W
               MOVWF              TXREG                
               INCF     txcnt,    F             
               BSF       STATUS,              RP0       
               BCF       PIE1,     TXIE
               BCF       STATUS,              RP0
isr17
               BCF       PIR1,     TXIF
isr18
               BCF       STATUS,              RP0       
               MOVF   FSR_temp,         W           
               MOVWF              FSR       
               MOVF   STA_temp,         W           
               MOVWF              STATUS               
               MOVF   W_temp,            W           
               RETFIE 


;--------------------------------------initialisation-------------------------------------------
;main code starts here
;              org         0x9a
starthere
               BCF       INTCON,            GIE        
               BSF       STATUS,              RP0       
               MOVLW 0xf7
               MOVWF TRISB
               MOVLW 0x10
               MOVWF TRISA                               ;make PORTA,4 input
;              BSF       TRISB, 0x0
;              BSF       TRISB,  0x4                       
;              BSF       TRISB,  0x5                       
;              BSF       TRISB,  0x6                       
;              BSF       TRISB,  0x7        
               BCF       OPTION_REG,  NOT_RBPU
               BCF       STATUS,              RP0       
               MOVLW              0x20
               MOVWF              FSR       
init1                                                                                               ;clear RAM page 0
               CLRF     INDF     
               INCF     FSR,      F                           
               MOVF   FSR,      W                          
               SUBLW 0x7f
               BTFSS   STATUS,              Z                           
               GOTO   init1
               
               CLRF     PORTA                                              ;Initialize PORTA by
                                                                                                                      ;setting
                                                                                                                      ;output data latches
               MOVLW              0x07                                   ;Turn comparators off and
               MOVWF              CMCON                            ;enable pins for I/O
                                                                                                                      ;functions
;              BSF       STATUS,              RP0       
;              MOVLW 0x10
;              MOVWF TRISA                               ;make PORTA,4 input
;              BSF       TRISB,  0            
;              BCF       TRISB,  3                           
;              BCF       STATUS,              RP0       
               BCF       PORTB,               3
               CLRF     PORTA                
               CALL     wait200
               CALL     wait200
               MOVLW              0x03                                   ;initialise LCD
               MOVWF              PORTA                
               CALL     lcd_strobe
               CALL     wait200
               CALL     lcd_strobe
               CALL     wait1d5
               CALL     lcd_strobe
               CALL     wait1d5
               MOVLW              0x02     
               MOVWF              PORTA                
               CALL     lcd_strobe
               CALL     wait1d5
               MOVLW              0x28
               CALL     lcd_cntl
               CALL     wait1d5
               MOVLW              0x0c      
               CALL     lcd_cntl
               CALL     wait1d5
               MOVLW              0x06     
               CALL     lcd_cntl
               CALL     wait1d5


; display start screen from table
strtscrn
               MOVLW              0x01     
               MOVWF              lcdcnt
strtscrn1
               CLRF     baudcnt                                           ;copy table constant to LCD frame buffer RAM
               MOVLW              0x4f                                    ;from 0x50~0x6f to display start screen
               MOVWF              baud_l
strtscrn2
               INCF     baud_l, F             
               MOVF   baud_l, W           
               MOVWF              FSR       
               MOVF   baudcnt,            W           
               CALL     table
               MOVWF              INDF
               INCF     baudcnt,            F             
               MOVF   baudcnt,            W           
               SUBLW 0x20
               BTFSC  STATUS,              Z                           
               GOTO   strtscrn3
               GOTO   strtscrn2

strtscrn3
               CALL     fb2lcd
               CALL     wait200
               DECFSZ              lcdcnt, F                           
               GOTO   strtscrn1

;auto baud routine
baud
;              GOTO   baud10                                                           ;***skip auto baud -- manual selection
               MOVLW              0x19
               MOVWF              baudcnt
baud0                                                                                           ;wait for some activity on the RxD line (24 cycles)
               DECFSZ              baudcnt,            F                           
               GOTO   baud1  
               GOTO   baud4                                               ;after 24 cycles start actual measurement


baud1
               CLRWDT            
baud2                                                                                           ;wait till RxD is low
               BTFSC  PORTB,               0
               GOTO   baud2  
baud3
               BTFSS   PORTB,               0                                          ;wait till RxD is high
               GOTO   baud3  
               GOTO   baud0  
;--------------------------- after 24 signal toggles on RxD come here, RxD is high ------------------------
baud4
               MOVLW              0xff
               MOVWF              baud_h
               MOVWF              baud_l
               MOVLW              0x19
               MOVWF              baudcnt
baud5
               DECFSZ              baudcnt,            F                           
               GOTO   baud6
               GOTO   baud10               

baud6
               MOVLW              0x20
               MOVWF              T1CON                                             ;run timer 1 at 1/4 Fcyc
               CLRF     TMR1L
               CLRF     TMR1H
baud7
               BTFSC  PORTB,               0                                                         ;wait till RxD goes low
               GOTO   baud7  
               BSF       T1CON,              0                                                         ;start timer1
baud8
               BTFSS   PORTB,               0
               GOTO   baud8                                                             ;wait till RxD goes high
               BCF       T1CON,              0                                                         ;stop timer1
               MOVF   TMR1L, W
               SUBWF               baud_l, W
               MOVF   TMR1H,              W
               BTFSS   STATUS,              C            
               INCF     TMR1H,              W
               SUBWF               baud_h,              W                          
               BTFSS   STATUS,              C            
               GOTO   baud9  
               MOVF   TMR1L, W
               MOVWF              baud_l
               MOVF   TMR1H,              W
               MOVWF              baud_h
baud9
               GOTO   baud5

baud10                                                                                                                      ;baud rate is evaluated
               MOVF   baud_l, W
               BSF       STATUS,              RP0       
;              MOVLW              103                                                                  ;*** test 2400 Baud manually           
               MOVWF              SPBRG                                             ;write baud rate register
               BSF       TXSTA, TXEN                                  ;configure serial port
               BSF       TXSTA, BRGH                  
               BSF       TRISB,  1                           
               BSF       TRISB,  2                           
               BCF       PIE1,     TXIE
               BSF       PIE1,     RCIE
               BCF       STATUS,              RP0       
               BSF       RCSTA, SPEN    
               BSF       RCSTA, CREN                  
               BSF       INTCON,            PEIE                     ;enable interrupts
               BSF       INTCON,            GIE        

;-----------------------------from here interrupts are active---------------------------------
;here we go

rxlcd1
               MOVLW              0x22
               SUBWF               rxcnt,    W
               BTFSS                  STATUS,              Z                           
               GOTO                  rxlcd1                                               ;wait until 34 bytes of data have been received
               MOVLW              0x1f
               MOVWF              lcdcnt
rxlcd2                                                                                           ;copy displayable part of received data to frame buffer RAM
               INCF     lcdcnt, F             
               MOVF   lcdcnt, W           
               MOVWF              FSR       
               MOVF   INDF,    W           
               MOVWF              baud_h
               MOVLW              0x30
               ADDWF               FSR,      F             
               MOVF   baud_h,              W           
               MOVWF              INDF
               MOVF   lcdcnt, W           
               SUBLW 0x3f
               BTFSS   STATUS,              Z                           
               GOTO   rxlcd2
               CALL     fb2lcd
               GOTO   rxlcd1


;subroutines start here


;delay by 200ms
wait200
               MOVLW              0xff
               MOVWF              delay_h
               CLRF     delay_l 
wait2001
               DECFSZ              delay_l,               F                           
               GOTO   wait2001
               DECFSZ              delay_h,             F                           
               GOTO   wait2001
               RETURN             


;delay by 1.5ms
wait1d5
               MOVLW              0x2        
               MOVWF              delay_h
               CLRF     delay_l 
wait1d51
               DECFSZ              delay_l,               F                           
               GOTO   wait1d51
               DECFSZ              delay_h,             F                           
               GOTO   wait1d51
               RETURN             

;copy frame buffer contents to LCD
fb2lcd
               MOVLW              0x80
               CALL     lcd_cntl                             ;move cursor to address 0
               CLRF     baudcnt             
               MOVLW              0x4f
               MOVWF              baud_l
fb2lcd1
               INCF     baud_l, F             
               MOVF   baud_l, W           
               MOVWF              FSR       
               MOVF   INDF,    W
               CALL     lcd_write
               INCF     baudcnt,            F             
               MOVF   baudcnt,            W           
               SUBLW 0x10
               BTFSC  STATUS,              Z                           
               GOTO   fb2lcd2
               GOTO   fb2lcd1
fb2lcd2
               MOVLW              0xc0                    ;***LCD second line
;was MOVLW    0xa8
               CALL     lcd_cntl
fb2lcd3
               INCF     baud_l, F             
               MOVF   baud_l, W           
               MOVWF              FSR       
               MOVF   INDF,    W           
               CALL     lcd_write
               INCF     baudcnt,            F             
               MOVF   baudcnt,            W           
               SUBLW 0x20
               BTFSC  STATUS,              Z                           
               GOTO   fb2lcd4
               GOTO   fb2lcd3
fb2lcd4
               RETURN             


;send enable to LCD (E)
lcd_strobe
               BSF       PORTA, 7            
               NOP      
               NOP      
               NOP      
               BCF       PORTA, 7            
               RETURN             

;send control byte to LCD
lcd_cntl
               BCF       PORTB,3
               MOVWF              delay_l
               SWAPF delay_l,               W
               ANDLW               0x0f       
               MOVWF              PORTA                
               CALL     lcd_strobe
               MOVF   delay_l,               W           
               ANDLW               0x0f       
               MOVWF              PORTA                
               CALL     lcd_strobe
               CALL     wait1d5
               CALL     wait1d5
               CALL     wait1d5
               RETURN             


;send displayable data byte to LCD
lcd_write
;-------- character remapping for " " and " " for PowerTip LCD  ---------------
               MOVWF remap                                            ;temporarily store value
               SUBLW 0xdf                                   ;check for " " character
               BTFSS   STATUS,Z
               GOTO   remap1
               MOVLW 0xd2
               GOTO   remap3
remap1
               MOVF   remap,W
               SUBLW 0xe4                                  ;check for " " character
               BTFSS   STATUS,Z
               GOTO   remap2
               MOVLW 0xc8
               GOTO   remap3
remap2
               MOVF   remap,W
remap3               
;--------------------------- character remapping finished -----------------------------
               BSF       PORTB,               3                           
               MOVWF              delay_l
               SWAPF delay_l,               W
               ANDLW               0x0f
               MOVWF              PORTA                
               CALL     lcd_strobe
               MOVF   delay_l,               W           
               ANDLW               0x0f
               MOVWF              PORTA                
               CALL     lcd_strobe
               CALL     wait1d5
               BCF       PORTB, 3                          
               RETURN             


;start screen lookup table
               org         0x300
table
               MOVWF              baud_h
               MOVLW              0x3        
               MOVWF              PCLATH              
               MOVF   baud_h,              W           
               ADDWF               PCL,      F             
               RETLW 0x54                    ;T
               RETLW 0x65                    ;e
               RETLW 0x72                    ;r
               RETLW 0x6d                    ;m
               RETLW 0x69                    ;i
               RETLW 0x6e                    ;n
               RETLW 0x61                    ;a
               RETLW 0x6c                    ;l
               RETLW 0x20                    ;_
               RETLW 0x56                    ;V
               RETLW 0x20                    ;_
               RETLW 0x31                    ;1
               RETLW 0x2e                    ;.
               RETLW 0x31                    ;1
               RETLW 0x20                    ;_
               RETLW 0x20                    ;_
               RETLW 0x43                    ;C
               RETLW 0x6f                     ;o
               RETLW 0x6e                    ;n
               RETLW 0x6e                    ;n
               RETLW 0x65                    ;e
               RETLW 0x63                    ;c
               RETLW 0x74                    ;t
               RETLW 0x69                    ;i
               RETLW 0x6e                    ;n
               RETLW 0x67                    ;g
               RETLW 0x2e                    ;.
               RETLW 0x2e                    ;.
               RETLW 0x2e                    ;.
               RETLW 0x20                    ;_
               RETLW 0x20                    ;_
               RETLW 0x20                    ;_


               end