Re: управление драйвером жк lc75823
ничего не изменилось, только потух 146 а вместо него загорелся 134
Я сейчас задаю названия переменным и их расположение в 32 битном байте
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Примеры кода → управление драйвером жк lc75823
ничего не изменилось, только потух 146 а вместо него загорелся 134
Я сейчас задаю названия переменным и их расположение в 32 битном байте
Я так понимаю, остался только один элемент не определенным, это 1 в 123?
#define CE 10
#define CL 13
#define DI 11
int w;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=1, beat=1, soft=1,pop=1;
unsigned long rnd=0,prt=0,lond=0,xxx=1;
void setup() {
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(200);
// 1 32
//byte_1 00000000000000000000000000000000
// 33 64
//byte_2 00000000000000000000000000000000
// 65 96
//byte_3 00000000000000000000000000000000
// 97 128
//byte_4 00000000000000000000000000000000
// 129 156
//byte_5 0000000000000000000000000000
}
void loop() {
h1 = segm(1);
h2 = segm(2);
h3 = segm(3);
h4 = segm(4);
h5 = segm(5);
h6 = segm(11);
h7 = segm(11);
h8 = segm(11);
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond<<1 | xxx<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| 0b000000000000;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
delay(100000);
Serial.println(vu[0]);
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long 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);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
Serial.print((b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
Serial.print((b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
Serial.print((b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
Serial.print((b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
Serial.print((b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.println();
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
Все все элементы определены и имеют управление
kav_1=0,dvoetoh=0,toch=0,kav_2=0; // кавычка, двоеточие, точка, двойная кавычка
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};// все элементы индикатора уровня
unsigned long scm=1, beat=1, soft=1,pop=1; // SCM BEAT SOFT POP
unsigned long rnd=0,prt=0,lond=0,cif_1=1; // RND PRT LOND, цифра 1 в 123
unsigned long el_12,el_11,el_10,el_9,el_8,el_7,el_6,el_5,el_4,el_3,el_2,el_1; // все оставшиеся элементы с права
При создании новых символов используйте следующий порядок сегментов
Байт 11111111111011
Сегментов 13, но байт символа имеет длину 14 бит, как видите в конце байта есть пропуск (указан как 0), учитывайте это при создании новых символов.
про рисунку 1 сегмент это 0B10000000000000, то есть самый старший бит
А возможно вообще сделать одну командe для того чтобы написать что нибудь на дисплее. Допустим lcd.print(что написать, и где написать);
У Вас для вывода есть только 8 разрядов, ими проще управлять из переменных
h1 = segm(1);
h2 = segm(2);
h3 = segm(3);
h4 = segm(4);
h5 = segm(5);
h6 = segm(11);
h7 = segm(11);
h8 = segm(11);
Меняете содержимое переменных - меняются символы.
можете описать команды для управления анализатором спектра, и значков. С цифрами я разобрался.
А ни каких команд нет, есть просто переменные, указываете 1 сегмент светиться, 0 - гаснет
kav_1=0,dvoetoh=0,toch=0,kav_2=0; // кавычка, двоеточие, точка, двойная кавычка
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};// все элементы индикатора уровня
unsigned long scm=1, beat=1, soft=1,pop=1; // SCM BEAT SOFT POP
unsigned long rnd=0,prt=0,lond=0,cif_1=1; // RND PRT LOND, цифра 1 в 123
unsigned long el_12,el_11,el_10,el_9,el_8,el_7,el_6,el_5,el_4,el_3,el_2,el_1; // все оставшиеся элементы с права
еще просьба, необходимо создать буквы(которые отсылаются по такому же принципу как и цифры).
За что отвечает этот кусок кода?
Код вывода 156 бит, в 5 байтах 32 32 32 32 и 27 бит, в этом коде идет распределение 156 битного байта на разряды и символы, его лучше не менять, а еще лучше убрать в функцию и просто обращаться к ней для вывода информации на дисплей.
Вот пример:
#define CE 10
#define CL 13
#define DI 11
int w;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=1, beat=1, soft=1,pop=1;
unsigned long rnd=0,prt=0,lond=0,cif_1=1;
unsigned long el_12,el_11,el_10,el_9,el_8,el_7,el_6,el_5,el_4,el_3,el_2,el_1;
void setup() {
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(200);
// 1 32
//byte_1 00000000000000000000000000000000
// 33 64
//byte_2 00000000000000000000000000000000
// 65 96
//byte_3 00000000000000000000000000000000
// 97 128
//byte_4 00000000000000000000000000000000
// 129 156
//byte_5 0000000000000000000000000000
}
void loop() {
h1 = segm(1);
h2 = segm(2);
h3 = segm(3);
h4 = segm(4);
h5 = segm(5);
h6 = segm(11);
h7 = segm(11);
h8 = segm(11);
print_out();
delay(1000);
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long 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);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
Serial.print((b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
Serial.print((b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
Serial.print((b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
Serial.print((b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.print(" ");
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
Serial.print((b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
Serial.println();
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
Код криво выводит
Все верно, именно это он и должен выводить, ведь в коде
h1 = segm(1);
h2 = segm(2);
h3 = segm(3);
h4 = segm(4);
h5 = segm(5);
h6 = segm(11);
h7 = segm(11);
h8 = segm(11);
6 7 8 цифра загораются все сегменты, так как
case 11: data_out=0b11111111111011;break;// все
а так же cif_1=1;scm=1, beat=1, soft=1,pop=1;
ще просьба, необходимо создать буквы(которые отсылаются по такому же принципу как и цифры).
Это очень кропотливая работа, лучше создавать буквы которые будете использовать.
Вот например буква N
case 12: data_out=0b11100000001011;break;// N
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
case 12: data_out=0b11100000001011;break;// N
Если например
h1 = segm(12);
то в первом разряде выведется буква N
а выводить линии анализатора спектра вот этой командой vu[7]; в loop?
а можно сделать чтобы не h1 = segm(12); выводило букву N, а команда h1 = segm(N);
Да все верно
vu[7] = 1;
или
vu[7] = 0;
а как на этот дисплей вывести допустим секундомер (millis /1000)?
просто я хочу этот дисплей использовать для нашего с вами прошлого проекта с аудио процессором TDA7461
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
Это строка отвечает за вывод массива анализатора
vu[0]...vu[13] - 14 сегментов.
Использую массив, так как это анализатор уровня и его проще применять как массив и использовать в цикле
for(int i = 0; i<=13;i++){
vu[i]=analogRead(A0)/20;
}
Выведет состояние уровня на А0.
а как на этот дисплей вывести допустим секундомер (millis /1000)?
int sec = millis()/1000;
h1 = segm(sec/10000000%10);
h2 = segm(sec/1000000%10);
h3 = segm(sec/100000%10);
h4 = segm(sec/10000%10);
h5 = segm(sec/1000%10);
h6 = segm(sec/100%10);
h7 = segm(sec/10%10);
h8 = segm(sec%10);
анализатор спектра постоянно заполнен, даже с подтяжкой A0 к земле
forum.rcl-radio.ru → Примеры кода → управление драйвером жк lc75823
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|