Возник почти из воздуха у меня индикатор от стационарного телефона. Думаю, многие с ним знакомы. Алгоритм предельно прост, скачать подробную статью можно тут: http://avr.easycoding.org/other/ht1611.rar (216 кб)
Дело в том, что я никак толком не могу уговорить его работать. Мне нужно сделать подпрограмму на BascomAVR, которая выводила бы указанную в параметре строку. Сразу говорю, другие языки не нужны, не пройдёт, в т.ч. по независящим от меня причинам
Этот индикатор имеет несколько особенностей:
1. после подачи питания должно пройти хотя бы секунда, а иногда и 2, прежде чем на него можно подавать какие-то сигналы для вывода информации.
2. если на индикатор долго не приходят сигналы обновления инфлормации, он может переключиться в режим вывода времени, поэтому раз в секунду-две-три надо что-то на него выводить.
3. если обновление информации происходит чаще, чем 2-3 раза в секунду, то индикатор ничего не обновляет, может вообще погаснуть или будет показывать старую информацию.
Я с ним работал очень давно, поэтому всех тонкостей не упомню, но эти три вроде самые главные.
Разумеется, про согласовение уровней сигналов забывать тоже не стоит.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
void send_byte (unsigned char data) //Отправка байта по шине
{
unsigned char i;
for (i=0; i<4; i++)
{
if (data&1) {PORTB|= 1;} else {PORTB&= ~1;};//сброс линии данных, если бит=0 и наоборот
data=data>>1; //сдвиг вправо
PORTB|= 2; //установка линии тактирования
delay_1us(); //задержка на установку данных
PORTB&= ~2;//сброс линии тактирования
delay_1us(); //задержка на удержание данных
delay_1us();
};
delay_1us();//межсимвольная задержка
delay_1us();
delay_1us();
delay_1us();
delay_1us();
}
я б сделал задержку в виде константы в начале кода и попробовал бы потихоньку увеличивать ее, потому что дисплей туповат и медленный.
Хе хе, 4 года прошло уже
Задал вопрос из-за чего: в примерен на асме сначала с байтом делают swap (меняют старшую и младшую тетраду битов местами), а затем сдвиг побитно влево. Не пойму для чего, ведь переменная беззнаковая.
$Device= attiny2313 ' used device
$Stack = 32 ' stack depth
$Clock = 8 ' adjust for used crystal
$Def pinLCDdat = PORTB.0
$Def pinLCDclk = PORTB.1
$Def pinLed = PORTB.2
Declare Sub SendLCD(LCDdataX As Byte)
Declare Sub ScrollLCD(LCDdvigatSinvolov As Byte)
Dim KeyPressed As Byte, tempA As Byte
' ===================
ALLinit: '- Инициализация всей периферии
DDRD=0: PORTD =255 ' INPut
DDRB=255: PORTB =255 ' OUTput
metka: ' Тест ЖКИ: выводим все отображаемые символы
ScrollLCD (10) ' Скроллинг экрана на (X) "пробелов"
For KeyPressed = 0 To 15
SendLCD (KeyPressed) ' Один символ на экран
Toggle pinLed
WaitMs 255
Next KeyPressed
Wait 2
Goto metka
' --------- Скроллинг экрана на X символов --------
Sub ScrollLCD(LCDdvigatSinvolov As Byte)
Local temp2 As Byte, temp As Byte
pinLCDdat =0 ' Data
For temp = 1 To LCDdvigatSinvolov
For temp2 = 0 To 3
pinLCDclk = 0: WaitUs 1 ' CLK
pinLCDclk = 1: WaitUs 1 ' CLK
Next temp2
Next temp
End Sub
'---------- Один символ на экран ---------
Sub SendLCD(LCDdataX As Byte)
Local tiki As Byte, temp2 As Byte, temp As Byte
pinLCDclk =1 ' CLK
tiki= 128
Shift(Left, 4, LCDdataX)
For temp2 = 0 To 3
temp = LCDdataX & tiki
If temp =0 Then
pinLCDdat =0 ' Data
Else
pinLCDdat =1 ' Data
End If
pinLCDclk = 0: WaitUs 1
pinLCDclk = 1: WaitUs 1
Shift(Right, 1, tiki): If tiki =0 Then tiki = 128
Next temp2
End Sub