Страница 1 из 1
сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 17:25:03
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);
}
}
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:01:10
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};
Как то так

Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:05:58
sirha
СЛОЖНО

Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:08:39
pcb
я ж тебе куски кода дал - подставь свои номера выводов
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 18:25:25
Morroc
sirha писал(а):СЛОЖНО

Думаете у вас просто ?

Выглядит совсем не...
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 19:40:14
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
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 21:17:51
Аlex
sirha писал(а):как можно все это упростить?,по другому написать
А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?
sirha писал(а):
while(1)
{
if (data>8) { data=0;goto label0;}
.........
.........
}
label0:
Кто Вас этому учил ?

Замена :
Мало того, у Вас цикл
while(1) пройдёт всего один раз, т.к.
data после цикла
for будет больше
8. Отсюда вопрос - для чего
while ?
И ещё. Вам очень повезёт, если компилятор вначале программы обнулит переменную
data, что он делать не обязан, либо в ней случайно после старта окажется
0.
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 22:17:29
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;
}
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 22:41:53
pcb
Можно и нужно.
Разделить программу на блоки:
а) вывод на дисплей запихнуть в прерывание
б) оформление задержки прерываниями
в) использовать подпрограммы
мой проект где то выложен полностью был, ищи

Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Ср окт 29, 2014 23:32:40
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;
}
подскажите как тут правильно написать? используя подпрограммы
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 11:58:41
ARV
sirha писал(а):подскажите как тут правильно написать? используя подпрограммы
последний раз:
прочтите, вникните и применяйте.
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 12:02:15
Pink-Pank
ARV, не старайтесь - этот КОТ не обучаем. )
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 14:45:47
pcb
sirha писал(а):
подскажите как тут правильно написать? используя подпрограммы
Ну нельзя же быть на СТОЛЬКО ленивым, точнее можно, но не правильно.
Если очень надо, но самому не очень хочется - могу помочь, за отдельную денежку.
Re: сдвиговый регистр и семисегментный индикатор
Добавлено: Чт окт 30, 2014 15:13:54
pyzhman
Шо? Опять???