У меня есть проблема с отображением 40 значений, отображаемых на 7 сегменте (40 компонентов 74HC595 каскада ссылка enter image description hereСПИ 74HC595 каскадные ATmega64
я реализую свою программу на Arduino и она хорошо работает Вот мой код:.
static const byte Pattern[] = {
B00010100, // 0
B00111111, // 1
B10011000, // 2
B00011010, // 3
B00110011, // 4
B01010010, // 5
B01010000, // 6
B00011111, // 7
B00010000, // 8
B00010010, // 9
B00010000}; // BLANK
byte HC595_DS_POS = 2; //Data pin (DS) pin location
byte HC595_SH_CP_POS = 3; //Shift Clock (SH_CP) pin location
byte HC595_ST_CP_POS = 4; //Store Clock (ST_CP) pin location
void IE74595_Out(uint8_t *p, unsigned char n)
{
unsigned char i, j;
uint8_t b;
digitalWrite(HC595_ST_CP_POS,0);
digitalWrite(HC595_SH_CP_POS,0);
for(j=0;j<n;j++)
{
b = Pattern[*(p+n-j-1)]; // Lay byte cao nhat truoc
for(i=0;i<8;i++)
{
digitalWrite(HC595_SH_CP_POS,0);
if(b & 0b00000001)
{
digitalWrite(HC595_DS_POS,1);
}
else
{
digitalWrite(HC595_DS_POS,0);
}
digitalWrite(HC595_SH_CP_POS,1);
b=b>>1; //Now bring next bit at MSB position
}
}
digitalWrite(HC595_ST_CP_POS,1);
}
void setup()
{
// put your setup code here, to run once:
pinMode(HC595_ST_CP_POS, OUTPUT);
pinMode(HC595_SH_CP_POS, OUTPUT);
pinMode(HC595_DS_POS, OUTPUT);
}
void loop() {
uint8_t Data[40]={2,5,1,3,2,1,3,6,1,9,4,8,1,7,0,5,1,2,5,6,5,4,1,4,1,8,1,3,1,9,5,6,4,5,6,2,6,1,0,2};
IE74595_Out(Data,40);
}
а потом я переделал другую программу на Atmel студии, и я загрузить его через Extrem горелки и USBasp в моей карточке Вот мой код:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
static const uint8_t Pattern[] = {
0b00010100, // 0
0b00111111, // 1
0b10011000, // 2
0b00011010, // 3
0b00110011, // 4
0b01010010, // 5
0b01010000, // 6
0b00011111, // 7
0b00010000, // 8
0b00010010, // 9
0b00010000}; // BLANK
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)
#define HC595_DS_POS PC4 //Data pin (DS) pin location
#define HC595_SH_CP_POS PC5 //Shift Clock (SH_CP) pin location
#define HC595_ST_CP_POS PC6 //Store Clock (ST_CP) pin location
#define HC595_PORT PORTC
#define HC595_DDR DDRC
void IE74595_Out(uint8_t *p, unsigned char n)
{
unsigned char i, j;
uint8_t b;
output_low(HC595_PORT,HC595_ST_CP_POS);
output_low(HC595_PORT,HC595_SH_CP_POS);
for(j=0;j<n;j++)
{
b = Pattern[*(p+n-j-1)];// Lay byte cao nhat truoc
for(i=0;i<8;i++)
{
output_low(HC595_PORT,HC595_SH_CP_POS);
if(b & 0b00000001)
{
output_high(HC595_PORT,HC595_DS_POS);
}
else
{
output_low(HC595_PORT,HC595_DS_POS);
}
output_high(HC595_PORT,HC595_SH_CP_POS);
b=b>>1;
}
}
output_high(HC595_PORT,HC595_ST_CP_POS);
}
int main(void)
{
set_output(DDRC,HC595_DS_POS);
set_output(DDRC,HC595_SH_CP_POS);
set_output(DDRC,HC595_ST_CP_POS);
uint8_t Data[40]={5,9,1,6,1,1,0,9,1,7,1,5,4,2,6,2,8,7,0,7,1,2,3,5,1,5,4,2,1,7,5,9,1,9,4,8,1,5,2,9};
while (1)
{
IE74595_Out(Data,40);
return 1;
}
}
Вот моя карточка enter image description here
Дисплей не так в Arduino я только последнее значение отображается
Я разработал свою электронную карту в Китае.
Является ли проблема материала ???
Единственное различие между этими двумя программами является: DigitalWrite() на Arduino И Output_High() или output_low на Atmel
ли реализация DigitalWrite == Output_high() или output_low() ????
Должен ли я написать последнюю инструкцию Return 1; после этого ????
Спасибо-х
ли вы правильный разделительный конденсатор для каждого сдвига зарегистрироваться? Кроме того, 'digitalWrite' примерно в 80 раз медленнее, чем' sbi'/'cbi' инструкции, поэтому отсутствие развязки может быть проблемой. Особенно для таких токов (половина всех сегментов On @ 20mA => 3.2A и всех сегментов On => 6.4A). – KIIV
Нет, я использую электронную карту, которую я разработал в Китае – khaloud1980
Я нахожу решение – khaloud1980