Главная » Статьи » PICBasicPro

Вывод графической информаций на LCD 3310
В предыдущей статье мы рассматривали инициализацию LCD дисплея Nokia 3310, в этой статье мы научимся выводить простые примитивы (буквы, цифры)
Немного теории.
Дисплей от Nokia 3310 является графическим и сам не содержит библиотеки символов в отличие от знакогенерирующих. Это означает что все элементы(цифры,буквы) придется прорисовывать самому. С одной стороны это хорошо(можно создавать своий библиотеки символов), с другой программа занимает много памяти МК. Полный массив символов размером 5х8 (от A-Z в нашем случаи) записывается в EEPROM и занимает довольно таки большое количество памяти (EEPROM) используемого контроллера.
Наглядно рассмотрим символ А(английский) он представляет собой массив 5х8 точек(Рис.1).
Рис.1

Об адресаций писал ранне у нас идет от Младшего байта к Старшему, то есть $7E =Ст.б. 0111 Мл.б. 1110
Соответственно так же для каждого столбца символа А :
Code
  
'...................................................' DEC |Chr|HEX  
Data $7E,$11,$11,$11,$7E,$00 '65| A |41 'команда Data записывает в EEPROM 5 байтов символа символа А начиная с нулевой ячейки памяти и в конце $00 пустой столбец нужен для отделения символов друг от друга  

Вся сложность у вас может возникнуть с правильной адресаций ячеек памяти.
Напишем нашу первую программу вывода одного символа на экран, я привожу самый упрощенный вариант
Code

CLK VAR GPIO.0
  DTA VAR GPIO.1
  DC VAR GPIO.2
  RST VAR GPIO.4  

   
   
  Chr VAR Byte
  BitMap VAR Word
  PosX VAR Byte
  PosY VAR Byte
  Column VAR Byte [6] 'массив  
  LcdData VAR Byte
   
  PAUSE 100
  GOSUB LCD_INIT
  PAUSE 100
  GOSUB LCD_Clear
   
Start:
  PosX=0:PosY=0:GOSUB LCD_GotoXY ' устанавливаем курсор в нужную позицию
   
  FOR Chr=0 TO 5 'счетчик  
  READ Chr,Column(Chr)' считываем из EEPROM начиная с 0 ячейки и заносим в массив Column(Chr) биты символа а
  NEXT Chr
  HIGH DC 'устанавливаем вод данных  
  SHIFTOUT DTA,CLK,1,[Column(0),Column(1),Column(2),Column(3),Column(4),Column(5)]
  goto start
   
LCD_Init:

  LOW RST :pause 100 : HIGH RST : LOW DC ' RESET LCD
   
  LcdData= $21: GOSUB LCD_ByteOut ' LCD EXTENDED COMMANDS
  LcdData= $c8: GOSUB LCD_ByteOut ' SET LCD Vop (CONTRAST)
  LcdData= $06: GOSUB LCD_ByteOut ' SET TEMP COEFFICENT
  LcdData= $13: GOSUB LCD_ByteOut ' LCD BIAS MODE
  LcdData= $20: GOSUB LCD_ByteOut ' LCD STANDARD COMMANDS
  LcdData= $0c: GOSUB LCD_ByteOut ' LCD IN NORMAL MODE
RETURN
   
LCD_ByteOut:
  SHIFTOUT DTA,CLK,1,[LcdData]
RETURN
   
LCD_Clear:
  PosX=0:PosY=0:GOSUB LCD_GotoXY
  HIGH DC
  FOR Chr=1 TO 252
  LcdData=0:GOSUB LCD_ByteOut
  LcdData=0:GOSUB LCD_ByteOut
  NEXT Chr
RETURN
   
LCD_GotoXY:
  LOW DC
  LcdData=%01000000 | PosY :GOSUB LCD_ByteOut
  LcdData=%10000000 | PosX :GOSUB LCD_ByteOut
RETURN

  '-------------------------------------------------  
  ' Font DATA table  
  '-------------------------------------------------  
'................................................. ' DEC Chr HEX  
DATA $20, $54, $54, $54, $78, $00 '224 а


