Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



LCD + 74HC595

Сообщений 1 страница 7 из 7

1

В качестве саморазвития попробовал в протеусе код одного забугорного товарища. Суть вывод информации на дисплей по трем линиям с помощью копеечного регистра 74HC595.
Хотелось бы услышать критику от гуру, а так же помощь в оптимизации кода... Многовато места он занимает...

код
Код:
'##################################### 3 WIRE LCD BASCOM ###########################
' ATmega
' 74HC595 SHIFT REGISTER
' 2x16 LCD (HD44780)
' + 5V
'
'             74HC595
'             ________
'             |      |----1-Q1~~~~DB6 LCD 13
'             |      |----2-Q2~~~~DB5 LCD 12
'     Vcc-16--|      |----3-Q3~~~~DB4 LCD 11
'     GND--8--|      |----4-Q4~~~~RS  LCD  4
'             |      |----5-Q5~~~~E   LCD  5
' Vcc~~MR-10--|      |----6-Q6
' GND~~OE-13--|      |----7-Q7
'             |      |---15-Q0~~~~DB7 LCD 14
'      Q7S-9--|      |
'             |      |---11-SHCP~~PB1 (Clk) µC
'             |      |---12-STCP~~PB2 (Rck) µC
'             |      |---14-DS~~~~PB0 (Dat) µC
'             --------
'
' LCD: 1: GND / 2: VDD / 3: VEE / 4: RS = Q4 / 5: RW = GND / 6: E=Q5 .... 11: DB4 = Q3 / 12: DB5 = Q2 / 13: DB6 = Q1 / 14: DB7 = Q0




$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600

$hwstack = 64
$swstack = 64
$framesize = 64

'#####################################

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output

Dat Alias Portb.0
Clk Alias Portb.1
Rck Alias Portb.2

'#####################################

Dim Rse As Byte                                             'RS and E
Dim I As Byte
Dim Lcd_string As String * 16
Dim Character(17) As Byte At Lcd_string Overlay

'#####################################

Declare Sub Write_lcd_cmd8(byval Cmd As Byte)               'Write command
Declare Sub Write_lcd_cmd(byval Cmd As Byte)                'Write command in 4 Bit mode
Declare Sub Write_lcd_txt(byval Txt As Byte)                'LCD Init
Declare Sub Init_3w                                         'LCD Cls
Declare Sub Cls_3w
Declare Sub Lcd_3w(byval Lcdstring As String)               'LCD output
Declare Sub Locate_3w(byval Y As Byte , Byval X As Byte)    'LCD Locate

'#####################################

Call Init_3w
Call Cls_3w

'#####################################  Test Test Test

Do

   Call Locate_3w(1 , 1) : Call Lcd_3w( "Hello World")
   Wait 1
   Call Locate_3w(2 , 1) : Call Lcd_3w( "Second Line")
   Wait 2
   Call Cls_3w
   Call Locate_3w(1 , 1) : Call Lcd_3w( "1")
   Wait 1
   Call Locate_3w(1 , 2) : Call Lcd_3w( "2")
   Wait 1
   Call Locate_3w(1 , 3) : Call Lcd_3w( "3")
   Wait 1
   Call Locate_3w(1 , 3) : Call Lcd_3w( "C")
   Wait 1
   Call Locate_3w(1 , 2) : Call Lcd_3w( "B")
   Wait 1
   Call Locate_3w(1 , 1) : Call Lcd_3w( "A")
   Wait 2
   Call Cls_3w
   Call Locate_3w(1 , 1) : Call Lcd_3w( "1234567890123456")
   Call Locate_3w(2 , 1) : Call Lcd_3w( "ABCDEFGHIJKLMNOP")
   Wait 2
   Call Cls_3w
   Wait 1

Loop

'#####################################    Write LCD Command  (8 Bit Mode)

Sub Write_lcd_cmd8(byval Cmd As Byte)

   Rse = &B01                                               'E=1 Rs=0

   For I = 0 To 1

      Shiftout Dat , Clk , Rse , 2 , 2                      'send Rs and E
      Shiftout Dat , Clk , Cmd , 2 , 4                      'send upper nibble

      Rck = 0
      Rck = 1
      Rck = 0

      Rse = &B00                                            'E=0 Rs=0

   Next

End Sub

'#####################################   Write LCD Command  (4 Bit Mode)

Sub Write_lcd_cmd(byval Cmd As Byte)

   Local Cmd2 As Byte

   Cmd2 = Cmd

   Swap Cmd

   Rse = &B01                                               'E=1 Rs=0

   For I = 0 To 1                                           'upper nibble

      Shiftout Dat , Clk , Rse , 2 , 2                      'send Rs and E
      Shiftout Dat , Clk , Cmd , 2 , 4                      'send nibble

      Rck = 0
      Rck = 1
      Rck = 0

      Rse = &B00                                            'E=0 Rs=0

   Next

   Rse = &B01

   For I = 0 To 1                                           'lower nibble

      Shiftout Dat , Clk , Rse , 2 , 2                      'send Rs and E
      Shiftout Dat , Clk , Cmd2 , 2 , 4                     'send nibble

      Rck = 0
      Rck = 1
      Rck = 0

      Rse = &B00                                            'E=0 Rs=0

   Next

End Sub

'#####################################   Write LCD Character  (4 Bit Mode)

