Форум РадиоКот • Просмотр темы - сдвиговый регистр и семисегментный индикатор
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 14 ]
Автор
Сообщение
sirha
Заголовок сообщения: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 17:25:03
Вымогатель припоя
Зарегистрирован: Ср авг 17, 2011 23:12:30Сообщений: 550
Рейтинг сообщения: 0
Помогите пожалуйста ,написал код который выводит цифры на индикатор от 0-до 2 х и по повтору,как можно все это упростить?,по другому написать
Код:
#include <mega8.h> #include <delay.h> unsigned char data,i; unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01}; unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00}; unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01}; void main(void) { PORTD=0x00; DDRD=0x07; label2: while(1) { if (data>8) { data=0;goto label0;} for(i=0;i<9;++i) { data++; PORTD.1=array[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } label0: while(1) { if (data>8) { data=0;goto label1;} for(i=0;i<9;++i) { ++data; PORTD.1=array1[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } label1: while(1) { if (data>8) { data=0;goto label2;} for(i=0;i<9;++i) { ++data; PORTD.1=array2[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } }
Вложения:
hc595.JPG [143.04 KiB]
Скачиваний: 388
Вернуться наверх
Реклама
pcb
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:01:10
Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27Сообщений: 833Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
Начни с нормального определения символов сначала, ибо не ясно что за массивы. Тип вот так:
Спойлер Код:
#ifndef DISPLAYH #define DISPLAYH //#define FLASHINIT #define MAXDIGIT4 #define MAXCHANELSADC 5 #define MAXCHANELSDIS 6 #define MAXSPIBUFF MAXCHANELS #define KEY PA3 #define HALL PA6 #define charGE 0x01 #define charGA 0x02 #define charGF 0x04 #define charGB 0x08 #define charGD 0x10 #define charGP 0x20 #define charGH 0x40 #define charGC 0x80 #define charALL charGA|charGB|charGC|charGD|charGE|charGF|charGH|charGP #define char0 ~(charGA|charGB|charGC|charGD|charGE|charGF) #define char1 ~(charGB|charGC) #define char2 ~(charGA|charGB|charGH|charGE|charGD) #define char3 ~(charGA|charGB|charGC|charGD|charGH) #define char4 ~(charGB|charGC|charGF|charGH) #define char5 ~(charGA|charGC|charGD|charGF|charGH) #define char6 ~(charGA|charGC|charGD|charGE|charGF|charGH) #define char7 ~(charGA|charGB|charGC) #define char8 ~(charGA|charGB|charGC|charGD|charGE|charGF|charGH) #define char9 ~(charGA|charGB|charGC|charGD|charGF|charGH) #define charA ~(charGA|charGB|charGC|charGE|charGF|charGH) #define charB ~(charGC|charGD|charGE|charGF|charGH) #define charC ~(charGA|charGD|charGE|charGF) #define charD ~(charGB|charGC|charGD|charGE|charGH) #define charE ~(charGA|charGD|charGE|charGF|charGH) #define charF ~(charGA|charGE|charGF|charGH) #define charH ~(charGB|charGC|charGE|charGF|charGH) #define MOSI 0 #define MISO 1 #define SCK 2 #define csInd0 4 #define csInd1 3 #define csInd2 5 #define csInd3 7 /*PORTA*/ #define REGR 6 #define RESPIN 7 #define ENCHAR0 PORTB |= 1<<5; #define ENCHAR1 PORTB |= 1<<4; #define ENCHAR2 PORTB |= 1<<3; #define ENCHAR3 PORTA |= 1<<6; #define DICHAR0 PORTB &= ~(1<<5); #define DICHAR1 PORTB &= ~(1<<4); #define DICHAR2 PORTB &= ~(1<<5); #define DICHAR3 PORTA &= ~(1<<6);
Это кусок кода из
Собственно передача по USI (универсальный последовательный интерфейс в тини26/261, хочешь будет уарт, хочешь - SPI):
Спойлер Код:
void USISend(unsigned char value) { unsigned char temp1=(1<<USIOIF); unsigned char temp2=(1<<USIOIF); char cikle; temp1 = (1<<USIWM0)|(0<<USICS1)|(0<<USICLK)|(1<<USITC); temp2=(1<<USIOIF); USIDR = value; USISR = temp2; temp2 = (1<<USIWM0)|(0<<USICS1)|(1<<USICLK)|(1<<USITC); for(cikle=0;cikle<8;cikle++) //while(USISR&&USIOIF) { USICR = temp1; USICR = temp2; } //USICR = temp1; temp2= USIDR; }
Это читабельное представление таблицы перекодировки
Спойлер Код:
static char cDecodeTable[] = {(char)char0,(char)char1,(char)char2,(char)char3,\ (char)char4,(char)char5,(char)char6,(char)char7,\ (char)char8,(char)char9,(char)charA,(char)charB,\ (char)charC,(char)charD,(char)charE,(char)charF,\ (char)charH};
Как то так
_________________Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Последний раз редактировалось pcb Ср окт 29, 2014 18:06:01, всего редактировалось 1 раз.
Вернуться наверх
Реклама
sirha
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:05:58
Вымогатель припоя
Зарегистрирован: Ср авг 17, 2011 23:12:30Сообщений: 550
Рейтинг сообщения: 0
СЛОЖНО
Вернуться наверх
pcb
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:08:39
Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27Сообщений: 833Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
я ж тебе куски кода дал - подставь свои номера выводов
_________________Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Вернуться наверх
Реклама
Morroc
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:25:25
Карма: 49
Рейтинг сообщений: 547
Зарегистрирован: Чт фев 20, 2014 18:57:55Сообщений: 19494
Рейтинг сообщения: 0
sirha писал(а):
СЛОЖНО
Думаете у вас просто ?
Выглядит совсем не...
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Вернуться наверх
Реклама
sirha
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 19:40:14
Вымогатель припоя
Зарегистрирован: Ср авг 17, 2011 23:12:30Сообщений: 550
Рейтинг сообщения: 0
как это можно записать в codevision?
Код:
regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 8 $swstack = 16 $framesize = 16 Config Portb.2 = Output Config Portb.1 = Output Config Portb.0 = Output Ds Alias Portb.2 Sh_cp Alias Portb.0 Const St_cp = 1 Dim Level As Integer Dim R1 As Byte Do If Level = 9 Then Level = 0 Else Incr Level End If R1 = Lookup(level , Numbers) Shiftout Ds , Sh_cp , R1 , 1 Pulseout Portb , St_cp , 5 Wait 1 Loop End Numbers: Data &B10000001 '0 Data &B11110011 '1 Data &B01001001 '2 Data &B01100001 '3 Data &B00110011 '4 Data &B00100101 '5 Data &B00000101 '6 Data &B10110001 '7 Data &B00000001 '8 Data &B00100001 '9
Вернуться наверх
Реклама
Аlex
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 21:17:51
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57Сообщений: 4599Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
sirha писал(а):
как можно все это упростить?,по другому написать
А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?
sirha писал(а):
while(1) { if (data>8) { data=0;goto label0;} ......... ......... } label0:
Кто Вас этому учил ?
Замена :
Код:
while(data<=8){ ......... ......... }
Мало того, у Вас цикл
while(1) пройдёт всего один раз, т.к.
data после цикла
for будет больше
8 . Отсюда вопрос - для чего
while ?
И ещё. Вам очень повезёт, если компилятор вначале программы обнулит переменную
data , что он делать не обязан, либо в ней случайно после старта окажется
0 .
Вернуться наверх
sirha
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 22:17:29
Вымогатель припоя
Зарегистрирован: Ср авг 17, 2011 23:12:30Сообщений: 550
Рейтинг сообщения: 0
спс за подсказки)),а как то уменьшить код возможно?
работает токо так)
Код:
#include <mega8.h> #include <delay.h> unsigned char data,i; unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01}; unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00}; unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01}; void main(void) { PORTD=0x00; DDRD=0x07; label0: data=0; while(data<=8) { for(i=0;i<9;++i) { data++; PORTD.1=array[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } data=0; while(data<=8) { for(i=0;i<9;++i) { ++data; PORTD.1=array1[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } data=0; while(data<=8) { for(i=0;i<9;++i) { ++data; PORTD.1=array2[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } data=0; goto label0; }
Последний раз редактировалось sirha Ср окт 29, 2014 22:42:05, всего редактировалось 1 раз.
Вернуться наверх
pcb
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 22:41:53
Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27Сообщений: 833Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
Можно и нужно.
Разделить программу на блоки:
а) вывод на дисплей запихнуть в прерывание
б) оформление задержки прерываниями
в) использовать подпрограммы
мой проект где то выложен полностью был, ищи
_________________Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Вернуться наверх
Реклама
sirha
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 23:32:40
Вымогатель припоя
Зарегистрирован: Ср авг 17, 2011 23:12:30Сообщений: 550
Рейтинг сообщения: 0
pcb писал(а):
Можно и нужно.
Разделить программу на блоки:
в) использовать подпрограммы
мой проект где то выложен полностью был, ищи
Код:
#include <mega8.h> #include <delay.h> unsigned char data,i; unsigned char array[]={0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01}; unsigned char array1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00}; unsigned char array2[]={0x00,0x00,0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x01}; void function(void) { while(data<=8) { for(i=0;i<9;++i) { data++; PORTD.1=array[data]&0x01; PORTD.0=1; PORTD.0=0; } PORTD.2=1; PORTD.2=0; delay_ms(1000); } } void main(void) { PORTD=0x00; DDRD=0x07; label0: data=0; function(); array[data]=array1[data]; data=0; function(); array[data]=array2[data]; function(); goto label0; }
подскажите как тут правильно написать? используя подпрограммы
Вернуться наверх
ARV
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 11:58:41
Ум, честь и совесть. И скромность.
Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56Сообщений: 18451Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы
последний раз:
прочтите, вникните и применяйте .
_________________если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...Мой уютный бложик ... заходите!
Вернуться наверх
Pink-Pank
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 12:02:15
Опытный кот
Карма: 6
Рейтинг сообщений: 54
Зарегистрирован: Ср июн 11, 2014 09:43:13Сообщений: 721Откуда: США
Рейтинг сообщения: 0
ARV , не старайтесь - этот КОТ не обучаем. )
_________________ Fucking static initialization order fiasco
Вернуться наверх
pcb
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 14:45:47
Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27Сообщений: 833Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы
Ну нельзя же быть на СТОЛЬКО ленивым, точнее можно, но не правильно.
Если очень надо, но самому не очень хочется - могу помочь, за отдельную денежку.
_________________Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Вернуться наверх
pyzhman
Заголовок сообщения: Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 15:13:54
Друг Кота
Карма: 49
Рейтинг сообщений: 392
Зарегистрирован: Вс июл 12, 2009 19:15:29Сообщений: 7014Откуда: Ижевск
Рейтинг сообщения: 0
Шо? Опять???
_________________ Docendo discimus
Вернуться наверх
Страница 1 из 1
[ Сообщений: 14 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: linux_rulezz и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения