PHP код:
//http://compcar.ru
#include <avr/pgmspace.h>
#include <Spi.h>
//-----------------------------------------------------------------------------------------------------------------------------------------
// ' ' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z */
const byte ltrs[189] PROGMEM = {255,231,131,195,135,129,129,195,189,131,129,189,191,125,125,195,131,195,131,195,131,189,189,125,125,125, 1,
255,219,189,189,187,191,191,189,189,239,247,187,191, 57, 61,189,189,189,189,189,239,189,189,125,187,187,251,
255,189,189,191,189,191,191,191,189,239,247,183,191, 85, 93,189,189,189,189,191,239,189,189,109,215,215,247,
255,189,131,191,189,131,131,177,129,239,247,143,191,109,109,189,131,189,131,195,239,189,219,109,239,239,239,
255,129,189,191,189,191,191,189,189,239,247,183,191,125,117,189,191,179,183,253,239,189,219,109,215,239,223,
255,189,189,189,187,191,191,189,189,239,183,187,129,125,121,189,191,185,187,189,239,189,219,147,187,239,191,
255,189,131,195,135,129,191,195,189,131,207,189,129,125,125,195,191,205,189,195,239,195,231,147,125,239, 1 };
//------------------------------------------------------------------------------------------------------------------------------------------
/* - . / 0 1 2 3 4 5 6 7 8 9 : */
byte nums[98]= {255,255,207,131,239,131,131,227, 1,131, 1,131,131,255,
255,255,187,125,207,125,125,219,127,127,253,125,125,239,
255,255,187,125,239,253,253,187,127,127,251,125,125,255,
131,255,207,125,239,243,227,123,131, 3,247,131,129,255,
255,255,255,125,239,207,253, 1,253,125,239,125,251,255,
255,231,255,125,239,191,125,251,125,125,239,125,247,239,
255,231,255,131,199, 1,131,251,131,131,239,131,207,255};
byte i=0;
byte reg = 8;
byte result = 25;
word *ptr=0;
word addr ;
//----------------------------------------------------------------
void setup()
{
//ptr = <rs[0]; // младший байт адреса
//addr = ltrs[*ptr]; // полный 16 бит адрес
//addr = <rs[0]; // полный 16 бит адрес
//word paddr = ltrs[0];
pinMode(8, INPUT); // portb0
pinMode(9, INPUT); // portb1
Spi.mode((1<<MSTR) | (1<<CPHA)); //mode 0, clock/4, SPI Enable, DORD старший первый, MSTR Master Enable
Serial.begin(115200);
}
//----------------------------------------------------------------
void loop()
{
//i=i+1;
//Spi.transfer(ltrs[i]);
addr = ltrs[*ptr];
//addr = *ltrs;
//result=checkline(addr);
Serial.println( *ptr, DEC );
Serial.println( addr, DEC );
Serial.println( *ltrs, DEC );
//Serial.println( result, DEC );
Serial.println(' ');
delay(500);
}
//--------------------------------------------------------------
byte checkline( unsigned char in_char )
{
asm volatile(
"cli \n" // отключить прерывания
"push r26 \n"
// "mov r30, %A[ADDR16] \n" // загрузить младший 16 бит адрес
// "mov r31, %B[ADDR16] \n" //
"label_1%=: \n"
"sbic %[PIN_B], 1 \n" // ловим кадровый импульс
"rjmp label_1%= \n"
"label_1e%=: \n"
"sbis %[PIN_B], 1 \n" // ждем начала кадра
"rjmp label_1e%= \n"
"rcall Wait_Line%= \n" // отступ с верху (переднее гашение)
"label_2%=: \n"
"sbic %[PIN_B], 0 \n" // ловим строчный импульс
"rjmp label_2%= \n"
"label_2e%=: \n"
"sbis %[PIN_B], 0 \n" // ждем начала строки
"rjmp label_2e%= \n"
"rcall Step_Line%= \n" //отступаем слева xx пикселей
//--------------------выводим изображение------------------------------------
"Transmit%=: \n"
"ld r26, %a[ADDR]+ \n" // загрузка данных из памяти программ с постинкрементом
// "ldi r26, 170 \n"
"out %[SPI_DATA], r26 \n"
"sbic %[PIN_B], 0 \n" // ловим строчный импульс
"rjmp Transmit%= \n" // переходим на вывод следующего байта
"sbic %[PIN_B], 1 \n" // ловим кадровый импульс
"rjmp label_2e%= \n" // продолжаем вывод данных если не конец кадра
"rjmp label_1e%= \n" // переходим на навый кадр
"mov %[RESULT], r30 \n" // возвращаем адрес в переменную result
"pop r26 \n"
"sei \n" // включить прерывания
"rjmp data%= \n" // на выход
//-------------------------------------------------
"Data_seg%=: \n"
//-----------------------подпрограмма отступа сверху--------------------------
"Wait_Line%=: \n"
"ldi r26, 30 \n" // чило пропускаемых строк , отступ сверху
"label_str%=: \n"
"sbic %[PIN_B], 0 \n" // ловим строчный импульс
"rjmp label_str%= \n"
"label_new%=: \n"
"sbis %[PIN_B], 0 \n" // ждем начала строки
"rjmp label_new%= \n"
"dec r26 \n"
"brne label_str%= \n" // считаем строки
"ret \n"
//-----------------------подпрограмма отступа слева--------------------------
"Step_Line%=: \n"
"ldi r26, 35 \n" // чило пропускаемых пикселей в начале строки , отступ слева
"label_step%=: \n"
"dec r26 \n"
"brne label_step%= \n" // считаем пропуски
"ret \n"
//---------------------------------------------------------------------------
"data%=: \n"
//".EQU 200 \n"
//".db 12, 34, 45, 23 \n"
// "sbi ADCSR, 6 \n" //включить бит преобразования
// "sbi r38, 6 \n" //включить бит преобразования
//"mov %0, r4 \n" // прочитать из младшего регистра АЦП ADCL
//"ret \n"
//---------------------------------------------------------------------------
: [RESULT] "=&r" (result) // Список выходных операндов
: [PORT_B] "I" (_SFR_IO_ADDR(PORTB)),
[SPI_DATA] "I" (_SFR_IO_ADDR(SPDR)),
[PIN_B] "I" (_SFR_IO_ADDR(PINB)),
[SPI_STAT] "I" (_SFR_IO_ADDR(SPSR)),
// [REG_IN] "r" (in_char),
[ADDR] "e" (ltrs),
// [ADDR] "m" (ltrs[*ptr]),
[ADDR16] "e" (addr)
: "memory", "r30", "r31" ); // //резервируем регистры
return (result);
}