Sub Write_lcd_txt(byval Txt As Byte)

   Local Txt2 As Byte

   Txt2 = Txt

   Swap Txt

   Rse = &B11                                               'E=1 Rs=1

   For I = 0 To 1                                           'upper nibble

      Shiftout Dat , Clk , Rse , 2 , 2                      'send Rs and E
      Shiftout Dat , Clk , Txt , 2 , 4                      'send nibble

      Rck = 0
      Rck = 1
      Rck = 0

      Rse = &B10                                            'E=0 Rs=1

   Next

   Rse = &B11                                               'E=1 Rs=1

   For I = 0 To 1                                           'lower nibble

      Shiftout Dat , Clk , Rse , 2 , 2                      'send Rs and E
      Shiftout Dat , Clk , Txt2 , 2 , 4                     'send nibble

      Rck = 0
      Rck = 1
      Rck = 0

      Rse = &B10                                            'E=0 Rs=1

  Next

End Sub

'#####################################    Init LCD

Sub Init_3w

   Waitms 20
   Call Write_lcd_cmd8(&B0000_0011)                         'Init 4 Bit 1x
   Waitms 5
   Call Write_lcd_cmd8(&B0000_0011)                         '2x
   Waitms 5
   Call Write_lcd_cmd8(&B0000_0011)                         '3x
   Waitms 5
   Call Write_lcd_cmd8(&B0000_0010)                         '4 Bit Mode
   Waitms 5
   Call Write_lcd_cmd(&B0010_1000)                          '4 Bit / 2 Lines /  5x8 Font
   Waitms 5
   Call Write_lcd_cmd(&B0000_1100)                          'Display ON / Cursor OFF / Blinking OFF
   Waitms 5
   Call Write_lcd_cmd(&B0000_0100)                          'Increment /  Shift OFF
   Waitms 5

End Sub

'#####################################   CLS

Sub Cls_3w

   Call Write_lcd_cmd(&B0000_0001)
   Waitms 5

End Sub

'#####################################  LOCATE  (y,x)

Sub Locate_3w(byval Y As Byte , Byval X As Byte)

   X = X - 1

   Call Write_lcd_cmd(&B0000_0010)                          'Cursor home
   Waitms 5

   If Y = 1 Then
      Call Write_lcd_cmd(&H80 + X)                          '1st line
   Elseif Y = 2 Then
      Call Write_lcd_cmd(&Hc0 + X)                          '2nd line
   End If

End Sub

'#####################################  LCD   (String)

Sub Lcd_3w(byval Lcdstring As String)

   Local Strlen As Byte
   Local A As Byte

   Strlen = Len(lcdstring)
   Lcd_string = Lcdstring

   For A = 1 To Strlen
      Call Write_lcd_txt(character(a))
   Next

End Sub

'#####################################

в протеусе работает.
проект в протеусе

sasha_1973 Вас жду первого  :cool:

есть и экстремальные решения:
Подключение дисплея по 1 проводу
считаю, что нужно тоже попробовать реализовать на бэйсике!

Отредактировано NewUserBascom (2017-07-01 22:04:38)

0

2

неужто все пользуются Протеусом кроме меня? почему нельзя просто выложить схему и исходник, и всё в "обычных" форматах?
чем Это открыть не имея ворованный Протеус, товарищи?!

0

3

Александр Д. написал(а):

неужто все пользуются Протеусом кроме меня? почему нельзя просто выложить схему и исходник, и всё в "обычных" форматах?
чем Это открыть не имея ворованный Протеус, товарищи?!

Я сам недавно только протеусом начал пользоваться...
Пожалуйста, нет проблем
http://s4.uploads.ru/t/5pqmw.jpg
http://s6.uploads.ru/t/hsugt.jpg
http://se.uploads.ru/t/NXO9S.jpg

Отредактировано NewUserBascom (2017-07-01 22:47:13)

0

4

Ссылка на первоисточник:
Ссылка
Даешь фору китайским кривым платам  на PFC8574!

+1

5

кстати, а чем кривы платы на PFC8574?
а то я повёлся и прикупил штуки три на днях...

0

6

Александр Д. написал(а):

кстати, а чем кривы платы на PFC8574?
а то я повёлся и прикупил штуки три на днях...


Китайцы стали делать сами микры очень плохо. На многих форумах читал, что адреса плавают, надо на плату ставить перемыку на пин RW, вариации плат растут с каждым днем. Я сам чино напарывался 3 раза на подделки. Причем покупал у разных, и не самые дешевые. К тому же 595 регистров навалом можно выдирать из аппаратуры...
Изучал исходник в начале темы, ничего лишнего... почти 2к памяти кушает. Остается только на ассемблере делать вставки...
В интернете очень много на С примеров.
вот например, в тиньку13 влезает...
Ссылка

Отредактировано NewUserBascom (2017-07-01 23:47:00)

0

7

NewUserBascom написал(а):

sasha_1973 Вас жду первого


Чёй-то.



LCD по 2 проводам меня вполне устраивает

в догонку



NewUserBascom написал(а):

Суть вывод информации на дисплей по трем линиям с помощью копеечного регистра 74HC595

Где-то тут выкладывал, но что-то не могу найти

Отредактировано sasha_1973 (2017-07-02 03:42:39)

0