Отлично теперь напишем программу для вывода первой строчки, так как я в своих целях использовал pic12f629 то памяти EEPROM у меня не хватает на все символы от а до я.
Code

  CLK VAR GPIO.0
  DTA VAR GPIO.1
  DC VAR GPIO.2
  RST VAR GPIO.4  
   
  Chr_1 VAR Byte
  Chr VAR Byte
  BitMap VAR Word
  PosX VAR Byte
  PosY VAR Byte
  Column VAR Byte [6]
  LcdData VAR Byte
   
  PAUSE 100
  GOSUB LCD_INIT
  PAUSE 100
  GOSUB LCD_Clear
   
Start:
  PosX=0:PosY=0:GOSUB LCD_GotoXY ' начало координат  

  FOR Chr_1=0 TO 9
  LOOKUP Chr_1,["привет мир"],BitMap  
  pause 40
  GOSUB LCD_CharOut:
  NEXT Chr_1
  stop
   
LCD_CharOut:
  IF bitmap=32 THEN bitmap=243 ' SPACE
   
  BitMap=(bitmap-224) * 6  
   
  FOR Chr=0 TO 5
  READ BitMap+Chr,Column(Chr)
  NEXT Chr
  HIGH DC
  SHIFTOUT DTA,CLK,1,[Column(0),Column(1),Column(2),Column(3),Column(4),Column(5)]
RETURN
   
LCD_Init:

  LOW RST :pause 20 : HIGH RST : LOW DC ' RESET LCD
   
  LcdData= $21: GOSUB LCD_ByteOut ' LCD EXTENDED COMMANDS
  LcdData= $c8: GOSUB LCD_ByteOut ' SET LCD Vop (CONTRAST)
  LcdData= $06: GOSUB LCD_ByteOut ' SET TEMP COEFFICENT
  LcdData= $13: GOSUB LCD_ByteOut ' LCD BIAS MODE
  LcdData= $20: GOSUB LCD_ByteOut ' LCD STANDARD COMMANDS
  LcdData= $0c: GOSUB LCD_ByteOut ' LCD IN NORMAL MODE
RETURN
   
LCD_ByteOut:
  SHIFTOUT DTA,CLK,1,[LcdData]
RETURN
   
LCD_Clear:
  PosX=0:PosY=0:GOSUB LCD_GotoXY
  HIGH DC
  FOR Chr=1 TO 252
  LcdData=0:GOSUB LCD_ByteOut
  LcdData=0:GOSUB LCD_ByteOut
  NEXT Chr
RETURN
   
LCD_GotoXY:
  LOW DC
  LcdData=%01000000 | PosY :GOSUB LCD_ByteOut
  LcdData=%10000000 | PosX :GOSUB LCD_ByteOut
RETURN

  '-------------------------------------------------  
  ' Font DATA table  
  '-------------------------------------------------  
...................................................' DEC Chr HEX  
DATA $20, $54, $54, $54, $78, $00 '224 а
DATA $3C, $4A, $4A, $49, $31, $00 '225 б
DATA $7C, $54, $54, $28, $00, $00 '226 в
DATA $7C, $04, $04, $04, $0C, $00 '227 г
DATA $E0, $54, $4C, $44, $FC, $00 '228 д
DATA $38, $54, $54, $54, $08, $00 '229 е
DATA $6C, $10, $7C, $10, $6C, $00 '230 ж
DATA $44, $44, $54, $54, $28, $00 '231 з
DATA $7C, $20, $10, $08, $7C, $00 '232 и
DATA $78, $42, $24, $12, $78, $00 '233 й
DATA $7C, $10, $28, $44, $00, $00 '234 к
DATA $20, $44, $3C, $04, $7C, $00 '235 л
DATA $7C, $08, $10, $08, $7C, $00 '236 м
DATA $7C, $10, $10, $10, $7C, $00 '237 н
DATA $38, $44, $44, $44, $38, $00 '238 о
DATA $7C, $04, $04, $04, $7C, $00 '239 п
DATA $7C, $14, $14, $14, $08, $00 '240 р
DATA $38, $44, $44, $44, $44, $00 '241 с
DATA $04, $04, $7C, $04, $04, $00 '242 т
DATA $00, $00, $00, $00, $00, $00 '32 space 20
  



