$nocompile
'(******************************************************************************
*                                                                              *
*             Библиотека BASCOM для работы с дисплеями NOKIA                   *
*    1100,1101,1110,1110i,1112,1116,1200,1202,1203,1280,2300,2660,2760,6085    *
*                                                                              *
*                 текст 8 строк по 16 символов (Eng+Рус)                       *
*                         картинка 96х68 (.bgf)                                *
*                                                                              *
*                   MrShilov 2012. StPeterburg. RUSSIA                         *
*                                                                              *
********************************************************************************
')
$inc Fonts , 960 , "fonts.inc"                              'файл шрифтов

'-------------------------- Инициализация дисплея ------------------------------
Sub Nokia_init()
Display_reset = 0                                           'подаем сигнал сброса
Waitms 100                                                  'ждем базовых установок
Display_reset = 1                                           'снимаем сигнал сброса
Waitms 10
Nokia_data_9 = &HA4 : Gosub Nokia_out_cmd
Nokia_data_9 = &H2F : Gosub Nokia_out_cmd
Nokia_data_9 = &HAF : Gosub Nokia_out_cmd

'Nokia_data_9 = &HA7 : Gosub Nokia_out_cmd                   'негатив ------------------- если нужно
Nokia_data_9 = &HA6 : Gosub Nokia_out_cmd                   'нет негатива

'Nokia_data_9 = &HA1 : Gosub Nokia_out_cmd                   'разворот справа-налево ---- если нужно
Nokia_data_9 = &HA0 : Gosub Nokia_out_cmd                   'нет разворота

Call Nokia_clear()                                          'очищаем дисплей
End Sub

'---------------------------- Очистка дисплея ----------------------------------
Sub Nokia_clear()
Local Clear_loop As Word

Nokia_data_9 = &H10 : Gosub Nokia_out_cmd
Nokia_data_9 = &H00 : Gosub Nokia_out_cmd
Nokia_data_9 = &HB0 : Gosub Nokia_out_cmd
Nokia_data_9 = 0
For Clear_loop = 1 To 864                                   'просто заполняем дисплей пробелами
   Gosub Nokia_out_data
Next Clear_loop
End Sub

'------------------------ Вывод текста на дисплей ------------------------------
Sub Nokia_text(byval Nokia_x As Byte , Byval Nokia_y As Byte , Byval Nokia_text As String , Byval Nokia_inversion As Byte)
Local Nokia_data As Byte
Local Text_length As Byte
Local Nokia_row_loop As Byte
Local Display_col_loop As Word
Local Display_column As Word
Local Display_character As String * 1
Local Display_row As Word
If Nokia_x > 0 Then Nokia_x = Nokia_x - 1
Nokia_x = Nokia_x * 6                                       'в символе 6 столбцов

Nokia_data_9 = Nokia_x And 240
Nokia_data = Nokia_data_9
Shift Nokia_data_9 , Right , 4
Nokia_data_9 = 16 + Nokia_data_9
Gosub Nokia_out_cmd                                         'старший байт координаты Х
Nokia_data_9 = Nokia_x - Nokia_data
Gosub Nokia_out_cmd                                         'младший байт координаты Х
Nokia_data_9 = 175 + Nokia_y : Gosub Nokia_out_cmd          'координата Y (&HB0+Y)

Text_length = Len(nokia_text)                               'длина строки
For Nokia_row_loop = 1 To Text_length                       'выводим строку
   Display_character = Mid(nokia_text , Nokia_row_loop , 1) 'текущий символ
   Display_column = Asc(display_character)
   Display_column = Display_column - 32
   If Display_column > 159 Then Display_column = Display_column - 64
      Display_column = Display_column * 6
      Display_row = Display_column + 5
   For Display_col_loop = Display_column To Display_row     'считываем и выводим символ
      Nokia_data = Lookup(display_col_loop , Fonts)
      If Nokia_inversion = 1 Then Nokia_data = Not Nokia_data       'инверсия символа
      Nokia_data_9 = Nokia_data
      Gosub Nokia_out_data
   Next Display_col_loop
Next Nokia_row_loop                                         'следующий символ
End Sub

'------------------------- Вывод рисунка ---------------------------------------

Sub Nokia_picture(bylabel Nokia_label As Word)
Call Nokia_clear()
Local Nokia_data As Byte
Local Nokia_row_loop As Word
Local Nokia_temp_data As Byte
Local Nokia_loop_times As Byte
Local Nokia_loop As Byte
Nokia_data_9 = &H10 : Gosub Nokia_out_cmd
Nokia_data_9 = &H00 : Gosub Nokia_out_cmd
Nokia_data_9 = &HB0 : Gosub Nokia_out_cmd
W = Nokia_label
Read Nokia_data                                             'пропускаем высоту
Read Nokia_data                                             'пропускаем ширину
For Nokia_row_loop = 1 To 864                               'считываем и выводим побайтно
   Read Nokia_data

   If Nokia_data = 170 Then                                 'признак компрессии
      Read Nokia_loop_times                                 'количество повторов
      Decr Nokia_loop_times
      For Nokia_loop = 1 To Nokia_loop_times
         Nokia_data_9 = Nokia_temp_data
         Gosub Nokia_out_data
         Incr Nokia_row_loop
      Next Nokia_loop
      Decr Nokia_row_loop
      Goto Nokia_picture1
   End If
   Nokia_data_9 = Nokia_data
   Nokia_temp_data = Nokia_data                             'запоминаем на случай компрессии
   Gosub Nokia_out_data
Nokia_picture1:
Next Nokia_row_loop
End Sub

'------------------------- Посылка команд --------------------------------------
Nokia_out_cmd:
Shift Nokia_data_9 , Left , 7
Nokia_cs = 0
Shiftout Nokia_spi_data , Nokia_spi_clock , Nokia_data_9 , 1 , 9 , 0
Nokia_cs = 1
Return

'-------------------------- Посылка данных -------------------------------------
Nokia_out_data:
Nokia_data_9 = 256 + Nokia_data_9
Shift Nokia_data_9 , Left , 7
Nokia_cs = 0
Shiftout Nokia_spi_data , Nokia_spi_clock , Nokia_data_9 , 1 , 9 , 0
Nokia_cs = 1
Return