Guest User

Untitled

a guest
Jun 22nd, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 35.99 KB | None | 0 0
  1.     LIST P=18F2550, F=INHX32    ;directive to define processor
  2.     #include <P18F2550.INC> ;processor specific variable definitions
  3.  
  4.     CONFIG  FOSC = INTOSC_EC
  5.     CONFIG  PBADEN = OFF            ; RB4:RB0 цифровые входы/выходы
  6.     CONFIG WDT = OFF
  7.     CONFIG PLLDIV = 1
  8.     CONFIG CPUDIV = OSC1_PLL2
  9.     CONFIG  LVP=OFF
  10. #ifdef __DEBUG
  11.     CONFIG DEBUG = ON ,MCLRE = ON
  12. #else  
  13.     CONFIG DEBUG = OFF ,MCLRE = OFF  
  14. #endif
  15.  
  16.         UDATA
  17.  
  18. WREG_TEMP   RES 1   ;variable in RAM for context saving
  19. STATUS_TEMP RES 1   ;variable in RAM for context saving
  20. BSR_TEMP    RES 1   ;variable in RAM for context saving
  21.  
  22.         UDATA_ACS
  23. num     res 1   ; для организации циклов с счетчиком
  24. num2    res 1   ; для организации циклов с счетчиком
  25. num3    res 1
  26. ; num, num2 для использования в п/п вывода простых фигур
  27. ; num, num2 используются во многих п/п (вывод линии, картинки, очистки)
  28. ; но не используются в п/п чтения, записи ожидания сброса флага занятости дисплея
  29.  
  30. disp_image_page_offset  res 1   ;
  31. disp_image_x    res 1   ;
  32. disp_image_y    res 1   ; координаты по которым выводим изображение
  33. disp_image_offset   res 1   ; смещение изображения, старший байт, младший - 0
  34. disp_image_width    res 1   ;
  35. disp_image_height   res 1   ; размеры изображения
  36. disp_image_num_pag  res 1   ; количество страниц в изображении
  37. disp_char   res 1   ; входные данные для подпрограмм рисования, выводимый символ
  38. disp_char_y res 1   ; входные данные для подпрограмм рисования, страница
  39. disp_char_x res 1   ; входные данные для подпрограмм рисования, положение символа
  40. disp_x1 res 1   ; входные данные для подпрограмм рисования
  41. disp_y1 res 1   ; входные данные для подпрограмм рисования
  42. disp_x2 res 1   ; входные данные для подпрограмм рисования
  43. disp_y2 res 1   ; входные данные для подпрограмм рисования
  44. disp_r  res 1   ; входные данные для подпрограмм рисования
  45. disp_x  res 1   ; внутр. перем. для п/п рисования, входные данные для disp_putpx
  46. disp_y  res 1   ; внутр. перем. для п/п рисования, входные данные для disp_putpx
  47. disp_mode   res 1   ; режим рисования. 0 - сплошная черная линия, 1 - сплошная белая линия
  48.                     ; 2 -
  49.  
  50. disp_err_H  res 1   ; внутр. перем. для п/п рисования, алг. Брезенхейма
  51. disp_err_L  res 1   ; внутр. перем. для п/п рисования, алг. Брезенхейма
  52. disp_dx res 1   ; внутр. перем. для п/п рисования, алг. Брезенхейма
  53. disp_2dy    res 1   ; внутр. перем. для п/п рисования, алг. Брезенхейма
  54. disp_2_dy_sub_dx    res 1   ; внутр. перем. для п/п рисования, алг. Брезенхейма
  55. disp_page   res 1   ; внутр. перем. для п/п рисования, страница
  56. disp_buf    res 1   ; внутр. перем. для п/п рисования
  57. disp_flag   res 1
  58. data_read   res 1   ; результат работы п/п чтения ОЗУ дисплея.
  59. #define disp_port   LATB    ; порт мк к которому подкл. выводы DB0-DB7 диспл.
  60. #define disp_tris   TRISB   ; соответств. этому порту регистр направления
  61. #define disp_e1 LATC,RC7    ; Выбор кристалла 1
  62. #define disp_e2 LATC,RC6    ; Выбор кристалла 2
  63. #define disp_a0 LATA,RA0    ; Выбор: Команды/Данные
  64. #define disp_rw LATA,RA1    ; Выбор: Чтение/Запись
  65. #define disp_e  LATC,RC2    ; Стробирование данных
  66.  
  67. #define disp_flag1  disp_flag,0 ; флаг
  68.  
  69. ;******************************************************************************
  70. ; вывод линии алг. Брезенхейма
  71. ; координаты начала и конца линии - константы
  72. disp_line_macr  macro x1,y1,x2,y2
  73.     movlw   x1
  74.     movwf   disp_x1
  75.     movlw   y1
  76.     movwf   disp_y1
  77.     movlw   x2
  78.     movwf   disp_x2
  79.     movlw   y2
  80.     movwf   disp_y2
  81.     call    disp_line
  82.     endm
  83. ;******************************************************************************
  84. ; вывод строки, все аргументы - константы
  85. ; первый аргумент - длина строки
  86. ; второй - координата x, третий - страница
  87. ; остальные - выводимые символы
  88. disp_print_str  macro n,x,y,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21
  89.     movlw   y
  90.     movwf   disp_char_y
  91.     movlw   x
  92.     movwf   disp_char_x
  93.     local i=1
  94.     while i<=n
  95.         movlw c#v(i)
  96.         call    disp_put_char
  97. i+=1 ; mpasm ругался на то, что метка i находится не в первом столбце
  98.     endw
  99.     endm
  100. ;******************************************************************************
  101. #define table_image 0x1500
  102. image   CODE table_image
  103.     ;Height = 42, Width = 24
  104.     ;6 pages
  105.     db 0x1, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0
  106.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  107.     db 0x0, 0x0, 0x0, 0xe0, 0xf0, 0xf0, 0x70, 0x78, 0x78, 0x7c, 0x3c, 0x3e, 0x1e, 0x1e, 0xe, 0xe
  108.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xc0, 0x80
  109.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  110.     db 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0xf, 0xf, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c
  111.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  112.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  113.     db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
  114. ;******************************************************************************
  115. ; шрифт 5х7
  116. #define table_font 0x3000
  117. font    CODE    table_font
  118.     ; 1536 байт (0x600)
  119.     db  0x3E,   0x51,   0x49,   0x45,   0x3E ; N=0  ASCII =
  120.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=1  ASCII =
  121.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=2  ASCII = 
  122.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=3  ASCII = 
  123.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=4  ASCII = 
  124.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=5  ASCII = 
  125.     db  0x3E,   0x51,   0x49,   0x45,   0x3E ; N=6  ASCII = 
  126.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=7  ASCII = 
  127.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=8  ASCII = 
  128.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=9  ASCII =  
  129.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=10  ASCII =
  130.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=11  ASCII =
  131.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=12  ASCII =
  132.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=13  ASCII =
  133.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=14  ASCII = 
  134.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=15  ASCII = 
  135.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=16  ASCII = 
  136.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=17  ASCII = 
  137.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=18  ASCII = 
  138.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=19  ASCII = 
  139.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=20  ASCII = 
  140.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=21  ASCII = 
  141.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=22  ASCII = 
  142.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=23  ASCII = 
  143.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=24  ASCII = 
  144.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=25  ASCII = 
  145.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=26  ASCII =
  146.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=27  ASCII =
  147.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=28  ASCII =
  148.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=29  ASCII =
  149.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=30  ASCII =
  150.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=31  ASCII =
  151.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=32  ASCII =
  152.     db  0x00,   0x00,   0x5F,   0x00,   0x0 ; N=33  ASCII = !
  153.     db  0x00,   0x07,   0x00,   0x07,   0x0 ; N=34  ASCII = "
  154.     db  0x14,   0x7F,   0x14,   0x7F,   0x14 ; N=35  ASCII = #
  155.     db  0x24,   0x2A,   0x7F,   0x2A,   0x12 ; N=36  ASCII = $
  156.     db  0x23,   0x13,   0x08,   0x64,   0x62 ; N=37  ASCII = %
  157.     db  0x36,   0x49,   0x55,   0x22,   0x50 ; N=38  ASCII = &
  158.     db  0x00,   0x05,   0x03,   0x00,   0x0 ; N=39  ASCII = '
  159.     db  0x00,   0x1C,   0x22,   0x41,   0x0 ; N=40  ASCII = (
  160.     db  0x00,   0x41,   0x22,   0x1C,   0x0 ; N=41  ASCII = )
  161.     db  0x14,   0x08,   0x3E,   0x08,   0x14 ; N=42  ASCII = *
  162.     db  0x08,   0x08,   0x3E,   0x08,   0x8 ; N=43  ASCII = +
  163.     db  0x00,   0x50,   0x30,   0x00,   0x0 ; N=44  ASCII = ,
  164.     db  0x08,   0x08,   0x08,   0x08,   0x8 ; N=45  ASCII = -
  165.     db  0x00,   0x60,   0x60,   0x00,   0x0 ; N=46  ASCII = .
  166.     db  0x40,   0x20,   0x10,   0x08,   0x4 ; N=47  ASCII = /
  167.     db  0x3E,   0x51,   0x49,   0x45,   0x3E ; N=48  ASCII = 0
  168.     db  0x00,   0x42,   0x7F,   0x40,   0x0 ; N=49  ASCII = 1
  169.     db  0x42,   0x61,   0x51,   0x49,   0x46 ; N=50  ASCII = 2
  170.     db  0x21,   0x41,   0x45,   0x4B,   0x31 ; N=51  ASCII = 3
  171.     db  0x18,   0x14,   0x12,   0x7F,   0x10 ; N=52  ASCII = 4
  172.     db  0x27,   0x45,   0x45,   0x45,   0x39 ; N=53  ASCII = 5
  173.     db  0x3C,   0x4A,   0x49,   0x49,   0x30 ; N=54  ASCII = 6
  174.     db  0x01,   0x71,   0x09,   0x05,   0x3 ; N=55  ASCII = 7
  175.     db  0x36,   0x49,   0x49,   0x49,   0x36 ; N=56  ASCII = 8
  176.     db  0x06,   0x49,   0x49,   0x29,   0x1E ; N=57  ASCII = 9
  177.     db  0x00,   0x66,   0x66,   0x00,   0x0 ; N=58  ASCII = :
  178.     db  0x00,   0x56,   0x36,   0x00,   0x0 ; N=59  ASCII = ;
  179.     db  0x08,   0x14,   0x22,   0x41,   0x0 ; N=60  ASCII = <
  180.     db  0x14,   0x14,   0x14,   0x14,   0x14 ; N=61  ASCII = =
  181.     db  0x00,   0x41,   0x22,   0x14,   0x8 ; N=62  ASCII = >
  182.     db  0x02,   0x01,   0x51,   0x09,   0x6 ; N=63  ASCII = ?
  183.     db  0x32,   0x49,   0x79,   0x41,   0x3E ; N=64  ASCII = @
  184.     db  0x7E,   0x11,   0x11,   0x11,   0x7E ; N=65  ASCII = A
  185.     db  0x7F,   0x49,   0x49,   0x49,   0x36 ; N=66  ASCII = B
  186.     db  0x3E,   0x41,   0x41,   0x41,   0x22 ; N=67  ASCII = C
  187.     db  0x7F,   0x41,   0x41,   0x22,   0x1C ; N=68  ASCII = D
  188.     db  0x7F,   0x49,   0x49,   0x49,   0x49 ; N=69  ASCII = E
  189.     db  0x7F,   0x09,   0x09,   0x09,   0x1 ; N=70  ASCII = F
  190.     db  0x3E,   0x41,   0x41,   0x49,   0x7A ; N=71  ASCII = G
  191.     db  0x7F,   0x08,   0x08,   0x08,   0x7F ; N=72  ASCII = H
  192.     db  0x00,   0x41,   0x7F,   0x41,   0x0 ; N=73  ASCII = I
  193.     db  0x20,   0x40,   0x41,   0x3F,   0x1 ; N=74  ASCII = J
  194.     db  0x7F,   0x08,   0x14,   0x22,   0x41 ; N=75  ASCII = K
  195.     db  0x7F,   0x40,   0x40,   0x40,   0x40 ; N=76  ASCII = L
  196.     db  0x7F,   0x02,   0x0C,   0x02,   0x7F ; N=77  ASCII = M
  197.     db  0x7F,   0x04,   0x08,   0x10,   0x7F ; N=78  ASCII = N
  198.     db  0x3E,   0x41,   0x41,   0x41,   0x3E ; N=79  ASCII = O
  199.     db  0x7F,   0x09,   0x09,   0x09,   0x6 ; N=80  ASCII = P
  200.     db  0x3E,   0x41,   0x51,   0x21,   0x5E ; N=81  ASCII = Q
  201.     db  0x7F,   0x09,   0x19,   0x29,   0x46 ; N=82  ASCII = R
  202.     db  0x46,   0x49,   0x49,   0x49,   0x31 ; N=83  ASCII = S
  203.     db  0x01,   0x01,   0x7F,   0x01,   0x1 ; N=84  ASCII = T
  204.     db  0x3F,   0x40,   0x40,   0x40,   0x3F ; N=85  ASCII = U
  205.     db  0x1F,   0x20,   0x40,   0x20,   0x1F ; N=86  ASCII = V
  206.     db  0x3F,   0x40,   0x38,   0x40,   0x3F ; N=87  ASCII = W
  207.     db  0x63,   0x14,   0x08,   0x14,   0x63 ; N=88  ASCII = X
  208.     db  0x07,   0x08,   0x70,   0x08,   0x7 ; N=89  ASCII = Y
  209.     db  0x61,   0x51,   0x49,   0x45,   0x43 ; N=90  ASCII = Z
  210.     db  0x00,   0x7F,   0x41,   0x41,   0x0 ; N=91  ASCII = [
  211.     db  0x02,   0x04,   0x08,   0x10,   0x20 ; N=92  ASCII = \
  212.     db  0x00,   0x41,   0x41,   0x7F,   0x0 ; N=93  ASCII = ]
  213.     db  0x04,   0x02,   0x01,   0x02,   0x4 ; N=94  ASCII = ^
  214.     db  0x40,   0x40,   0x40,   0x40,   0x40 ; N=95  ASCII = _
  215.     db  0x00,   0x01,   0x02,   0x04,   0x0 ; N=96  ASCII = `
  216.     db  0x20,   0x54,   0x54,   0x54,   0x78 ; N=97  ASCII = a
  217.     db  0x7F,   0x48,   0x48,   0x48,   0x30 ; N=98  ASCII = b
  218.     db  0x38,   0x44,   0x44,   0x44,   0x44 ; N=99  ASCII = c
  219.     db  0x30,   0x48,   0x48,   0x48,   0x7F ; N=100  ASCII = d
  220.     db  0x38,   0x54,   0x54,   0x54,   0x58 ; N=101  ASCII = e
  221.     db  0x00,   0x08,   0x7E,   0x09,   0x2 ; N=102  ASCII = f
  222.     db  0x48,   0x54,   0x54,   0x54,   0x3C ; N=103  ASCII = g
  223.     db  0x7F,   0x08,   0x08,   0x08,   0x70 ; N=104  ASCII = h
  224.     db  0x00,   0x00,   0x7A,   0x00,   0x0 ; N=105  ASCII = i
  225.     db  0x20,   0x40,   0x40,   0x3D,   0x0 ; N=106  ASCII = j
  226.     db  0x00,   0x7F,   0x10,   0x28,   0x44 ; N=107  ASCII = k
  227.     db  0x00,   0x41,   0x7F,   0x40,   0x0 ; N=108  ASCII = l
  228.     db  0x7C,   0x04,   0x18,   0x04,   0x7C ; N=109  ASCII = m
  229.     db  0x7C,   0x08,   0x04,   0x04,   0x78 ; N=110  ASCII = n
  230.     db  0x38,   0x44,   0x44,   0x44,   0x38 ; N=111  ASCII = o
  231.     db  0x7C,   0x14,   0x14,   0x14,   0x8 ; N=112  ASCII = p
  232.     db  0x08,   0x14,   0x14,   0x14,   0x7C ; N=113  ASCII = q
  233.     db  0x7C,   0x08,   0x04,   0x04,   0x8 ; N=114  ASCII = r
  234.     db  0x48,   0x54,   0x54,   0x54,   0x24 ; N=115  ASCII = s
  235.     db  0x04,   0x04,   0x3F,   0x44,   0x24 ; N=116  ASCII = t
  236.     db  0x3C,   0x40,   0x40,   0x40,   0x3C ; N=117  ASCII = u
  237.     db  0x1C,   0x20,   0x40,   0x20,   0x1C ; N=118  ASCII = v
  238.     db  0x3C,   0x40,   0x30,   0x40,   0x3C ; N=119  ASCII = w
  239.     db  0x44,   0x28,   0x10,   0x28,   0x44 ; N=120  ASCII = x
  240.     db  0x04,   0x48,   0x30,   0x08,   0x4 ; N=121  ASCII = y
  241.     db  0x44,   0x64,   0x54,   0x4C,   0x44 ; N=122  ASCII = z
  242.     db  0x08,   0x36,   0x41,   0x41,   0x0 ; N=123  ASCII = {
  243.     db  0x00,   0x00,   0x77,   0x00,   0x0 ; N=124  ASCII = |
  244.     db  0x00,   0x41,   0x41,   0x36,   0x8 ; N=125  ASCII = }
  245.     db  0x04,   0x02,   0x02,   0x02,   0x1 ; N=126  ASCII = ~
  246.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=127  ASCII = 
  247.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=128  ASCII =
  248.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=129  ASCII =
  249.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=130  ASCII =
  250.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=131  ASCII =
  251.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=132  ASCII =
  252.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=133  ASCII =
  253.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=134  ASCII =
  254.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=135  ASCII =
  255.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=136  ASCII =
  256.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=137  ASCII =
  257.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=138  ASCII =
  258.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=139  ASCII =
  259.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=140  ASCII =
  260.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=141  ASCII =
  261.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=142  ASCII =
  262.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=143  ASCII =
  263.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=144  ASCII =
  264.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=145  ASCII =
  265.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=146  ASCII =
  266.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=147  ASCII =
  267.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=148  ASCII =
  268.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=149  ASCII =
  269.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=150  ASCII =
  270.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=151  ASCII =
  271.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=152  ASCII =
  272.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=153  ASCII =
  273.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=154  ASCII =
  274.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=155  ASCII =
  275.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=156  ASCII =
  276.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=157  ASCII =
  277.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=158  ASCII =
  278.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=159  ASCII =
  279.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=160  ASCII =
  280.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=161  ASCII = ?
  281.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=162  ASCII = ?
  282.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=163  ASCII = ?
  283.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=164  ASCII = ¤
  284.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=165  ASCII = ?
  285.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=166  ASCII = ¦
  286.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=167  ASCII = §
  287.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=168  ASCII = ?
  288.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=169  ASCII = ©
  289.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=170  ASCII = ?
  290.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=171  ASCII = «
  291.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=172  ASCII = ¬
  292.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=173  ASCII = ­
  293.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=174  ASCII = ®
  294.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=175  ASCII = ?
  295.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=176  ASCII = °
  296.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=177  ASCII = ±
  297.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=178  ASCII = ?
  298.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=179  ASCII = ?
  299.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=180  ASCII = ?
  300.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=181  ASCII = µ
  301.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=182  ASCII = ¶
  302.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=183  ASCII = ·
  303.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=184  ASCII = ?
  304.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=185  ASCII = ?
  305.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=186  ASCII = ?
  306.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=187  ASCII = »
  307.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=188  ASCII = ?
  308.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=189  ASCII = ?
  309.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=190  ASCII = ?
  310.     db  0x00,   0x00,   0x00,   0x00,   0x0 ; N=191  ASCII = ?
  311.     db  0x7C,   0x12,   0x11,   0x11,   0x7F ; N=192  ASCII = A
  312.     db  0x7F,   0x49,   0x49,   0x49,   0x31 ; N=193  ASCII = A
  313.     db  0x7F,   0x49,   0x49,   0x49,   0x36 ; N=194  ASCII = A
  314.     db  0x7F,   0x01,   0x01,   0x01,   0x1 ; N=195  ASCII = A
  315.     db  0x60,   0x3E,   0x21,   0x3F,   0x60 ; N=196  ASCII = A
  316.     db  0x7F,   0x49,   0x49,   0x49,   0x41 ; N=197  ASCII = A
  317.     db  0x77,   0x08,   0x7F,   0x08,   0x77 ; N=198  ASCII = ?
  318.     db  0x41,   0x49,   0x49,   0x49,   0x36 ; N=199  ASCII = C
  319.     db  0x7F,   0x20,   0x10,   0x08,   0x7F ; N=200  ASCII = E
  320.     db  0x7E,   0x20,   0x13,   0x08,   0x7E ; N=201  ASCII = E
  321.     db  0x7F,   0x08,   0x14,   0x22,   0x41 ; N=202  ASCII = E
  322.     db  0x40,   0x3C,   0x02,   0x01,   0x7F ; N=203  ASCII = E
  323.     db  0x7F,   0x06,   0x0C,   0x06,   0x7F ; N=204  ASCII = I
  324.     db  0x7F,   0x08,   0x08,   0x08,   0x7F ; N=205  ASCII = I
  325.     db  0x3E,   0x41,   0x41,   0x41,   0x3E ; N=206  ASCII = I
  326.     db  0x7F,   0x01,   0x01,   0x01,   0x7F ; N=207  ASCII = I
  327.     db  0x7F,   0x11,   0x11,   0x11,   0xE ; N=208  ASCII = ?
  328.     db  0x3E,   0x41,   0x41,   0x41,   0x22 ; N=209  ASCII = N
  329.     db  0x01,   0x01,   0x7F,   0x01,   0x1 ; N=210  ASCII = O
  330.     db  0x07,   0x48,   0x48,   0x48,   0x3F ; N=211  ASCII = O
  331.     db  0x0C,   0x12,   0x7F,   0x12,   0xC ; N=212  ASCII = O
  332.     db  0x63,   0x14,   0x08,   0x14,   0x63 ; N=213  ASCII = O
  333.     db  0x3F,   0x20,   0x20,   0x3F,   0x60 ; N=214  ASCII = O
  334.     db  0x0F,   0x10,   0x10,   0x10,   0x7F ; N=215  ASCII = ?
  335.     db  0x7F,   0x40,   0x7F,   0x40,   0x7F ; N=216  ASCII = O
  336.     db  0x3F,   0x20,   0x3F,   0x20,   0x7F ; N=217  ASCII = U
  337.     db  0x01,   0x7F,   0x48,   0x48,   0x30 ; N=218  ASCII = U
  338.     db  0x7F,   0x48,   0x30,   0x00,   0x7F ; N=219  ASCII = U
  339.     db  0x7F,   0x48,   0x48,   0x30,   0x0 ; N=220  ASCII = U
  340.     db  0x22,   0x41,   0x49,   0x49,   0x3E ; N=221  ASCII = Y
  341.     db  0x7F,   0x08,   0x3E,   0x41,   0x3E ; N=222  ASCII = ?
  342.     db  0x46,   0x29,   0x19,   0x09,   0x7F ; N=223  ASCII = ?
  343.     db  0x20,   0x54,   0x54,   0x54,   0x78 ; N=224  ASCII = a
  344.     db  0x3C,   0x4A,   0x4A,   0x4A,   0x31 ; N=225  ASCII = a
  345.     db  0x3E,   0x49,   0x4D,   0x4A,   0x30 ; N=226  ASCII = a
  346.     db  0x7C,   0x04,   0x04,   0x0C,   0x0 ; N=227  ASCII = a
  347.     db  0x60,   0x38,   0x24,   0x3C,   0x60 ; N=228  ASCII = a
  348.     db  0x38,   0x54,   0x54,   0x54,   0x18 ; N=229  ASCII = a
  349.     db  0x6C,   0x10,   0x7C,   0x10,   0x6C ; N=230  ASCII = ?
  350.     db  0x44,   0x54,   0x54,   0x28,   0x0 ; N=231  ASCII = c
  351.     db  0x7C,   0x20,   0x10,   0x08,   0x7C ; N=232  ASCII = e
  352.     db  0x78,   0x42,   0x24,   0x12,   0x78 ; N=233  ASCII = e
  353.     db  0x7C,   0x10,   0x28,   0x44,   0x0 ; N=234  ASCII = e
  354.     db  0x70,   0x08,   0x04,   0x7C,   0x0 ; N=235  ASCII = e
  355.     db  0x7C,   0x08,   0x10,   0x08,   0x7C ; N=236  ASCII = i
  356.     db  0x7C,   0x10,   0x10,   0x10,   0x7C ; N=237  ASCII = i
  357.     db  0x38,   0x44,   0x44,   0x44,   0x38 ; N=238  ASCII = i
  358.     db  0x7C,   0x04,   0x04,   0x04,   0x7C ; N=239  ASCII = i
  359.     db  0x7C,   0x14,   0x14,   0x08,   0x0 ; N=240  ASCII = ?
  360.     db  0x38,   0x44,   0x44,   0x44,   0x0 ; N=241  ASCII = n
  361.     db  0x08,   0x08,   0x78,   0x08,   0x8 ; N=242  ASCII = o
  362.     db  0x0C,   0x50,   0x50,   0x50,   0x3C ; N=243  ASCII = o
  363.     db  0x10,   0x28,   0x7C,   0x28,   0x10 ; N=244  ASCII = o
  364.     db  0x44,   0x28,   0x10,   0x28,   0x44 ; N=245  ASCII = o
  365.     db  0x3C,   0x20,   0x20,   0x3C,   0x60 ; N=246  ASCII = o
  366.     db  0x0C,   0x10,   0x10,   0x7C,   0x0 ; N=247  ASCII = ?
  367.     db  0x7C,   0x40,   0x7C,   0x40,   0x7C ; N=248  ASCII = o
  368.     db  0x3C,   0x20,   0x3C,   0x20,   0x7C ; N=249  ASCII = u
  369.     db  0x04,   0x7C,   0x50,   0x50,   0x20 ; N=250  ASCII = u
  370.     db  0x7C,   0x50,   0x20,   0x00,   0x7C ; N=251  ASCII = u
  371.     db  0x7C,   0x50,   0x50,   0x20,   0x0 ; N=252  ASCII = u
  372.     db  0x28,   0x44,   0x54,   0x54,   0x38 ; N=253  ASCII = y
  373.     db  0x7C,   0x10,   0x38,   0x44,   0x38 ; N=254  ASCII = ?
  374.     db  0x08,   0x54,   0x34,   0x14,   0x7C ; N=255  ASCII = y
  375.  
  376. ;DATA_EEPROM    CODE    0xf00000
  377. ;
  378. ;       DE  "Test Data",0,1,2,3,4,5
  379.  
  380. RESET_VECTOR    CODE    0x0000
  381.  
  382.         goto    Main        ;go to start of main code
  383.  
  384. HI_INT_VECTOR   CODE    0x0008
  385.  
  386.         bra HighInt     ;go to high priority interrupt routine
  387.  
  388. LOW_INT_VECTOR  CODE    0x0018
  389.  
  390.         bra LowInt      ;go to low priority interrupt routine
  391.  
  392.         CODE
  393.  
  394. HighInt:
  395.  
  396. ;   *** high priority interrupt code goes here ***
  397.  
  398.  
  399.         retfie  FAST
  400.  
  401. LowInt:
  402.         movff   STATUS,STATUS_TEMP  ;save STATUS register
  403.         movff   WREG,WREG_TEMP      ;save working register
  404.         movff   BSR,BSR_TEMP        ;save BSR register
  405.  
  406. ;   *** low priority interrupt code goes here ***
  407.  
  408.         movff   BSR_TEMP,BSR        ;restore BSR register
  409.         movff   WREG_TEMP,WREG      ;restore working register
  410.         movff   STATUS_TEMP,STATUS  ;restore STATUS register
  411.         retfie
  412.  
  413. Main:
  414.     clrf    OSCCON
  415.     bsf OSCCON,IRCF0
  416.     bsf OSCCON,IRCF1
  417.     bsf OSCCON,IRCF2
  418.     clrf    TRISA
  419.     clrf    LATA
  420.     clrf    LATC
  421.     bsf     disp_e1
  422.     bsf     disp_e2
  423.     clrf    TRISC
  424.     clrf    TRISB
  425.     clrf    LATB
  426.     bsf LATC,RC1
  427.  
  428.     bsf     disp_e1         ; включение дисплея
  429.     bsf     disp_e2
  430.     movlw   b'00111111'
  431.     call    disp_send_cmd
  432.  
  433.     call    disp_clean_c    ; после включения на дисплее появляется "мусор", в симуляторе этого нет
  434.  
  435. ;   disp_line_macr .0,.0,.127,.63
  436. ;   disp_line_macr .0,.0,.127,.50
  437. ;   disp_line_macr .0,.0,.127,.40
  438. ;   disp_line_macr .0,.0,.127,.30
  439. ;   disp_line_macr .0,.0,.127,.20
  440. ;   disp_line_macr .0,.0,.127,.10
  441. ;   disp_line_macr .10,.20,.50,.40
  442. ;
  443. ;   disp_print_str  .15,.0,.7,'0','1','2','3','4',' ','Р','а','б','о','т','а','е','т','!','','','','','',''
  444.  
  445. ; вывод изображения, без смещения внутри страницы
  446. ; disp_image_x,disp_image_y - координаты по которым выводим изображение
  447. ; disp_image_offset - смещение изображения, старший байт, младший - 0
  448. ; disp_image_width, disp_image_height - размеры изображения
  449. ; disp_image_num_pag - количество страниц в изображении
  450.     ;Height = 42, Width = 24
  451.     ;6 pages
  452.     clrf    disp_image_x
  453.     clrf    disp_image_y
  454.     movlw 0x15
  455.     movwf disp_image_offset
  456.     movlw .42
  457.     movwf disp_image_height
  458.     movlw .24
  459.     movwf disp_image_width
  460.     movlw .6
  461.     movwf disp_image_num_pag
  462.  
  463.     call    disp_put_image2
  464.  
  465. loop:
  466.  
  467.     goto    loop
  468.  
  469. ;******************************************************************************
  470. ; макросы для п/п
  471. ;******************************************************************************
  472. ; определение и переключение кристалла
  473. disp_set_chip macro x
  474.     bcf     disp_e1
  475.     bsf     disp_e2
  476.     btfsc x,6
  477.     bra $+0x06
  478. ;chip_e1:
  479.     bsf     disp_e1
  480.     bcf     disp_e2
  481. ;chip_e2:
  482.     endm
  483. ;******************************************************************************
  484. ; подпрограммы
  485. ;******************************************************************************
  486. ; вывод изображения, без смещения внутри страницы
  487. ; disp_image_x,disp_image_y - координаты по которым выводим изображение
  488. ; disp_image_offset - смещение изображения, старший байт, младший - 0
  489. ; disp_image_width, disp_image_height - размеры изображения
  490. ; disp_image_num_pag - количество страниц в изображении
  491. disp_put_image2
  492.     movf    disp_image_y,W  ; нахождение страницы
  493.     rrcf    WREG,W
  494.     rrcf    WREG,W
  495.     rrcf    WREG,W
  496.     andlw   b'00000111'
  497.     movwf   disp_page
  498.  
  499.  
  500.     clrf num    ; счетчик страниц
  501.     clrf num2   ; счетчик x
  502.  
  503.     clrf TBLPTRL
  504.     movff disp_image_offset,TBLPTRH
  505.  
  506.  
  507. disp_image2_loop_y:
  508.     movf    disp_page,W
  509.     call    disp_set_str    ; установка страницы
  510.  
  511. ; установка адреса и кристалла
  512. ; на втором контроллере сначала устанавливаен нулевой адрес
  513. ; если строка начинается в левой половине дисплея и переходит на правую, то в момент перехода
  514. ; во втором контроллере будет заранее установлен нулевой адрес
  515.     bcf     disp_e1
  516.     bsf     disp_e2
  517.     movlw 0x00
  518.     call    disp_set_addr
  519.     disp_set_chip disp_image_x
  520.     movf disp_image_x,W
  521.     bcf WREG,6
  522.     call    disp_set_addr
  523.  
  524.     movff disp_image_width,num2
  525. disp_image2_loop_x:
  526.     tblrd*+
  527.     movf TABLAT,W
  528.  
  529.     ;setf WREG
  530.     call    disp_write_data
  531.  
  532.     decfsz num2,F
  533.     goto disp_image2_loop_x
  534.  
  535.     incf    disp_page,F
  536.  
  537.     decfsz disp_image_num_pag,F
  538.     goto disp_image2_loop_y
  539.  
  540.  
  541.     return
  542.  
  543.  
  544. ;******************************************************************************
  545.  
  546. ; вывод символа disp_char
  547. ; disp_char_y - страница
  548. ; disp_char_x автоинкрементируется
  549. ; WREG - код символа
  550. disp_put_char:
  551.     movwf   disp_char
  552. ; установка адреса и кристалла
  553. ; на втором контроллере сначала устанавливаен нулевой адрес
  554. ; если строка начинается в левой половине дисплея и переходит на правую, то в момент перехода
  555. ; во втором контроллере будет заранее установлен нулевой адрес
  556.     bcf     disp_e1
  557.     bsf     disp_e2
  558.     movlw 0x00
  559.     call    disp_set_addr
  560.     disp_set_chip disp_char_x
  561.     movf disp_char_x,W
  562.     bcf WREG,6
  563.     call    disp_set_addr
  564. ; установка страницы
  565.     bsf     disp_e1
  566.     bsf     disp_e2
  567.     movf    disp_char_y,W
  568.     call    disp_set_str
  569.  
  570. ; умножение disp_char на 5, результат в TBLPTR
  571.     clrf TBLPTRH
  572.     movff disp_char,TBLPTRL
  573.     bcf STATUS,C
  574.  
  575.     rlcf TBLPTRL,F
  576.     rlcf TBLPTRH,F
  577.  
  578.     rlcf TBLPTRL,F
  579.     rlcf TBLPTRH,F
  580.  
  581.     movf disp_char,W
  582.     addwf TBLPTRL,F
  583.     movlw 0x00
  584.     addwfc TBLPTRH,F
  585.  
  586.     movf disp_char,W
  587.     addwf TBLPTRL,F
  588.     movlw 0x00
  589.     addwfc TBLPTRH,F
  590.  
  591. ; Сложение TBLPTR с адресом начала таблицы
  592.     movlw low(table_font)
  593.     addwf TBLPTRL,F
  594.     movlw high (table_font)
  595.     addwfc TBLPTRH,F
  596.  
  597. ; вывод символа
  598.     disp_set_chip disp_char_x
  599.     tblrd*+
  600.     movf    TABLAT,W
  601.     call    disp_write_data
  602.     incf    disp_char_x
  603.     disp_set_chip disp_char_x
  604.  
  605.     tblrd*+
  606.     movf    TABLAT,W
  607.     call    disp_write_data
  608.     incf    disp_char_x
  609.     disp_set_chip disp_char_x
  610.  
  611.     tblrd*+
  612.     movf    TABLAT,W
  613.     call    disp_write_data
  614.     incf    disp_char_x
  615.     disp_set_chip disp_char_x
  616.  
  617.     tblrd*+
  618.     movf    TABLAT,W
  619.     call    disp_write_data
  620.     incf    disp_char_x
  621.     disp_set_chip disp_char_x
  622.  
  623.     tblrd*+
  624.     movf    TABLAT,W
  625.     call    disp_write_data
  626.     incf    disp_char_x
  627.     disp_set_chip disp_char_x
  628.  
  629.     movlw 0x00
  630.     call    disp_write_data
  631.     incf    disp_char_x
  632.     return
  633. ;******************************************************************************
  634. ; очистка дисплея
  635. disp_clean_c:
  636.     bsf     disp_e1
  637.     bsf     disp_e2
  638.     clrf    num2
  639. loop_clean1:
  640.     movf    num2,W
  641.     call    disp_set_str
  642.  
  643.             clrf    num
  644. loop_clean:
  645.             movf    num,W
  646.             call    disp_set_addr   ; установка адреса (x)
  647.             movlw   0x00
  648.             call    disp_write_data
  649.             incf    num,F
  650.             btfss   num,6
  651.             goto    loop_clean
  652.  
  653.     incf    num2,F
  654.     btfss   num2,3
  655.     goto    loop_clean1
  656.     return
  657. ;******************************************************************************
  658. ; рисует линию от (disp_x1,disp_y1) до (disp_x2,disp_y2)
  659. ; пока работает только при (disp_x2-disp_x1) > (disp_y2-disp_y1) > 0
  660. disp_line:
  661.     movf    disp_y1,W
  662.     subwf   disp_y2,W
  663.     movwf   disp_2dy
  664.     bcf STATUS,C    ; на всякий случай, а вобще эта команда не нужна
  665.     rlcf    WREG,W
  666.     movwf   disp_2dy    ; disp_2dy = 2*(disp_x2-disp_x1)
  667.  
  668.     clrf    disp_err_H
  669.     movwf   disp_err_L
  670.  
  671.     movf    disp_x1,W
  672.     subwf   disp_x2,W   ; W=x2-x1
  673.     subwf  disp_err_L,F
  674.     movlw   .0
  675.     subwfb disp_err_H,F
  676. ; err=2dy-dx=2dy-(disp_x2-disp_x1) = 2dy - disp_x2 + disp_x1
  677.  
  678. ; disp_2_dy_sub_dx = 2*dy - 2*dx
  679.     movff   disp_2dy,disp_2_dy_sub_dx
  680.     movf    disp_x1,W
  681.     subwf   disp_x2,W   ; W=x2-x1
  682.     subwf   disp_2_dy_sub_dx,F
  683.     subwf   disp_2_dy_sub_dx,F
  684.  
  685.     movf    disp_x1,W
  686.     subwf   disp_x2,W
  687.     movwf   num
  688. disp_line_loop: ; цикл для disp_x1 от disp_x1 до disp_x2
  689.     incf    disp_x1,F
  690.  
  691.     call    disp_putpx
  692.  
  693.     btfss   disp_err_H,7
  694.     goto    disp_line_bol_ravno
  695. disp_line_men:          ; disp_err < 0
  696.  
  697.     movf    disp_2dy,W
  698.     addwf   disp_err_L,F
  699.     movlw   .0
  700.     addwfc  disp_err_H,F
  701.  
  702.     goto    disp_line_endif
  703. disp_line_bol_ravno:    ; disp_err >= 0
  704.  
  705.     incf    disp_y1,F
  706.  
  707.     movf    disp_2_dy_sub_dx,W
  708.     negf    WREG
  709.     subwf  disp_err_L,F
  710.     movlw   .0
  711.     subwfb disp_err_H,F
  712.  
  713. disp_line_endif:
  714.  
  715.     decfsz  num
  716.     goto    disp_line_loop
  717.  
  718.     return
  719. ;******************************************************************************
  720. ; вывод точки с координатами disp_x1,disp_y1
  721. disp_putpx:
  722.     movff   disp_x1,disp_x
  723.  
  724.     movlw   .64         ; определение в какой половине диспл. находится точка
  725.     cpfslt  disp_x
  726.     goto    disp_putpx_cs
  727.     bsf     disp_e1 ; disp_x1 < 64, выбираем е1
  728.     bcf     disp_e2
  729.     goto    disp_putpx_cs_end
  730. disp_putpx_cs:
  731.     bcf     disp_e1 ; disp_x1 >= 64, выбираем е2
  732.     bsf     disp_e2
  733.     bcf disp_x,.6
  734. disp_putpx_cs_end:
  735.  
  736.     movf    disp_y1,W   ; нахождение страницы
  737.     rrcf    WREG,W
  738.     rrcf    WREG,W
  739.     rrcf    WREG,W
  740.     andlw   b'00000111'
  741.     movwf   disp_page
  742.     call    disp_set_str    ; установка страницы
  743.  
  744.     clrf    disp_buf    ; определене положения внутри страницы и значения ему соответствующего
  745.     movf    disp_y1,W
  746.     andlw   b'00000111'
  747.     incf    WREG,W
  748.     bsf STATUS,C
  749. disp_putpx_cs_lin:
  750.     rlcf    disp_buf,F
  751.     decfsz  WREG,W
  752.     goto    disp_putpx_cs_lin
  753.  
  754.     movf    disp_x,W        ; установка адреса (x)
  755.     call    disp_set_addr
  756.     call    disp_data_read  ; В режиме чтения данных после команд «Set Page» и «Set Address»
  757. ;необходимо однократно выполнить «пустую» операцию чтения, результат которой не использовать.
  758.     call    disp_data_read
  759.  
  760.     movf    disp_x,W        ; установка адреса (x)
  761.     call    disp_set_addr
  762.  
  763.     movf    disp_buf,W
  764.     iorwf   data_read,W
  765.     call    disp_write_data
  766.  
  767.     return
  768. ;******************************************************************************
  769. ; наверное получилось неоптимально, надо чтобы в цикле disp_y менялась не от 0 до 63
  770. ; а от нулевой строки страницы в которой начинается линия, до седьмой строки
  771. ; сектора где заканчивается линия
  772. ; тем не менее даже так вертикальные линии выводятся на порядок быстрее горизонтальных.
  773. disp_vert_lin:  ; disp_x1,disp_y1 - коорд. начала, disp_r - длина линии
  774.     bsf     disp_e1     ; определение в какой половине диспл. находится линия
  775.     bcf     disp_e2     ; выбрали первый кристалл
  776.     btfss   disp_x1,.6
  777.     goto    vert_lin_e1 ; если disp_x1 < 127, то линия находится в левой половине дисп.
  778.     bcf     disp_e1     ; если иначе, то выбираем другой кристалл и disp_x1 = disp_x1 - 127
  779.     bsf     disp_e2
  780.     bcf     disp_x1,.6
  781. vert_lin_e1:
  782.     clrf    disp_y
  783.     bcf disp_flag1      ; disp_flag1 показывает находится ли точка с y=disp_y на линии
  784.     clrf    disp_page
  785. loop2_disp_vert_lin:
  786.     clrf    disp_buf
  787.     movlw   .8
  788.     movwf   num
  789. loop1_disp_vert_lin:    ; при совпадении адреса текущей точки с началом или концом линии
  790.     movf    disp_y1,W   ; переключается disp_flag1. Когда текущая точка внутри отрезка disp_flag1=1
  791.     cpfseq  disp_y
  792.     goto    neravno
  793.     goto    ravno
  794. neravno:
  795.     addwf   disp_r,W
  796.     cpfseq  disp_y
  797.     goto    neravno1
  798. ravno:
  799.     btg disp_flag1
  800. neravno1:
  801.     bsf STATUS,C
  802.     btfss   disp_flag1
  803.     bcf STATUS,C
  804.     rrcf    disp_buf,F
  805.     incf    disp_y,F
  806.     decfsz  num,F
  807.     goto    loop1_disp_vert_lin ; этот цикл крутится внутри страницы
  808.  
  809.     movf    disp_x1,W       ; установка адреса (x)
  810.     call    disp_set_addr
  811.     movf    disp_page,W     ; установка страницы
  812.     call    disp_set_str
  813.     call    disp_data_read  ; В режиме чтения данных после команд «Set Page» и «Set Address»
  814. ;необходимо однократно выполнить «пустую» операцию чтения, результат которой не использовать.
  815.     call    disp_data_read
  816.  
  817.     movf    disp_x1,W       ; установка адреса (x)
  818.     call    disp_set_addr
  819.     movf    disp_buf,W
  820.     iorwf   data_read,W
  821.     call    disp_write_data
  822.  
  823.     incf    disp_page
  824.     btfss   disp_page,3
  825.     goto    loop2_disp_vert_lin ; в этом цикле перебираются страницы от 0 до 7
  826.  
  827.     return
  828. ;******************************************************************************
  829. disp_data_read:         ; чтение данных, результат помещается в data_read
  830.     setf    disp_tris
  831.     bsf     disp_a0
  832.     bsf     disp_rw
  833.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  834.     nop
  835.     nop
  836.     nop
  837.     nop
  838.     movff   PORTB,data_read
  839.     bcf     disp_e
  840.     call    disp_wait
  841.     bcf     disp_rw
  842.     clrf    disp_tris
  843.     return
  844. ;******************************************************************************
  845. disp_set_str            ; установка страницы, аргумент - WREG
  846.     ;clrf   TRISB
  847.     addlw   b'10111000'
  848.     bcf     disp_a0
  849.     bcf     disp_rw
  850.     movwf   disp_port
  851.     ;   call    Delay_1
  852.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  853.     nop
  854.     nop
  855.     nop
  856.     nop
  857.     ;   call    Delay_1
  858.     bcf     disp_e
  859.     call    disp_wait
  860.     return
  861. ;******************************************************************************
  862. disp_set_addr:          ; установка адреса
  863.     ;clrf   TRISB
  864.     addlw   b'01000000'
  865.     bcf     disp_a0
  866.     ;bcf        disp_rw
  867.     movwf   disp_port
  868.     ;   call    Delay_1
  869.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  870.     nop
  871.     nop
  872.     nop
  873.     nop
  874.     ;   call    Delay_1
  875.     bcf     disp_e
  876.     call    disp_wait
  877.     return
  878. ;******************************************************************************
  879. disp_send_cmd:  ; отправка команды дисплею. Сейчас используется только для инициализации дисплея
  880.     ;clrf   TRISB   ; потом нужно будет убрать эту п/п
  881.     bcf     disp_a0
  882.     bcf     disp_rw
  883.     movwf   disp_port
  884.     ;   call    Delay_1
  885.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  886.     nop
  887.     nop
  888.     nop
  889.     nop
  890.     ;   call    Delay_1
  891.     bcf     disp_e
  892.     call    disp_wait
  893.     return
  894. ;******************************************************************************
  895. disp_write_data:    ; запись данных в ОЗУ дисплея
  896.     ;clrf   TRISB
  897.     bsf     disp_a0
  898.     bcf     disp_rw ; на всякий случай, потом надо будет убрать
  899.     movwf   disp_port
  900.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  901.     nop
  902.     nop
  903.     nop
  904.     nop
  905.     bcf     disp_e
  906.     call    disp_wait
  907.     return
  908. ;******************************************************************************
  909. disp_wait:      ; п/п ожидания сброса флага занятости дисплея
  910.     setf    TRISB
  911.     bcf     disp_a0
  912.     bsf     disp_rw
  913. loop_read:
  914.     bcf     disp_e  ; КАЖЕТСЯ ЗДЕСЬ НЕПРАВИЛЬНЫЕ ЗАДЕРЖКИ (для Fosc=40МГц)
  915.     nop
  916.     nop
  917.     nop
  918.     bsf     disp_e  ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
  919.     nop
  920.     nop
  921.     nop
  922.     btfsc   PORTB,7 ; tDDR 320 нс, здесь читаем данные
  923.     goto    loop_read   ; tcycE 1000 – нс
  924.     bcf     disp_e
  925.     nop
  926.     nop
  927.     nop
  928.     bcf     disp_rw
  929.     clrf    TRISB
  930.     return
  931.  
  932.         END
Add Comment
Please, Sign In to add comment