Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LIST P=18F2550, F=INHX32 ;directive to define processor
- #include <P18F2550.INC> ;processor specific variable definitions
- CONFIG FOSC = INTOSC_EC
- CONFIG PBADEN = OFF ; RB4:RB0 цифровые входы/выходы
- CONFIG WDT = OFF
- CONFIG PLLDIV = 1
- CONFIG CPUDIV = OSC1_PLL2
- CONFIG LVP=OFF
- #ifdef __DEBUG
- CONFIG DEBUG = ON ,MCLRE = ON
- #else
- CONFIG DEBUG = OFF ,MCLRE = OFF
- #endif
- UDATA
- WREG_TEMP RES 1 ;variable in RAM for context saving
- STATUS_TEMP RES 1 ;variable in RAM for context saving
- BSR_TEMP RES 1 ;variable in RAM for context saving
- UDATA_ACS
- num res 1 ; для организации циклов с счетчиком
- num2 res 1 ; для организации циклов с счетчиком
- num3 res 1
- ; num, num2 для использования в п/п вывода простых фигур
- ; num, num2 используются во многих п/п (вывод линии, картинки, очистки)
- ; но не используются в п/п чтения, записи ожидания сброса флага занятости дисплея
- disp_image_page_offset res 1 ;
- disp_image_x res 1 ;
- disp_image_y res 1 ; координаты по которым выводим изображение
- disp_image_offset res 1 ; смещение изображения, старший байт, младший - 0
- disp_image_width res 1 ;
- disp_image_height res 1 ; размеры изображения
- disp_image_num_pag res 1 ; количество страниц в изображении
- disp_char res 1 ; входные данные для подпрограмм рисования, выводимый символ
- disp_char_y res 1 ; входные данные для подпрограмм рисования, страница
- disp_char_x res 1 ; входные данные для подпрограмм рисования, положение символа
- disp_x1 res 1 ; входные данные для подпрограмм рисования
- disp_y1 res 1 ; входные данные для подпрограмм рисования
- disp_x2 res 1 ; входные данные для подпрограмм рисования
- disp_y2 res 1 ; входные данные для подпрограмм рисования
- disp_r res 1 ; входные данные для подпрограмм рисования
- disp_x res 1 ; внутр. перем. для п/п рисования, входные данные для disp_putpx
- disp_y res 1 ; внутр. перем. для п/п рисования, входные данные для disp_putpx
- disp_mode res 1 ; режим рисования. 0 - сплошная черная линия, 1 - сплошная белая линия
- ; 2 -
- disp_err_H res 1 ; внутр. перем. для п/п рисования, алг. Брезенхейма
- disp_err_L res 1 ; внутр. перем. для п/п рисования, алг. Брезенхейма
- disp_dx res 1 ; внутр. перем. для п/п рисования, алг. Брезенхейма
- disp_2dy res 1 ; внутр. перем. для п/п рисования, алг. Брезенхейма
- disp_2_dy_sub_dx res 1 ; внутр. перем. для п/п рисования, алг. Брезенхейма
- disp_page res 1 ; внутр. перем. для п/п рисования, страница
- disp_buf res 1 ; внутр. перем. для п/п рисования
- disp_flag res 1
- data_read res 1 ; результат работы п/п чтения ОЗУ дисплея.
- #define disp_port LATB ; порт мк к которому подкл. выводы DB0-DB7 диспл.
- #define disp_tris TRISB ; соответств. этому порту регистр направления
- #define disp_e1 LATC,RC7 ; Выбор кристалла 1
- #define disp_e2 LATC,RC6 ; Выбор кристалла 2
- #define disp_a0 LATA,RA0 ; Выбор: Команды/Данные
- #define disp_rw LATA,RA1 ; Выбор: Чтение/Запись
- #define disp_e LATC,RC2 ; Стробирование данных
- #define disp_flag1 disp_flag,0 ; флаг
- ;******************************************************************************
- ; вывод линии алг. Брезенхейма
- ; координаты начала и конца линии - константы
- disp_line_macr macro x1,y1,x2,y2
- movlw x1
- movwf disp_x1
- movlw y1
- movwf disp_y1
- movlw x2
- movwf disp_x2
- movlw y2
- movwf disp_y2
- call disp_line
- endm
- ;******************************************************************************
- ; вывод строки, все аргументы - константы
- ; первый аргумент - длина строки
- ; второй - координата x, третий - страница
- ; остальные - выводимые символы
- 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
- movlw y
- movwf disp_char_y
- movlw x
- movwf disp_char_x
- local i=1
- while i<=n
- movlw c#v(i)
- call disp_put_char
- i+=1 ; mpasm ругался на то, что метка i находится не в первом столбце
- endw
- endm
- ;******************************************************************************
- #define table_image 0x1500
- image CODE table_image
- ;Height = 42, Width = 24
- ;6 pages
- db 0x1, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- db 0x0, 0x0, 0x0, 0xe0, 0xf0, 0xf0, 0x70, 0x78, 0x78, 0x7c, 0x3c, 0x3e, 0x1e, 0x1e, 0xe, 0xe
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xc0, 0x80
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- db 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0xf, 0xf, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- db 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- ;******************************************************************************
- ; шрифт 5х7
- #define table_font 0x3000
- font CODE table_font
- ; 1536 байт (0x600)
- db 0x3E, 0x51, 0x49, 0x45, 0x3E ; N=0 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=1 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=2 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=3 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=4 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=5 ASCII =
- db 0x3E, 0x51, 0x49, 0x45, 0x3E ; N=6 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=7 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=8 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=9 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=10 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=11 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=12 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=13 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=14 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=15 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=16 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=17 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=18 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=19 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=20 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=21 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=22 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=23 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=24 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=25 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=26 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=27 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=28 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=29 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=30 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=31 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=32 ASCII =
- db 0x00, 0x00, 0x5F, 0x00, 0x0 ; N=33 ASCII = !
- db 0x00, 0x07, 0x00, 0x07, 0x0 ; N=34 ASCII = "
- db 0x14, 0x7F, 0x14, 0x7F, 0x14 ; N=35 ASCII = #
- db 0x24, 0x2A, 0x7F, 0x2A, 0x12 ; N=36 ASCII = $
- db 0x23, 0x13, 0x08, 0x64, 0x62 ; N=37 ASCII = %
- db 0x36, 0x49, 0x55, 0x22, 0x50 ; N=38 ASCII = &
- db 0x00, 0x05, 0x03, 0x00, 0x0 ; N=39 ASCII = '
- db 0x00, 0x1C, 0x22, 0x41, 0x0 ; N=40 ASCII = (
- db 0x00, 0x41, 0x22, 0x1C, 0x0 ; N=41 ASCII = )
- db 0x14, 0x08, 0x3E, 0x08, 0x14 ; N=42 ASCII = *
- db 0x08, 0x08, 0x3E, 0x08, 0x8 ; N=43 ASCII = +
- db 0x00, 0x50, 0x30, 0x00, 0x0 ; N=44 ASCII = ,
- db 0x08, 0x08, 0x08, 0x08, 0x8 ; N=45 ASCII = -
- db 0x00, 0x60, 0x60, 0x00, 0x0 ; N=46 ASCII = .
- db 0x40, 0x20, 0x10, 0x08, 0x4 ; N=47 ASCII = /
- db 0x3E, 0x51, 0x49, 0x45, 0x3E ; N=48 ASCII = 0
- db 0x00, 0x42, 0x7F, 0x40, 0x0 ; N=49 ASCII = 1
- db 0x42, 0x61, 0x51, 0x49, 0x46 ; N=50 ASCII = 2
- db 0x21, 0x41, 0x45, 0x4B, 0x31 ; N=51 ASCII = 3
- db 0x18, 0x14, 0x12, 0x7F, 0x10 ; N=52 ASCII = 4
- db 0x27, 0x45, 0x45, 0x45, 0x39 ; N=53 ASCII = 5
- db 0x3C, 0x4A, 0x49, 0x49, 0x30 ; N=54 ASCII = 6
- db 0x01, 0x71, 0x09, 0x05, 0x3 ; N=55 ASCII = 7
- db 0x36, 0x49, 0x49, 0x49, 0x36 ; N=56 ASCII = 8
- db 0x06, 0x49, 0x49, 0x29, 0x1E ; N=57 ASCII = 9
- db 0x00, 0x66, 0x66, 0x00, 0x0 ; N=58 ASCII = :
- db 0x00, 0x56, 0x36, 0x00, 0x0 ; N=59 ASCII = ;
- db 0x08, 0x14, 0x22, 0x41, 0x0 ; N=60 ASCII = <
- db 0x14, 0x14, 0x14, 0x14, 0x14 ; N=61 ASCII = =
- db 0x00, 0x41, 0x22, 0x14, 0x8 ; N=62 ASCII = >
- db 0x02, 0x01, 0x51, 0x09, 0x6 ; N=63 ASCII = ?
- db 0x32, 0x49, 0x79, 0x41, 0x3E ; N=64 ASCII = @
- db 0x7E, 0x11, 0x11, 0x11, 0x7E ; N=65 ASCII = A
- db 0x7F, 0x49, 0x49, 0x49, 0x36 ; N=66 ASCII = B
- db 0x3E, 0x41, 0x41, 0x41, 0x22 ; N=67 ASCII = C
- db 0x7F, 0x41, 0x41, 0x22, 0x1C ; N=68 ASCII = D
- db 0x7F, 0x49, 0x49, 0x49, 0x49 ; N=69 ASCII = E
- db 0x7F, 0x09, 0x09, 0x09, 0x1 ; N=70 ASCII = F
- db 0x3E, 0x41, 0x41, 0x49, 0x7A ; N=71 ASCII = G
- db 0x7F, 0x08, 0x08, 0x08, 0x7F ; N=72 ASCII = H
- db 0x00, 0x41, 0x7F, 0x41, 0x0 ; N=73 ASCII = I
- db 0x20, 0x40, 0x41, 0x3F, 0x1 ; N=74 ASCII = J
- db 0x7F, 0x08, 0x14, 0x22, 0x41 ; N=75 ASCII = K
- db 0x7F, 0x40, 0x40, 0x40, 0x40 ; N=76 ASCII = L
- db 0x7F, 0x02, 0x0C, 0x02, 0x7F ; N=77 ASCII = M
- db 0x7F, 0x04, 0x08, 0x10, 0x7F ; N=78 ASCII = N
- db 0x3E, 0x41, 0x41, 0x41, 0x3E ; N=79 ASCII = O
- db 0x7F, 0x09, 0x09, 0x09, 0x6 ; N=80 ASCII = P
- db 0x3E, 0x41, 0x51, 0x21, 0x5E ; N=81 ASCII = Q
- db 0x7F, 0x09, 0x19, 0x29, 0x46 ; N=82 ASCII = R
- db 0x46, 0x49, 0x49, 0x49, 0x31 ; N=83 ASCII = S
- db 0x01, 0x01, 0x7F, 0x01, 0x1 ; N=84 ASCII = T
- db 0x3F, 0x40, 0x40, 0x40, 0x3F ; N=85 ASCII = U
- db 0x1F, 0x20, 0x40, 0x20, 0x1F ; N=86 ASCII = V
- db 0x3F, 0x40, 0x38, 0x40, 0x3F ; N=87 ASCII = W
- db 0x63, 0x14, 0x08, 0x14, 0x63 ; N=88 ASCII = X
- db 0x07, 0x08, 0x70, 0x08, 0x7 ; N=89 ASCII = Y
- db 0x61, 0x51, 0x49, 0x45, 0x43 ; N=90 ASCII = Z
- db 0x00, 0x7F, 0x41, 0x41, 0x0 ; N=91 ASCII = [
- db 0x02, 0x04, 0x08, 0x10, 0x20 ; N=92 ASCII = \
- db 0x00, 0x41, 0x41, 0x7F, 0x0 ; N=93 ASCII = ]
- db 0x04, 0x02, 0x01, 0x02, 0x4 ; N=94 ASCII = ^
- db 0x40, 0x40, 0x40, 0x40, 0x40 ; N=95 ASCII = _
- db 0x00, 0x01, 0x02, 0x04, 0x0 ; N=96 ASCII = `
- db 0x20, 0x54, 0x54, 0x54, 0x78 ; N=97 ASCII = a
- db 0x7F, 0x48, 0x48, 0x48, 0x30 ; N=98 ASCII = b
- db 0x38, 0x44, 0x44, 0x44, 0x44 ; N=99 ASCII = c
- db 0x30, 0x48, 0x48, 0x48, 0x7F ; N=100 ASCII = d
- db 0x38, 0x54, 0x54, 0x54, 0x58 ; N=101 ASCII = e
- db 0x00, 0x08, 0x7E, 0x09, 0x2 ; N=102 ASCII = f
- db 0x48, 0x54, 0x54, 0x54, 0x3C ; N=103 ASCII = g
- db 0x7F, 0x08, 0x08, 0x08, 0x70 ; N=104 ASCII = h
- db 0x00, 0x00, 0x7A, 0x00, 0x0 ; N=105 ASCII = i
- db 0x20, 0x40, 0x40, 0x3D, 0x0 ; N=106 ASCII = j
- db 0x00, 0x7F, 0x10, 0x28, 0x44 ; N=107 ASCII = k
- db 0x00, 0x41, 0x7F, 0x40, 0x0 ; N=108 ASCII = l
- db 0x7C, 0x04, 0x18, 0x04, 0x7C ; N=109 ASCII = m
- db 0x7C, 0x08, 0x04, 0x04, 0x78 ; N=110 ASCII = n
- db 0x38, 0x44, 0x44, 0x44, 0x38 ; N=111 ASCII = o
- db 0x7C, 0x14, 0x14, 0x14, 0x8 ; N=112 ASCII = p
- db 0x08, 0x14, 0x14, 0x14, 0x7C ; N=113 ASCII = q
- db 0x7C, 0x08, 0x04, 0x04, 0x8 ; N=114 ASCII = r
- db 0x48, 0x54, 0x54, 0x54, 0x24 ; N=115 ASCII = s
- db 0x04, 0x04, 0x3F, 0x44, 0x24 ; N=116 ASCII = t
- db 0x3C, 0x40, 0x40, 0x40, 0x3C ; N=117 ASCII = u
- db 0x1C, 0x20, 0x40, 0x20, 0x1C ; N=118 ASCII = v
- db 0x3C, 0x40, 0x30, 0x40, 0x3C ; N=119 ASCII = w
- db 0x44, 0x28, 0x10, 0x28, 0x44 ; N=120 ASCII = x
- db 0x04, 0x48, 0x30, 0x08, 0x4 ; N=121 ASCII = y
- db 0x44, 0x64, 0x54, 0x4C, 0x44 ; N=122 ASCII = z
- db 0x08, 0x36, 0x41, 0x41, 0x0 ; N=123 ASCII = {
- db 0x00, 0x00, 0x77, 0x00, 0x0 ; N=124 ASCII = |
- db 0x00, 0x41, 0x41, 0x36, 0x8 ; N=125 ASCII = }
- db 0x04, 0x02, 0x02, 0x02, 0x1 ; N=126 ASCII = ~
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=127 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=128 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=129 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=130 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=131 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=132 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=133 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=134 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=135 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=136 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=137 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=138 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=139 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=140 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=141 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=142 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=143 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=144 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=145 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=146 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=147 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=148 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=149 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=150 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=151 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=152 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=153 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=154 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=155 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=156 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=157 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=158 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=159 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=160 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=161 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=162 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=163 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=164 ASCII = ¤
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=165 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=166 ASCII = ¦
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=167 ASCII = §
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=168 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=169 ASCII = ©
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=170 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=171 ASCII = «
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=172 ASCII = ¬
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=173 ASCII =
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=174 ASCII = ®
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=175 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=176 ASCII = °
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=177 ASCII = ±
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=178 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=179 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=180 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=181 ASCII = µ
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=182 ASCII = ¶
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=183 ASCII = ·
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=184 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=185 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=186 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=187 ASCII = »
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=188 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=189 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=190 ASCII = ?
- db 0x00, 0x00, 0x00, 0x00, 0x0 ; N=191 ASCII = ?
- db 0x7C, 0x12, 0x11, 0x11, 0x7F ; N=192 ASCII = A
- db 0x7F, 0x49, 0x49, 0x49, 0x31 ; N=193 ASCII = A
- db 0x7F, 0x49, 0x49, 0x49, 0x36 ; N=194 ASCII = A
- db 0x7F, 0x01, 0x01, 0x01, 0x1 ; N=195 ASCII = A
- db 0x60, 0x3E, 0x21, 0x3F, 0x60 ; N=196 ASCII = A
- db 0x7F, 0x49, 0x49, 0x49, 0x41 ; N=197 ASCII = A
- db 0x77, 0x08, 0x7F, 0x08, 0x77 ; N=198 ASCII = ?
- db 0x41, 0x49, 0x49, 0x49, 0x36 ; N=199 ASCII = C
- db 0x7F, 0x20, 0x10, 0x08, 0x7F ; N=200 ASCII = E
- db 0x7E, 0x20, 0x13, 0x08, 0x7E ; N=201 ASCII = E
- db 0x7F, 0x08, 0x14, 0x22, 0x41 ; N=202 ASCII = E
- db 0x40, 0x3C, 0x02, 0x01, 0x7F ; N=203 ASCII = E
- db 0x7F, 0x06, 0x0C, 0x06, 0x7F ; N=204 ASCII = I
- db 0x7F, 0x08, 0x08, 0x08, 0x7F ; N=205 ASCII = I
- db 0x3E, 0x41, 0x41, 0x41, 0x3E ; N=206 ASCII = I
- db 0x7F, 0x01, 0x01, 0x01, 0x7F ; N=207 ASCII = I
- db 0x7F, 0x11, 0x11, 0x11, 0xE ; N=208 ASCII = ?
- db 0x3E, 0x41, 0x41, 0x41, 0x22 ; N=209 ASCII = N
- db 0x01, 0x01, 0x7F, 0x01, 0x1 ; N=210 ASCII = O
- db 0x07, 0x48, 0x48, 0x48, 0x3F ; N=211 ASCII = O
- db 0x0C, 0x12, 0x7F, 0x12, 0xC ; N=212 ASCII = O
- db 0x63, 0x14, 0x08, 0x14, 0x63 ; N=213 ASCII = O
- db 0x3F, 0x20, 0x20, 0x3F, 0x60 ; N=214 ASCII = O
- db 0x0F, 0x10, 0x10, 0x10, 0x7F ; N=215 ASCII = ?
- db 0x7F, 0x40, 0x7F, 0x40, 0x7F ; N=216 ASCII = O
- db 0x3F, 0x20, 0x3F, 0x20, 0x7F ; N=217 ASCII = U
- db 0x01, 0x7F, 0x48, 0x48, 0x30 ; N=218 ASCII = U
- db 0x7F, 0x48, 0x30, 0x00, 0x7F ; N=219 ASCII = U
- db 0x7F, 0x48, 0x48, 0x30, 0x0 ; N=220 ASCII = U
- db 0x22, 0x41, 0x49, 0x49, 0x3E ; N=221 ASCII = Y
- db 0x7F, 0x08, 0x3E, 0x41, 0x3E ; N=222 ASCII = ?
- db 0x46, 0x29, 0x19, 0x09, 0x7F ; N=223 ASCII = ?
- db 0x20, 0x54, 0x54, 0x54, 0x78 ; N=224 ASCII = a
- db 0x3C, 0x4A, 0x4A, 0x4A, 0x31 ; N=225 ASCII = a
- db 0x3E, 0x49, 0x4D, 0x4A, 0x30 ; N=226 ASCII = a
- db 0x7C, 0x04, 0x04, 0x0C, 0x0 ; N=227 ASCII = a
- db 0x60, 0x38, 0x24, 0x3C, 0x60 ; N=228 ASCII = a
- db 0x38, 0x54, 0x54, 0x54, 0x18 ; N=229 ASCII = a
- db 0x6C, 0x10, 0x7C, 0x10, 0x6C ; N=230 ASCII = ?
- db 0x44, 0x54, 0x54, 0x28, 0x0 ; N=231 ASCII = c
- db 0x7C, 0x20, 0x10, 0x08, 0x7C ; N=232 ASCII = e
- db 0x78, 0x42, 0x24, 0x12, 0x78 ; N=233 ASCII = e
- db 0x7C, 0x10, 0x28, 0x44, 0x0 ; N=234 ASCII = e
- db 0x70, 0x08, 0x04, 0x7C, 0x0 ; N=235 ASCII = e
- db 0x7C, 0x08, 0x10, 0x08, 0x7C ; N=236 ASCII = i
- db 0x7C, 0x10, 0x10, 0x10, 0x7C ; N=237 ASCII = i
- db 0x38, 0x44, 0x44, 0x44, 0x38 ; N=238 ASCII = i
- db 0x7C, 0x04, 0x04, 0x04, 0x7C ; N=239 ASCII = i
- db 0x7C, 0x14, 0x14, 0x08, 0x0 ; N=240 ASCII = ?
- db 0x38, 0x44, 0x44, 0x44, 0x0 ; N=241 ASCII = n
- db 0x08, 0x08, 0x78, 0x08, 0x8 ; N=242 ASCII = o
- db 0x0C, 0x50, 0x50, 0x50, 0x3C ; N=243 ASCII = o
- db 0x10, 0x28, 0x7C, 0x28, 0x10 ; N=244 ASCII = o
- db 0x44, 0x28, 0x10, 0x28, 0x44 ; N=245 ASCII = o
- db 0x3C, 0x20, 0x20, 0x3C, 0x60 ; N=246 ASCII = o
- db 0x0C, 0x10, 0x10, 0x7C, 0x0 ; N=247 ASCII = ?
- db 0x7C, 0x40, 0x7C, 0x40, 0x7C ; N=248 ASCII = o
- db 0x3C, 0x20, 0x3C, 0x20, 0x7C ; N=249 ASCII = u
- db 0x04, 0x7C, 0x50, 0x50, 0x20 ; N=250 ASCII = u
- db 0x7C, 0x50, 0x20, 0x00, 0x7C ; N=251 ASCII = u
- db 0x7C, 0x50, 0x50, 0x20, 0x0 ; N=252 ASCII = u
- db 0x28, 0x44, 0x54, 0x54, 0x38 ; N=253 ASCII = y
- db 0x7C, 0x10, 0x38, 0x44, 0x38 ; N=254 ASCII = ?
- db 0x08, 0x54, 0x34, 0x14, 0x7C ; N=255 ASCII = y
- ;DATA_EEPROM CODE 0xf00000
- ;
- ; DE "Test Data",0,1,2,3,4,5
- RESET_VECTOR CODE 0x0000
- goto Main ;go to start of main code
- HI_INT_VECTOR CODE 0x0008
- bra HighInt ;go to high priority interrupt routine
- LOW_INT_VECTOR CODE 0x0018
- bra LowInt ;go to low priority interrupt routine
- CODE
- HighInt:
- ; *** high priority interrupt code goes here ***
- retfie FAST
- LowInt:
- movff STATUS,STATUS_TEMP ;save STATUS register
- movff WREG,WREG_TEMP ;save working register
- movff BSR,BSR_TEMP ;save BSR register
- ; *** low priority interrupt code goes here ***
- movff BSR_TEMP,BSR ;restore BSR register
- movff WREG_TEMP,WREG ;restore working register
- movff STATUS_TEMP,STATUS ;restore STATUS register
- retfie
- Main:
- clrf OSCCON
- bsf OSCCON,IRCF0
- bsf OSCCON,IRCF1
- bsf OSCCON,IRCF2
- clrf TRISA
- clrf LATA
- clrf LATC
- bsf disp_e1
- bsf disp_e2
- clrf TRISC
- clrf TRISB
- clrf LATB
- bsf LATC,RC1
- bsf disp_e1 ; включение дисплея
- bsf disp_e2
- movlw b'00111111'
- call disp_send_cmd
- call disp_clean_c ; после включения на дисплее появляется "мусор", в симуляторе этого нет
- ; disp_line_macr .0,.0,.127,.63
- ; disp_line_macr .0,.0,.127,.50
- ; disp_line_macr .0,.0,.127,.40
- ; disp_line_macr .0,.0,.127,.30
- ; disp_line_macr .0,.0,.127,.20
- ; disp_line_macr .0,.0,.127,.10
- ; disp_line_macr .10,.20,.50,.40
- ;
- ; disp_print_str .15,.0,.7,'0','1','2','3','4',' ','Р','а','б','о','т','а','е','т','!','','','','','',''
- ; вывод изображения, без смещения внутри страницы
- ; disp_image_x,disp_image_y - координаты по которым выводим изображение
- ; disp_image_offset - смещение изображения, старший байт, младший - 0
- ; disp_image_width, disp_image_height - размеры изображения
- ; disp_image_num_pag - количество страниц в изображении
- ;Height = 42, Width = 24
- ;6 pages
- clrf disp_image_x
- clrf disp_image_y
- movlw 0x15
- movwf disp_image_offset
- movlw .42
- movwf disp_image_height
- movlw .24
- movwf disp_image_width
- movlw .6
- movwf disp_image_num_pag
- call disp_put_image2
- loop:
- goto loop
- ;******************************************************************************
- ; макросы для п/п
- ;******************************************************************************
- ; определение и переключение кристалла
- disp_set_chip macro x
- bcf disp_e1
- bsf disp_e2
- btfsc x,6
- bra $+0x06
- ;chip_e1:
- bsf disp_e1
- bcf disp_e2
- ;chip_e2:
- endm
- ;******************************************************************************
- ; подпрограммы
- ;******************************************************************************
- ; вывод изображения, без смещения внутри страницы
- ; disp_image_x,disp_image_y - координаты по которым выводим изображение
- ; disp_image_offset - смещение изображения, старший байт, младший - 0
- ; disp_image_width, disp_image_height - размеры изображения
- ; disp_image_num_pag - количество страниц в изображении
- disp_put_image2
- movf disp_image_y,W ; нахождение страницы
- rrcf WREG,W
- rrcf WREG,W
- rrcf WREG,W
- andlw b'00000111'
- movwf disp_page
- clrf num ; счетчик страниц
- clrf num2 ; счетчик x
- clrf TBLPTRL
- movff disp_image_offset,TBLPTRH
- disp_image2_loop_y:
- movf disp_page,W
- call disp_set_str ; установка страницы
- ; установка адреса и кристалла
- ; на втором контроллере сначала устанавливаен нулевой адрес
- ; если строка начинается в левой половине дисплея и переходит на правую, то в момент перехода
- ; во втором контроллере будет заранее установлен нулевой адрес
- bcf disp_e1
- bsf disp_e2
- movlw 0x00
- call disp_set_addr
- disp_set_chip disp_image_x
- movf disp_image_x,W
- bcf WREG,6
- call disp_set_addr
- movff disp_image_width,num2
- disp_image2_loop_x:
- tblrd*+
- movf TABLAT,W
- ;setf WREG
- call disp_write_data
- decfsz num2,F
- goto disp_image2_loop_x
- incf disp_page,F
- decfsz disp_image_num_pag,F
- goto disp_image2_loop_y
- return
- ;******************************************************************************
- ; вывод символа disp_char
- ; disp_char_y - страница
- ; disp_char_x автоинкрементируется
- ; WREG - код символа
- disp_put_char:
- movwf disp_char
- ; установка адреса и кристалла
- ; на втором контроллере сначала устанавливаен нулевой адрес
- ; если строка начинается в левой половине дисплея и переходит на правую, то в момент перехода
- ; во втором контроллере будет заранее установлен нулевой адрес
- bcf disp_e1
- bsf disp_e2
- movlw 0x00
- call disp_set_addr
- disp_set_chip disp_char_x
- movf disp_char_x,W
- bcf WREG,6
- call disp_set_addr
- ; установка страницы
- bsf disp_e1
- bsf disp_e2
- movf disp_char_y,W
- call disp_set_str
- ; умножение disp_char на 5, результат в TBLPTR
- clrf TBLPTRH
- movff disp_char,TBLPTRL
- bcf STATUS,C
- rlcf TBLPTRL,F
- rlcf TBLPTRH,F
- rlcf TBLPTRL,F
- rlcf TBLPTRH,F
- movf disp_char,W
- addwf TBLPTRL,F
- movlw 0x00
- addwfc TBLPTRH,F
- movf disp_char,W
- addwf TBLPTRL,F
- movlw 0x00
- addwfc TBLPTRH,F
- ; Сложение TBLPTR с адресом начала таблицы
- movlw low(table_font)
- addwf TBLPTRL,F
- movlw high (table_font)
- addwfc TBLPTRH,F
- ; вывод символа
- disp_set_chip disp_char_x
- tblrd*+
- movf TABLAT,W
- call disp_write_data
- incf disp_char_x
- disp_set_chip disp_char_x
- tblrd*+
- movf TABLAT,W
- call disp_write_data
- incf disp_char_x
- disp_set_chip disp_char_x
- tblrd*+
- movf TABLAT,W
- call disp_write_data
- incf disp_char_x
- disp_set_chip disp_char_x
- tblrd*+
- movf TABLAT,W
- call disp_write_data
- incf disp_char_x
- disp_set_chip disp_char_x
- tblrd*+
- movf TABLAT,W
- call disp_write_data
- incf disp_char_x
- disp_set_chip disp_char_x
- movlw 0x00
- call disp_write_data
- incf disp_char_x
- return
- ;******************************************************************************
- ; очистка дисплея
- disp_clean_c:
- bsf disp_e1
- bsf disp_e2
- clrf num2
- loop_clean1:
- movf num2,W
- call disp_set_str
- clrf num
- loop_clean:
- movf num,W
- call disp_set_addr ; установка адреса (x)
- movlw 0x00
- call disp_write_data
- incf num,F
- btfss num,6
- goto loop_clean
- incf num2,F
- btfss num2,3
- goto loop_clean1
- return
- ;******************************************************************************
- ; рисует линию от (disp_x1,disp_y1) до (disp_x2,disp_y2)
- ; пока работает только при (disp_x2-disp_x1) > (disp_y2-disp_y1) > 0
- disp_line:
- movf disp_y1,W
- subwf disp_y2,W
- movwf disp_2dy
- bcf STATUS,C ; на всякий случай, а вобще эта команда не нужна
- rlcf WREG,W
- movwf disp_2dy ; disp_2dy = 2*(disp_x2-disp_x1)
- clrf disp_err_H
- movwf disp_err_L
- movf disp_x1,W
- subwf disp_x2,W ; W=x2-x1
- subwf disp_err_L,F
- movlw .0
- subwfb disp_err_H,F
- ; err=2dy-dx=2dy-(disp_x2-disp_x1) = 2dy - disp_x2 + disp_x1
- ; disp_2_dy_sub_dx = 2*dy - 2*dx
- movff disp_2dy,disp_2_dy_sub_dx
- movf disp_x1,W
- subwf disp_x2,W ; W=x2-x1
- subwf disp_2_dy_sub_dx,F
- subwf disp_2_dy_sub_dx,F
- movf disp_x1,W
- subwf disp_x2,W
- movwf num
- disp_line_loop: ; цикл для disp_x1 от disp_x1 до disp_x2
- incf disp_x1,F
- call disp_putpx
- btfss disp_err_H,7
- goto disp_line_bol_ravno
- disp_line_men: ; disp_err < 0
- movf disp_2dy,W
- addwf disp_err_L,F
- movlw .0
- addwfc disp_err_H,F
- goto disp_line_endif
- disp_line_bol_ravno: ; disp_err >= 0
- incf disp_y1,F
- movf disp_2_dy_sub_dx,W
- negf WREG
- subwf disp_err_L,F
- movlw .0
- subwfb disp_err_H,F
- disp_line_endif:
- decfsz num
- goto disp_line_loop
- return
- ;******************************************************************************
- ; вывод точки с координатами disp_x1,disp_y1
- disp_putpx:
- movff disp_x1,disp_x
- movlw .64 ; определение в какой половине диспл. находится точка
- cpfslt disp_x
- goto disp_putpx_cs
- bsf disp_e1 ; disp_x1 < 64, выбираем е1
- bcf disp_e2
- goto disp_putpx_cs_end
- disp_putpx_cs:
- bcf disp_e1 ; disp_x1 >= 64, выбираем е2
- bsf disp_e2
- bcf disp_x,.6
- disp_putpx_cs_end:
- movf disp_y1,W ; нахождение страницы
- rrcf WREG,W
- rrcf WREG,W
- rrcf WREG,W
- andlw b'00000111'
- movwf disp_page
- call disp_set_str ; установка страницы
- clrf disp_buf ; определене положения внутри страницы и значения ему соответствующего
- movf disp_y1,W
- andlw b'00000111'
- incf WREG,W
- bsf STATUS,C
- disp_putpx_cs_lin:
- rlcf disp_buf,F
- decfsz WREG,W
- goto disp_putpx_cs_lin
- movf disp_x,W ; установка адреса (x)
- call disp_set_addr
- call disp_data_read ; В режиме чтения данных после команд «Set Page» и «Set Address»
- ;необходимо однократно выполнить «пустую» операцию чтения, результат которой не использовать.
- call disp_data_read
- movf disp_x,W ; установка адреса (x)
- call disp_set_addr
- movf disp_buf,W
- iorwf data_read,W
- call disp_write_data
- return
- ;******************************************************************************
- ; наверное получилось неоптимально, надо чтобы в цикле disp_y менялась не от 0 до 63
- ; а от нулевой строки страницы в которой начинается линия, до седьмой строки
- ; сектора где заканчивается линия
- ; тем не менее даже так вертикальные линии выводятся на порядок быстрее горизонтальных.
- disp_vert_lin: ; disp_x1,disp_y1 - коорд. начала, disp_r - длина линии
- bsf disp_e1 ; определение в какой половине диспл. находится линия
- bcf disp_e2 ; выбрали первый кристалл
- btfss disp_x1,.6
- goto vert_lin_e1 ; если disp_x1 < 127, то линия находится в левой половине дисп.
- bcf disp_e1 ; если иначе, то выбираем другой кристалл и disp_x1 = disp_x1 - 127
- bsf disp_e2
- bcf disp_x1,.6
- vert_lin_e1:
- clrf disp_y
- bcf disp_flag1 ; disp_flag1 показывает находится ли точка с y=disp_y на линии
- clrf disp_page
- loop2_disp_vert_lin:
- clrf disp_buf
- movlw .8
- movwf num
- loop1_disp_vert_lin: ; при совпадении адреса текущей точки с началом или концом линии
- movf disp_y1,W ; переключается disp_flag1. Когда текущая точка внутри отрезка disp_flag1=1
- cpfseq disp_y
- goto neravno
- goto ravno
- neravno:
- addwf disp_r,W
- cpfseq disp_y
- goto neravno1
- ravno:
- btg disp_flag1
- neravno1:
- bsf STATUS,C
- btfss disp_flag1
- bcf STATUS,C
- rrcf disp_buf,F
- incf disp_y,F
- decfsz num,F
- goto loop1_disp_vert_lin ; этот цикл крутится внутри страницы
- movf disp_x1,W ; установка адреса (x)
- call disp_set_addr
- movf disp_page,W ; установка страницы
- call disp_set_str
- call disp_data_read ; В режиме чтения данных после команд «Set Page» и «Set Address»
- ;необходимо однократно выполнить «пустую» операцию чтения, результат которой не использовать.
- call disp_data_read
- movf disp_x1,W ; установка адреса (x)
- call disp_set_addr
- movf disp_buf,W
- iorwf data_read,W
- call disp_write_data
- incf disp_page
- btfss disp_page,3
- goto loop2_disp_vert_lin ; в этом цикле перебираются страницы от 0 до 7
- return
- ;******************************************************************************
- disp_data_read: ; чтение данных, результат помещается в data_read
- setf disp_tris
- bsf disp_a0
- bsf disp_rw
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- nop
- movff PORTB,data_read
- bcf disp_e
- call disp_wait
- bcf disp_rw
- clrf disp_tris
- return
- ;******************************************************************************
- disp_set_str ; установка страницы, аргумент - WREG
- ;clrf TRISB
- addlw b'10111000'
- bcf disp_a0
- bcf disp_rw
- movwf disp_port
- ; call Delay_1
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- nop
- ; call Delay_1
- bcf disp_e
- call disp_wait
- return
- ;******************************************************************************
- disp_set_addr: ; установка адреса
- ;clrf TRISB
- addlw b'01000000'
- bcf disp_a0
- ;bcf disp_rw
- movwf disp_port
- ; call Delay_1
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- nop
- ; call Delay_1
- bcf disp_e
- call disp_wait
- return
- ;******************************************************************************
- disp_send_cmd: ; отправка команды дисплею. Сейчас используется только для инициализации дисплея
- ;clrf TRISB ; потом нужно будет убрать эту п/п
- bcf disp_a0
- bcf disp_rw
- movwf disp_port
- ; call Delay_1
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- nop
- ; call Delay_1
- bcf disp_e
- call disp_wait
- return
- ;******************************************************************************
- disp_write_data: ; запись данных в ОЗУ дисплея
- ;clrf TRISB
- bsf disp_a0
- bcf disp_rw ; на всякий случай, потом надо будет убрать
- movwf disp_port
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- nop
- bcf disp_e
- call disp_wait
- return
- ;******************************************************************************
- disp_wait: ; п/п ожидания сброса флага занятости дисплея
- setf TRISB
- bcf disp_a0
- bsf disp_rw
- loop_read:
- bcf disp_e ; КАЖЕТСЯ ЗДЕСЬ НЕПРАВИЛЬНЫЕ ЗАДЕРЖКИ (для Fosc=40МГц)
- nop
- nop
- nop
- bsf disp_e ; PWEH 450 нс, здесь при 40 МГц длительность строба будет 500 нс
- nop
- nop
- nop
- btfsc PORTB,7 ; tDDR 320 нс, здесь читаем данные
- goto loop_read ; tcycE 1000 – нс
- bcf disp_e
- nop
- nop
- nop
- bcf disp_rw
- clrf TRISB
- return
- END
Add Comment
Please, Sign In to add comment