LCD_ISR.s34
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:13k
源码类别:

uCOS

开发平台:

C/C++

  1. ; /*********************************************************************
  2. ; *                SEGGER MICROCONTROLLER SYSTEME GmbH                 *
  3. ; *        Solutions for real time microcontroller applications        *
  4. ; **********************************************************************
  5. ; *                                                                    *
  6. ; *           (C) 1996    SEGGER Microcontroller Systeme GmbH          *
  7. ; *                                                                    *
  8. ; *        Internet: www.segger.com    Support:  support@segger.com    *
  9. ; *                                                                    *
  10. ; **********************************************************************
  11. ; **** emWin/GSC Grafical user interface for embedded applications ****
  12. ; emWin is protected by international copyright laws. Knowledge of the
  13. ; source code may not be used to write a similar product. This file may
  14. ; only be used in accordance with a license and should not be re-
  15. ; distributed in any way. We appreciate your understanding and fairness.
  16. ; ----------------------------------------------------------------------
  17. ; File        : LCD_ISR.s34
  18. ; Purpose     : Interrupt service routine for 1/4/8-bit LCDs
  19. ; ----------------------------------------------------------------------
  20. ; Version-Date---Author-Explanation
  21. ; ----------------------------------------------------------------------
  22. ; 1.06a   000120 RS   a) finer (16 bit) granularity for data output
  23. ; 1.06    991227 RS   a) Support for DMA
  24. ; 1.04    991205 RS   a) Support for up to 120 bytes per line
  25. ; 1.02c   991112 RS   a) Support for 8 bit interfaces added
  26. ; 1.02b   990927 RS   a) LCDConf.h included
  27. ; 1.02a   990925 RS   a) ISR accelerated (app. 3%)
  28. ; 1.02    990830 RS   a) ISR accelerated using 16-bit loads and FB
  29. ;                        register
  30. ; 1.00.00 990824 RS   a) Config switch supplied for 1/4/8 bit interface,
  31. ;                        1/4 bit supported, 4 bit default
  32. ;                     b) Virtual screen/paging support added
  33. ; 0.50.00 990817 RS      First release usable on 4-bit 160*160 LCD
  34. ; ----------------------------------------------------------------------
  35. ; Known problems or limitations with current version:
  36. ; None.
  37. ; ----------------------------------------------------------------------
  38. ; Items for future improvement:
  39. ; ---------------------------END-OF-HEADER------------------------------
  40. #include "LCDConf.h"
  41. #if LCD_CONTROLLER == 0 && defined (LCD_USE_ISR_ASM) && LCD_USE_ISR_ASM
  42. PUBLIC LCD_X_Off
  43. PUBLIC LCD_X_On
  44. EXTERN LCD__apVRam:far, LCD__aTimerReload:far
  45. EXTERN  LCD__DispOff:far, LCD__BitsPerPixel:far
  46. RSEG CODE
  47. ; *********************************************************
  48. ; *
  49. ; *    Config defaults
  50. ; *
  51. ; *********************************************************
  52. #ifndef LCD_INTERFACEBITS
  53.   #define LCD_INTERFACEBITS 4
  54. #endif
  55. #ifndef LCD_USEDMA
  56.   #define LCD_USEDMA (0)
  57. #endif
  58. #ifndef LCD_YSIZE
  59.   #error Config value missig
  60. #endif
  61. #ifndef LCD_PORT_DATA
  62.   #error Please define LCD_PORT_DATA
  63. #endif
  64. #ifndef LCD_PORT_CTRL
  65.   #error Please define LCD_PORT_CTRL
  66. #endif
  67. #ifndef LCD_VXSIZE
  68.   #define LCD_VXSIZE LCD_XSIZE
  69. #endif
  70. #define MASK_M   (1<<0)
  71. #define MASK_FLM (1<<1)
  72. #define MASK_CL1 (1<<2)
  73. #define MASK_DON (1<<3)
  74. #define MASK_CL2 (1<<4)
  75. ; *********************************************************
  76. ; *
  77. ; *    Defines for special function registers
  78. ; *
  79. ; *********************************************************
  80. #define TA1IC  56h
  81. #define TA1    0x388
  82. #define TA1MR  0x397
  83. #define TA2    0x38a
  84. #define TA2MR 0x398
  85. #define TABSR 896
  86. #define P0    0x3e0
  87. #define P7    1005
  88. #define P8    1008
  89. #define DM0SL  3b8h
  90. #define DM0CON  2ch
  91. #define SAR0    20h
  92. #define DAR0    24h
  93. #define TCR0    28h
  94. ; *********************************************************
  95. ; *
  96. ; *    Internal macros
  97. ; *
  98. ; *********************************************************
  99. #if LCD_BITSPERPIXEL == 3
  100.   #ifndef LCD_BYTESPERLINE
  101.     #define LCD_BYTESPERLINE (3*((LCD_VXSIZE)+7)/8)
  102.   #endif
  103. #else
  104.   #define LCD_BYTESPERLINE (((LCD_VXSIZE)+7)/8)
  105. #endif
  106. ; *********************************************************
  107. ; *
  108. ; *    Data transfer macros (used in ISR)
  109. ; *
  110. ; *********************************************************
  111. #if LCD_USEDMA
  112. WRITEDATA2LCD  MACRO Off
  113.         ENDM
  114. #elif LCD_INTERFACEBITS == 8
  115. WRITEDATA2LCD  MACRO Off
  116.         MOV.W   Off[FB], R0
  117. ; 1. byte
  118.         mov.b   R1H, [A1]
  119.         MOV.B   R0L, [A0]
  120.         mov.b   R1L, [A1]
  121. ; 2.byte
  122.         mov.b   R1H, [A1]
  123.         MOV.B   R0H, [A0]
  124.         mov.b   R1L, [A1]
  125.         ENDM
  126. #elif LCD_INTERFACEBITS == 4
  127. WRITEDATA2LCD  MACRO Off
  128.         MOV.W   Off[FB], R0
  129. ; 1. nibble
  130.         mov.b   R1H, [A1]
  131.         MOVHL   R0L, [A0]
  132.         mov.b   R1L, [A1]
  133. ; 2. nibble
  134.         mov.b   R1H, [A1]
  135.         MOV.B   R0L, [A0]
  136.         mov.b   R1L, [A1]
  137. ; 3. nibble
  138.         mov.b   R0H, R0L
  139.         shl.b   #-4,R0L
  140.         mov.b   R1H, [A1]
  141.         MOV.b   R0L, [A0]
  142.         mov.b   R1L, [A1]
  143. ; 4. nibble
  144.         mov.b   R1H, [A1]
  145.         MOV.B   R0H, [A0]
  146.         mov.b   R1L, [A1]
  147.    ENDM
  148. #elif LCD_INTERFACEBITS == 1
  149. WRITEDATA2LCD  MACRO Off
  150.         MOV.B   Off[A0], R0L
  151.         mov.b   R1H, [A1]
  152.         rot.b   #1,R0L
  153.         MOV.B   R0L, LCD_PORT_DATA
  154.         mov.b   R1L, [A1]
  155.         mov.b   R1H, [A1]
  156.         rot.b   #1,R0L
  157.         MOV.B   R0L, LCD_PORT_DATA
  158.         mov.b   R1L, [A1]
  159.         mov.b   R1H, [A1]
  160.         rot.b   #1,R0L
  161.         MOV.B   R0L, LCD_PORT_DATA
  162.         mov.b   R1L, [A1]
  163.         mov.b   R1H, [A1]
  164.         rot.b   #1,R0L
  165.         MOV.B   R0L, LCD_PORT_DATA
  166.         mov.b   R1L, [A1]
  167.         mov.b   R1H, [A1]
  168.         rot.b   #1,R0L
  169.         MOV.B   R0L, LCD_PORT_DATA
  170.         mov.b   R1L, [A1]
  171.         mov.b   R1H, [A1]
  172.         rot.b   #1,R0L
  173.         MOV.B   R0L, LCD_PORT_DATA
  174.         mov.b   R1L, [A1]
  175.         mov.b   R1H, [A1]
  176.         rot.b   #1,R0L
  177.         MOV.B   R0L, LCD_PORT_DATA
  178.         mov.b   R1L, [A1]
  179.         mov.b   R1H, [A1]
  180.         rot.b   #1,R0L
  181.         MOV.B   R0L, LCD_PORT_DATA
  182.         mov.b   R1L, [A1]
  183.    ENDM
  184. #endif
  185. ; *********************************************************
  186. ; *
  187. ; *                   ISR
  188. ; *
  189. ; *********************************************************
  190. Public ISRTimerA1
  191. ISRTimerA1:
  192.         FSET    B
  193.         pushm   FB   ; not needed with IAR
  194. ; *** Output next line / first line signals
  195.         mov.w   #LCD_PORT_CTRL, A1
  196.         CMP.W   #LCD_YSIZE,Line
  197.         JNE     ISR_NextLine
  198.         inc.B   FrameCnt
  199.         OR.B    #MASK_FLM, [A1]
  200.         OR.B    #MASK_CL1, [A1]
  201.         AND.B   #~MASK_CL1,[A1]
  202.         AND.B   #~MASK_FLM,[A1]
  203.         JMP.B   NLDone
  204. ISR_NextLine:
  205.         OR.B    #MASK_CL1,  [A1]
  206.         AND.B   #~MASK_CL1, [A1]
  207. NLDone:
  208. ; *** Check if M has to be inverted
  209.         DEC.B   MCnt
  210.         JNE     M_Done
  211.         MOV.B   #7,MCnt
  212.         XOR.B   #MASK_M, [A1]
  213. M_Done:
  214. ;
  215. ; Start processing the new line
  216. ;
  217. ; *** Last line ?      if (--Line<0) {
  218.         ADD.W   #-1,Line
  219.         JPZ      ManageDone
  220.         MOV.W   #LCD_YSIZE,Line
  221. ; *** Handle GrayCnt
  222.       mov.b   GrayCnt, R0L
  223.      dec.b   R0L
  224.      mov.b   R0L, GrayCnt
  225.      jpz     GrayCntDone
  226.         mov.b   LCD__BitsPerPixel, R0L
  227. dec.b   R0L
  228. mov.b   R0L, GrayCnt
  229. GrayCntDone:
  230. add.b   R0L, R0L
  231. mov.b   R0L, A0
  232.         mov.w   LCD__apVRam:16[A0], A1
  233.         mov.w   A1, pData
  234.         mov.w   2+LCD__apVRam:16[A0], A1
  235.         mov.w   A1, pData+2
  236.         mov.w   LCD__aTimerReload:16[A0], A1
  237.         MOV.W   A1,TA1
  238. ManageDone:
  239. #if     LCD_USEDMA
  240. ; *** Program DMA Destination: 8-bit latch
  241.         mov.w   pData, SAR0
  242.         mov.b   pData+2, SAR0+2  
  243.         mov.b   #19h, DM0CON    ; 8 bits, source increments   
  244.         mov.w   #LCD_BYTESPERLINE, TCR0
  245. #else
  246.         mov.w   #LCD_PORT_CTRL, A1
  247.         mov.w   #LCD_PORT_DATA, A0
  248.         mov.b   [A1], R1L
  249.         mov.b   R1L, R1H
  250.         or.b    #MASK_CL2, R1H
  251.         and.b   #255-MASK_CL2, R1L
  252.         ldc     pData, FB
  253. #endif
  254.     WRITEDATA2LCD 0
  255. #if LCD_BYTESPERLINE > 2
  256.     WRITEDATA2LCD 2
  257. #endif
  258. #if LCD_BYTESPERLINE > 4
  259.     WRITEDATA2LCD 4
  260. #endif
  261. #if LCD_BYTESPERLINE > 6
  262.     WRITEDATA2LCD 6
  263. #endif
  264. #if LCD_BYTESPERLINE > 8
  265.     WRITEDATA2LCD 8
  266. #endif
  267. #if LCD_BYTESPERLINE > 10
  268.     WRITEDATA2LCD 10
  269. #endif
  270. #if LCD_BYTESPERLINE > 12
  271.     WRITEDATA2LCD 12
  272. #endif
  273. #if LCD_BYTESPERLINE > 14
  274.     WRITEDATA2LCD 14
  275. #endif
  276. #if LCD_BYTESPERLINE > 16
  277.     WRITEDATA2LCD 16
  278. #endif
  279. #if LCD_BYTESPERLINE > 18
  280.     WRITEDATA2LCD 18
  281. #endif
  282. #if LCD_BYTESPERLINE > 20
  283.     WRITEDATA2LCD 20
  284. #endif
  285. #if LCD_BYTESPERLINE > 22
  286.     WRITEDATA2LCD 22
  287. #endif
  288. #if LCD_BYTESPERLINE > 24
  289.     WRITEDATA2LCD 24
  290. #endif
  291. #if LCD_BYTESPERLINE > 26
  292.     WRITEDATA2LCD 26
  293. #endif
  294. #if LCD_BYTESPERLINE > 28
  295.     WRITEDATA2LCD 28
  296. #endif
  297. #if LCD_BYTESPERLINE > 30
  298.     WRITEDATA2LCD 30
  299. #endif
  300. #if LCD_BYTESPERLINE > 32
  301.     WRITEDATA2LCD 32
  302. #endif
  303. #if LCD_BYTESPERLINE > 34
  304.     WRITEDATA2LCD 34
  305. #endif
  306. #if LCD_BYTESPERLINE > 36
  307.     WRITEDATA2LCD 36
  308. #endif
  309. #if LCD_BYTESPERLINE > 38
  310.     WRITEDATA2LCD 38
  311. #endif
  312. #if LCD_BYTESPERLINE > 40
  313.     WRITEDATA2LCD 40
  314. #endif
  315. #if LCD_BYTESPERLINE > 42
  316.     WRITEDATA2LCD 42
  317. #endif
  318. #if LCD_BYTESPERLINE > 44
  319.     WRITEDATA2LCD 44
  320. #endif
  321. #if LCD_BYTESPERLINE > 46
  322.     WRITEDATA2LCD 46
  323. #endif
  324. #if LCD_BYTESPERLINE > 48
  325.     WRITEDATA2LCD 48
  326. #endif
  327. #if LCD_BYTESPERLINE > 50
  328.     WRITEDATA2LCD 50
  329. #endif
  330. #if LCD_BYTESPERLINE > 52
  331.     WRITEDATA2LCD 52
  332. #endif
  333. #if LCD_BYTESPERLINE > 54
  334.     WRITEDATA2LCD 54
  335. #endif
  336. #if LCD_BYTESPERLINE > 56
  337.     WRITEDATA2LCD 56
  338. #endif
  339. #if LCD_BYTESPERLINE > 58
  340.     WRITEDATA2LCD 58
  341. #endif
  342. #if LCD_BYTESPERLINE > 60
  343.     WRITEDATA2LCD  60
  344. #endif
  345. #if LCD_BYTESPERLINE > 62
  346.     WRITEDATA2LCD  62
  347. #endif
  348. #if LCD_BYTESPERLINE > 64
  349.     WRITEDATA2LCD  64
  350. #endif
  351. #if LCD_BYTESPERLINE > 66
  352.     WRITEDATA2LCD  66
  353. #endif
  354. #if LCD_BYTESPERLINE > 68
  355.     WRITEDATA2LCD  68
  356. #endif
  357. #if LCD_BYTESPERLINE > 70
  358.     WRITEDATA2LCD  70
  359. #endif
  360. #if LCD_BYTESPERLINE > 72
  361.     WRITEDATA2LCD  72
  362. #endif
  363. #if LCD_BYTESPERLINE > 74
  364.     WRITEDATA2LCD  74
  365. #endif
  366. #if LCD_BYTESPERLINE > 76
  367.     WRITEDATA2LCD  76
  368. #endif
  369. #if LCD_BYTESPERLINE > 78
  370.     WRITEDATA2LCD  78
  371. #endif
  372. #if LCD_BYTESPERLINE > 80
  373.     WRITEDATA2LCD  80
  374. #endif
  375. #if LCD_BYTESPERLINE > 82
  376.     WRITEDATA2LCD  82
  377. #endif
  378. #if LCD_BYTESPERLINE > 84
  379.     WRITEDATA2LCD  84
  380. #endif
  381. #if LCD_BYTESPERLINE > 86
  382.     WRITEDATA2LCD  86
  383. #endif
  384. #if LCD_BYTESPERLINE > 88
  385.     WRITEDATA2LCD  88
  386. #endif
  387. #if LCD_BYTESPERLINE > 90
  388.     WRITEDATA2LCD  90
  389. #endif
  390. #if LCD_BYTESPERLINE > 92
  391.     WRITEDATA2LCD  92
  392. #endif
  393. #if LCD_BYTESPERLINE > 94
  394.     WRITEDATA2LCD  94
  395. #endif
  396. #if LCD_BYTESPERLINE > 96
  397.     WRITEDATA2LCD  96
  398. #endif
  399. #if LCD_BYTESPERLINE > 98
  400.     WRITEDATA2LCD  98
  401. #endif
  402. #if LCD_BYTESPERLINE > 100
  403.     WRITEDATA2LCD  100
  404. #endif
  405. #if LCD_BYTESPERLINE > 102
  406.     WRITEDATA2LCD  102
  407. #endif
  408. #if LCD_BYTESPERLINE > 104
  409.     WRITEDATA2LCD  104
  410. #endif
  411. #if LCD_BYTESPERLINE > 106
  412.     WRITEDATA2LCD  106
  413. #endif
  414. #if LCD_BYTESPERLINE > 108
  415.     WRITEDATA2LCD  108
  416. #endif
  417. #if LCD_BYTESPERLINE > 110
  418.     WRITEDATA2LCD  110
  419. #endif
  420. #if LCD_BYTESPERLINE > 112
  421.     WRITEDATA2LCD  112
  422. #endif
  423. #if LCD_BYTESPERLINE > 114
  424.     WRITEDATA2LCD  114
  425. #endif
  426. #if LCD_BYTESPERLINE > 116
  427.     WRITEDATA2LCD  116
  428. #endif
  429. #if LCD_BYTESPERLINE > 118
  430.     WRITEDATA2LCD  118
  431. #endif
  432.         ADD.W   #LCD_BYTESPERLINE,pData
  433.         popm    FB      ; this instruction is not needed with IAR since FB is not used
  434.         REIT    
  435. ; *********************************************************
  436. ; *
  437. ; *                   LCD_L0_On
  438. ; *
  439. ; *********************************************************
  440. LCD_X_On:
  441.         PUSHM   R0
  442. ;        MOV.B   #0ffh, P7D
  443. ;        MOV.B   #0ffh, P8D
  444.         MOV.W   LCD__apVRam,R0
  445.         STE.W   R0,pData
  446.         mov.w   LCD__aTimerReload, R0
  447. ; *** Line refresh: TA1
  448.         MOV.W   R0,TA1
  449.         MOV.B   #0,TA1MR ; Timer mode register
  450.         MOV.B  #7,TA1IC  ; Timer interrupt register, high prio
  451. #if LCD_USEDMA
  452. ; *** Program DMA Destination: 8-bit latch
  453.         mov.w   #lwrd(LCD_DMADEST), DAR0
  454.         mov.b   #byte3(LCD_DMADEST), DAR0+2
  455.         mov.b   #4, DM0SL       ; USE Timer A2 as trigger
  456.         mov.b   #19h, DM0CON    ; 8 bits, source increments   
  457. ; *** Shift timer: TA2
  458.         MOV.W   #8,TA2
  459.         MOV.B   #0,TA2MR ; Timer mode register
  460.         or.B   #(1<<2),TABSR
  461. #endif
  462.         or.B   #(1<<1),TABSR
  463.         BSET    8067
  464.         POPM    R0
  465.         RTS     
  466. ; *********************************************************
  467. ; *
  468. ; *                   LCD_L0_Off
  469. ; *
  470. ; *********************************************************
  471. LCD_X_Off:
  472.         AND.B   #253, TABSR       ; Start timer : TABSR &= ~(1<<1)
  473.         BCLR    8067           ; DON = 0;
  474.         RTS     
  475. COMMON INTVEC
  476. .BLKB 88
  477. .LWORD ISRTimerA1
  478. RSEG UDATA0
  479. Line:
  480. .BLKB 2
  481. FrameCnt:
  482. .BLKB 1
  483. GrayCnt:
  484. .BLKB 1
  485. IntCnt:
  486. .BLKB 1
  487. MCnt:
  488. .BLKB 1
  489. .BLKB 1
  490. pData:
  491. .BLKB 4
  492. #endif   /* LCD_CONTROLLER == 0 */
  493. END