...в продолжение предыдущего поста...
Более эстетичный вариант, когда задействованы только знаки цифр с 1 по 6 (не задействованы спец.символы, пирог и 7 цифиря)
- Code: Select all
#!/bin/sh
i=1
while true
do
#echo $i; sleep 1
min=0
max=16
a=$(( min + ($RANDOM*(max-min))>>2 ))
b=$(( min + ($RANDOM*(max-min))>>2 ))
c=$(( min + ($RANDOM*(max-min))>>2 ))
d=$(( min + ($RANDOM*(max-min))>>2 ))
e=$(( min + ($RANDOM*(max-min))>>2 ))
f=$(( min + ($RANDOM*(max-min))>>2 ))
g=$(( min + ($RANDOM*(max-min))>>2 ))
A=$(printf '%x\n' $a)
B=$(printf '%x\n' $b)
C=$(printf '%x\n' $c)
D=$(printf '%x\n' $d)
E=$(printf '%x\n' $e)
F=$(printf '%x\n' $f)
G=$(printf '%x\n' $g)
$REG32 $VFDO 0x"$A"C044;$REG32 $VFD_WRCTL 0x1370
#$REG32 $VFDO 0x"$B"C244;$REG32 $VFD_WRCTL 0x1370
#$REG32 $VFDO 0x"$C"C444;$REG32 $VFD_WRCTL 0x1370
$REG32 $VFDO 0x"$D"C644;$REG32 $VFD_WRCTL 0x1370
#$REG32 $VFDO 0x"$E"C844;$REG32 $VFD_WRCTL 0x1370
#$REG32 $VFDO 0x"$F"CA44;$REG32 $VFD_WRCTL 0x1370
$REG32 $VFDO 0x"$G"CC44;$REG32 $VFD_WRCTL 0x1370
usleep 500000
i=`expr $i + 1`
done
Но далее речь пойдет об еще одном варианте вывода на экран (по команде 40)...
Ранее она уже упоминалась на примере, когда с помощью 4 последовательных (одинаковых) команд, отправляемых в SEND4, зажигался весь экран:
- Code: Select all
#!/bin/sh
#
#LED DRIVER TM1668 CONTROL
#for RTD1186DD
#
#VFD INIT
VFD_CTL=0xB8007200
VFD_WRCTL=0xB8007204
VFDO=0xB8007208
VFD_ARDCTL=0xB800720C
VFD_KPADLIE=0xB8007210
VFD_KPADHIE=0xB8007214
VFD_SWIE=0xB8007218
SEND4=0x00F0
SEND3=0x0070
SEND2=0x0030
SEND1=0x0010
D0=0x00000000
DF=0xFFFFFFFF
REG32="/usr/local/etc/mos/bin/gpio -n:p"
#########
# Устанавливаем подсветку
$REG32 $VFDO 0x00008807;$REG32 $VFD_WRCTL 0x00001330
# ^ ^
# Яркость___________| | (7(выкл.) ; 8(мин.)...F(макс.)
# Кол-во сегментов____|
### Подготовка к зажиганию по строкам
$REG32 $VFDO 0x00C044;$REG32 $VFD_WRCTL 0x1370
$REG32 $VFDO 0xC040;$REG32 $VFD_WRCTL 0x0000330
# Зажигает все табло в 4 этапа по строкам...
$REG32 $VFDO 0xFFFFFFFF;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO 0xFFFFFFFF;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO 0xFFFFFFFF;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO 0xFFFFFFFF;$REG32 $VFD_WRCTL $SEND4
Как мне ранее объяснял ув.
Virtual- Code: Select all
#$REG32 $VFDO 0xC040;$REG32 $VFD_WRCTL 0x0000330
# ^^^^
# [это управляющая команда]
# выбрать адрес C0 (нулевой адрес дисплея)
# режим 40 (с автоинкрементом, то есть каждый новый байт будет писаться в следующий адрес, и по кругу)
#$REG32 $VFDO 0x00000001;$REG32 $VFD_WRCTL $SEND2
# ^^
# эта команда обозначает что мы вдуваем 2 байта 0x00 0x01 (16 бит!!!)
# и если ранее был выбран режим 40, то в текущее место памяти дисплея.
Немного по разбирался с данным алгоритмом, получил такие результаты
- Code: Select all
# Выбираем адрес C0 (нулевой адрес дисплея)
$REG32 $VFDO 0xC040;$REG32 $VFD_WRCTL 0x0000330
# Переменные ввел для облегчения нахождения адресов при экспериментах.
# В данном случае, из-за этого зажигаются/гаснут все сегменты рассчитанного символа.
# При необходимости вывода разных символов (посегментно), придется править каждую строку отдельно.
P1=00;P2=00;P3=00;P4=74
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #A
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #B
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #C
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #D
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #E
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #F
$REG32 $VFDO 0x"$P1""$P2""$P3""$P4";$REG32 $VFD_WRCTL $SEND2 #G
#Таблица расположения символов в соответствии с адресацией:
#--------------------------------------------
#|00000000|SL|PC|D1|D2|D3|:|D4|D5|:|D6|D7|SR|
#--------------------------------------------
#|00000000|__|__|__|__|__|:|__|__|:|__|__|__|
#|00000001|XX|__|__|__|__|:|__|__|:|__|__|__|
#|00000002|__|XX|__|__|__|:|__|__|:|__|__|__|
#|00000004|__|__|__|__|XX|:|__|__|:|__|__|__|
#|00000008|__|__|XX|__|__|:|__|__|:|__|__|__|
#|00000010|__|__|__|XX|__|:|__|__|:|__|__|__|
#|00000020|__|__|__|__|__|:|XX|__|:|__|__|__|
#|00000040|__|__|__|__|__|:|__|XX|:|__|__|__|
#|00000080|__|__|__|__|__|:|__|__|:|XX|__|__|
#|00000100|__|__|__|__|__|:|__|__|:|__|XX|__|
#|00000200|__|__|__|__|__|:|__|__|:|__|__|XX|
#--------------------------------------------
Чтобы вывести несколько символов (сегментов разных символов) одновременно, используем сложение адресов.
Например, необходимо вывести "Восьмерки" одновременно в поле символа D2,D3,D4,D5
D2=10
D3=04
D4=20
D5=40
10+04+20+40=74
Следовательно, команды будут:
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
#$REG32 $VFDO 0x000000
74;$REG32 $VFD_WRCTL $SEND2
Если хотим в каждом поле вывести разные символы, то необходимо рассчитывать правильную комбинацию сегментов по всей выводимой строке...
Данный алгоритм для вывода всех сегментов всегда использует только 7 команд, в отличии от алгоритма команды 44 (там их 14)
Будет время, сделаю "считалочку" по этой команде в Екселе...