сдвиговый регистр и семисегментный индикатор

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

Помогите пожалуйста ,написал код который выводит цифры на индикатор от 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 КБ) 395 скачиваний
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Начни с нормального определения символов сначала, ибо не ясно что за массивы. Тип вот так:
Спойлер

Код: Выделить всё

#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};
Как то так :tea:
Последний раз редактировалось pcb Ср окт 29, 2014 18:06:01, всего редактировалось 1 раз.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

СЛОЖНО :(
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

я ж тебе куски кода дал - подставь свои номера выводов
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

sirha писал(а):СЛОЖНО :(
Думаете у вас просто ? :)) Выглядит совсем не...
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

как это можно записать в 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
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

sirha писал(а):как можно все это упростить?,по другому написать
А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?
sirha писал(а): while(1)

{
if (data>8) { data=0;goto label0;}
.........
.........
}

label0:
Кто Вас этому учил ? :)
Замена :

Код: Выделить всё

while(data<=8){
.........
.........
}
Мало того, у Вас цикл while(1) пройдёт всего один раз, т.к. data после цикла for будет больше 8. Отсюда вопрос - для чего while ? :)

И ещё. Вам очень повезёт, если компилятор вначале программы обнулит переменную data, что он делать не обязан, либо в ней случайно после старта окажется 0.
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

спс за подсказки)),а как то уменьшить код возможно?

работает токо так)

Код: Выделить всё

#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
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Можно и нужно.

Разделить программу на блоки:
а) вывод на дисплей запихнуть в прерывание
б) оформление задержки прерываниями
в) использовать подпрограммы

мой проект где то выложен полностью был, ищи :)
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Вымогатель припоя
Аватара пользователя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Сообщение sirha »

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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sirha писал(а):подскажите как тут правильно написать? используя подпрограммы
последний раз: прочтите, вникните и применяйте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

ARV, не старайтесь - этот КОТ не обучаем. )
Fucking static initialization order fiasco
Контактная информация:
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

sirha писал(а): подскажите как тут правильно написать? используя подпрограммы
Ну нельзя же быть на СТОЛЬКО ленивым, точнее можно, но не правильно.

Если очень надо, но самому не очень хочется - могу помочь, за отдельную денежку.
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Шо? Опять???
Docendo discimus
Контактная информация:
Ответить

Вернуться в «AVR»