Соответственно меня координаты PosX=0:PosY=0 можно менять расположения изображения на экране.
если есть вопросы пишите в комментариях или в личку


Категория: PICBasicPro | Добавил: Uncle_Dizel (02.11.2011)
Просмотров: 10418 | Комментарии: 5 | Рейтинг: 5.0/2
Всего комментариев: 5
1 mikhail09p   (03.11.2011 09:40)
Клас! Жаль только, что не на Протоне, придётся помудрить. wink

2 retas   (21.11.2011 21:19)
Ну, если на Протоне кто осилит, просьбо поделиться!

3 retas   (22.11.2011 00:23)
Во, нашёл
http://webcache.googleusercontent.com/search?....k&gl=lt
Попробовал скомпилить - без проблем!
Ура, товарищи!!!

4 dmnew   (27.04.2012 12:18)
никак не могу запустить в протеусе

5 bulat   (18.06.2015 23:16)
Попытался переделать на протон,но не могу понять как пользоваться командой READ-пишет ошибка
вот вывод буквы а
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright © 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 19.06.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 12F629
Reminders = OFF 
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, MCLRE_OFF ;No crystal, no reset 
Reminders = On 
Xtal = 4
TRISIO = %00000 
GPIO = %00000
Declare All_Digital = On
Symbol CLK=GPIO.0 
Symbol  DTA=GPIO.1 
Symbol  DC_=GPIO.2 
Symbol  RST=GPIO.4  
GPIO=0   
   
Dim   Chr As Byte 
Dim   BitMap As Word 
Dim   PosX As Byte 
Dim   PosY As Byte 
Dim   ColumnDim[6]  As Byte  '??????  
Dim   LcdData As Byte 

RST=0
DelayMS 100
RST=1   
  DelayMS 100 
  GoSub LCD_Init 
  DelayMS 100 
  GoSub LCD_Clear 
   
Start: 
  PosX=0:PosY=0:GoSub LCD_GotoXY ' ????????????? ?????? ? ?????? ??????? 
  'Column[]=
DATA $20, $54, $54, $54, $78, $00 '224 ?   
  For Chr=0 To 5 '???????  
  'READ Column(Chr)' Chr,????????? ?? EEPROM ??????? ? 0 ?????? ? ??????? ? ?????? Column(Chr) ???? ??????? ? 
  Next Chr 
  High DC_ '????????????? ??? ??????  
  SHOut DTA,CLK,1,[$20, $54, $54, $54, $78, $00]'Column(0),Column(1),Column(2),Column(3),Column(4),Column(5) 
  GoTo Start 
   
LCD_Init: 

  Low RST :DelayMS 100 : High RST : Low DC_ ' RESET LCD 
   
  LcdData= $21: GoSub LCD_ByteOut ' LCD EXTENDED COMMANDS 
  LcdData= $c8: GoSub LCD_ByteOut ' SET LCD Vop (CONTRAST) 
  LcdData= $06: GoSub LCD_ByteOut ' SET TEMP COEFFICENT 
  LcdData= $13: GoSub LCD_ByteOut ' LCD BIAS MODE 
  LcdData= $20: GoSub LCD_ByteOut ' LCD STANDARD COMMANDS 
  LcdData= $0c: GoSub LCD_ByteOut ' LCD IN NORMAL MODE 
Return 
   
LCD_ByteOut: 
  SHOut DTA,CLK,1, 
[LcdData]Return 
   
LCD_Clear: 
  PosX=0:PosY=0:GoSub LCD_GotoXY 
  High DC_ 
  For Chr=1 To 252 
  LcdData=0:GoSub LCD_ByteOut 
  LcdData=0:GoSub LCD_ByteOut 
  Next Chr 
Return 
'DATA $20, $54, $54, $54, $78, $00 '224 ?    
LCD_GotoXY: 
  Low DC_ 
  LcdData=%01000000 | PosY :GoSub LCD_ByteOut 
  LcdData=%10000000 | PosX :GoSub LCD_ByteOut 
Return 

  '-------------------------------------------------  
  ' Font DATA table  
  '-------------------------------------------------  
'................................................. ' DEC Chr HEX

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]