Re: управление драйвером жк lc75823
Надо разделить разряды по 8 бит или по 16 , не знаю как лучше
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Примеры кода → управление драйвером жк lc75823
Надо разделить разряды по 8 бит или по 16 , не знаю как лучше
Сколько всего сегментов в индикаторе
сегментов всего 142
Вот пример
Я изменил функцию, теперь она содержит еще два параметра, это данные 2 байтов по 8 бит
Если не заработает, то я ошибся в подсчете битов, должно быть отправлено точно 156
write_byte(0x41, 0b11110000, 0b1010000, 0b0000);
В середине два числа это данные двух байтов
Но, Вы можете для удобства делать байты по 8-32 бит.
Бат сейчас инверсный
#define CE 9
#define CL 8
#define DI 7
int w;
void setup() {
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(200);
write_byte(0x41, 0b11110000, 0b1010000, 0b0000);
}
void loop() {
// put your main code here, to run repeatedly:
}
void write_byte(byte addr, byte b0, byte b1, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
//Serial.print((addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
Serial.print((b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
Serial.print((b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 139; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (1 >> i) & 1);
// Serial.print((1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
// Serial.print((contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
Вы можете сгрупировать элементы, в них может быть разное кол-во бит.
Например первый байт может полностью поддерживать первую группу элементов, и состоять из большего кол-ва битов чем 8
То что отправили вы последний код, загорелись вот эти
Быдо отправлено вот это
0b11110000, 0b1010000
Можете объяснить за что именно отвечают эти 2 числа в середине , я не очень понял
Это байты данных, они зажигают сегменты
У Вас будет не два байта а намного больше, для всех сегментов.
Как я понял первый байт управляет правыми значками, второй левыми, а все остальное это цифры(символы ) в середине.
Вам надо разделить 142 сегмента так, чтобы каждый байт отвечал за свое знакоместо, например цифра-символ у Вас 15 сегментов, под нее лучше создать байт 15 бит.
Можно пример как правильно их записать, именно уже сигменты которые я определил чтобы потом шрифт сделать
Вот пример 2 байта по 8 бит, и три по 15 бит
#define CE 9
#define CL 8
#define DI 7
int w;
void setup() {
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(200);
write_byte(0x41, 0b11111111,0b11111111,0b111111111111111,0b111111111111111,0b111111111111111, 0b0000);
}
void loop() {
// put your main code here, to run repeatedly:
}
void write_byte(byte addr, byte b0, byte b1, int b2, int b3, int b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
//Serial.print((addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
// Serial.print((b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 111; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
// Serial.print((contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
Можно пример как правильно их записать, именно уже сигменты которые я определил чтобы потом шрифт сделать
Это позже, сначала надо разделить байты по группам сегментов, одна цифра-символ === один байт
Вместо байтов
0b11111111,0b11111111,0b111111111111111,0b111111111111111,0b111111111111111
у Вас будут отдельные переменные
например
int seg1 = 0b1111111;
int seg2 = 0b111110000000111;
Не я имел в виду как грамотно записать уже определенные сегменты, чтобы в дальнейшем создать шрифт
Давайте все перенесем на завтра, а то у меня уже ночь наступила.
Не я имел в виду как грамотно записать уже определенные сегменты, чтобы в дальнейшем создать шрифт
Это достаточно просто, создаем новую функцию-дешифратор
int segm(int cif){
int data_out;
switch(cif){
case 0: data_out=0b00000000111111;break;//0
case 1: data_out=0b00010000000110;break;//1
case 10: data_out=0000000011110111;break;//A
}
return data_out;
}
например если в segm() поместить 1, то она выдаст число 0b00010000000110
Вот пример
#define CE 9
#define CL 8
#define DI 7
int w;
void setup() {
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(200);
write_byte(0x41, 0b11111111,0b11111111, 1 ,0b111111111111111,0b111111111111111, 0b0000);
}
void loop() {
// put your main code here, to run repeatedly:
}
void write_byte(byte addr, byte b0, byte b1, int b2, int b3, int b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
//Serial.print((addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
// Serial.print((b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (segm(b2) >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 14; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 0;i <= 111; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
// Serial.print((contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
int segm(int cif){
int data_out;
switch(cif){
case 0: data_out=0b00000000111111;break;//1
case 1: data_out=0b00010000000110;break;//2
case 10: data_out=0000000011110111;break;//A
}
return data_out;
}
Вот в этой строке
digitalWrite(DI, (segm(b2) >> i) & 1);
я вместо b2 указал segm(b2)
А в строке
write_byte(0x41, 0b11111111,0b11111111, 1 ,0b111111111111111,0b111111111111111, 0b0000);
указал 1, но не как код, а просто цифру 1, которая будет преобразована в код цифры
for(int i = 0;i <= 111; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Объясните пожалуйста за что отвечает этот кусок кода , а именно цифра 111(поскольку я ее меня и сегменты светились в другом месте
Это код отправки основных данных в сегменты, это остаток сегментов которые не распределены.
Нужно точно распределить сектора сегментов, например сколько сегментов в секторе 1 и 2
Как будет выглядеть функция отправки данных:
write_byte(0x41, сектор_1, сектор_2 , цифра_1,цифра_2,цифра_3,цифра_4,цифра_5,цифра_6,цифра_7,цифра_8, 0b0000);
сектор_1 - это все что слева от цифр
сектор_2 - это все что справа от цифр
так же могут быть еще переменные под двоеточие, кавычки и точки между цифрами.
Мне надо знать точно какой бит 156 битного байта за какой сегмент отвечает.
Я составлял схему какой из 156 байтов отвечает за какой сегмент. Могу скинуть фото листа со схемой
Опубликуйте на форуме, только в виде архива, а то форум сильно сжимает картинку.
Данный контент доступен только зарегистрированным пользователям.
там 2 изображения, поскольку на одну страницу не влезло. Я записывал так: каждый сегмент я подписывал его числом( от 1 до 156). на 2 изображении есть строчка в котой я записал пустые байты.
понятно подписанно, или что то объяснить?
forum.rcl-radio.ru → Примеры кода → управление драйвером жк lc75823
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|