| Форум РадиоКот https://radiokot.ru/forum/ |
|
| сдвиговый регистр и семисегментный индикатор https://radiokot.ru/forum/viewtopic.php?f=57&t=109218 |
Страница 1 из 1 |
| Автор: | sirha [ Ср окт 29, 2014 17:25:03 ] | ||
| Заголовок сообщения: | сдвиговый регистр и семисегментный индикатор | ||
Помогите пожалуйста ,написал код который выводит цифры на индикатор от 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); } }
|
|||
| Автор: | pcb [ Ср окт 29, 2014 18:01:10 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
Начни с нормального определения символов сначала, ибо не ясно что за массивы. Тип вот так: СпойлерКод: #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}; Как то так
|
|
| Автор: | sirha [ Ср окт 29, 2014 18:05:58 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
СЛОЖНО |
|
| Автор: | pcb [ Ср окт 29, 2014 18:08:39 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
я ж тебе куски кода дал - подставь свои номера выводов |
|
| Автор: | Morroc [ Ср окт 29, 2014 18:25:25 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
sirha писал(а): СЛОЖНО Думаете у вас просто ? |
|
| Автор: | sirha [ Ср окт 29, 2014 19:40:14 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
как это можно записать в 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 [ Ср окт 29, 2014 21:17:51 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
sirha писал(а): как можно все это упростить?,по другому написать А для чего что-то писать по-другому, если оно работает и устраивает ? Или чем-то не устроил код ?sirha писал(а): while(1) Кто Вас этому учил ? { if (data>8) { data=0;goto label0;} ......... ......... } label0: Замена : Код: while(data<=8){ ......... ......... } Мало того, у Вас цикл while(1) пройдёт всего один раз, т.к. data после цикла for будет больше 8. Отсюда вопрос - для чего while ? И ещё. Вам очень повезёт, если компилятор вначале программы обнулит переменную data, что он делать не обязан, либо в ней случайно после старта окажется 0. |
|
| Автор: | sirha [ Ср окт 29, 2014 22:17:29 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
спс за подсказки)),а как то уменьшить код возможно? работает токо так) Код: #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; } |
|
| Автор: | pcb [ Ср окт 29, 2014 22:41:53 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
Можно и нужно. Разделить программу на блоки: а) вывод на дисплей запихнуть в прерывание б) оформление задержки прерываниями в) использовать подпрограммы мой проект где то выложен полностью был, ищи |
|
| Автор: | sirha [ Ср окт 29, 2014 23:32:40 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
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 [ Чт окт 30, 2014 11:58:41 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
sirha писал(а): подскажите как тут правильно написать? используя подпрограммы последний раз: прочтите, вникните и применяйте.
|
|
| Автор: | Pink-Pank [ Чт окт 30, 2014 12:02:15 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
ARV, не старайтесь - этот КОТ не обучаем. ) |
|
| Автор: | pcb [ Чт окт 30, 2014 14:45:47 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
sirha писал(а): подскажите как тут правильно написать? используя подпрограммы Ну нельзя же быть на СТОЛЬКО ленивым, точнее можно, но не правильно. Если очень надо, но самому не очень хочется - могу помочь, за отдельную денежку. |
|
| Автор: | pyzhman [ Чт окт 30, 2014 15:13:54 ] |
| Заголовок сообщения: | Re: сдвиговый регистр и семисегментный индикатор |
Шо? Опять??? |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|



