Немного предистории:
анимация разбита на 15 изображений (спрайтов), каждый спрайт оформлен в виде массива в котором кроме самого изображения, присутствуют данные о размере оного- по вертикали и горизонтали, а также бите цветности. Далее - все изображения анимации оформлены в один массив, из которого они в цикле вызываются.
Спойлер
void nlcd_Bitmap_Animation(unsigned char start_x, unsigned char start_y){
unsigned char j; // счетчик цикла
unsigned char *bitmap_data; // указатель на bmp спрайт из массива спрайтов
unsigned char *Table_smile1[15] = {(unsigned char *)bmp1_smile1, (unsigned char *)bmp2_smile1,
(unsigned char *)bmp3_smile1, (unsigned char *)bmp4_smile1,
(unsigned char *)bmp5_smile1, (unsigned char *)bmp6_smile1,
(unsigned char *)bmp7_smile1, (unsigned char *)bmp8_smile1,
(unsigned char *)bmp9_smile1, (unsigned char *)bmp10_smile1,
(unsigned char *)bmp11_smile1,(unsigned char *)bmp12_smile1,
(unsigned char *)bmp13_smile1,(unsigned char *)bmp14_smile1,
(unsigned char *)bmp15_smile1};
for (j= 0; j<15; j++)
{ // Перебираем все спрайты анимации и крутим их в цикле
bitmap_data = (unsigned char *)Table_smile1[j];// Получаем указатель на массив с массивами спрайтов
unsigned char end_x; // Ширина картинки по x
unsigned char end_y; // Высота картинки по y
unsigned char bit_col; // Цветопередача картинки
unsigned char byte; // Количество байт
unsigned char frame; // Количество кадров- не используется
unsigned int i;
unsigned char *pBit;
unsigned char *pBitmap;
pBit = (unsigned char*)bitmap_data;
end_x = pgm_read_byte(pBit); // Получаем из массива ширину изображения
end_y = pgm_read_byte(pBit +1); // Получаем из массива высоту изображения
bit_col = pgm_read_byte(pBit +2); // Получаем из массива цветность (бит- цвета)
byte = pgm_read_byte(pBit +3); // Получаем из массива количество байт
frame = pgm_read_byte(pBit +4); // Получаем из массива количество кадров(для анимации)
nlcd_SendByte(CMD_LCD_MODE,LCD_PHILLIPS_COLMOD); // Команда выбора режима отображения цвета
nlcd_SendByte(DATA_LCD_MODE,bit_col); // Пишем значение выбранного цвета из массива
// Указываем размеры рисунка в соответствии с этими пределами
nlcd_SendByte(CMD_LCD_MODE,LCD_PHILLIPS_CASET); // Команда адреса страницы RAM
nlcd_SendByte(DATA_LCD_MODE,start_x); // Старт
nlcd_SendByte(DATA_LCD_MODE,start_x+end_x); // Конец
nlcd_SendByte(CMD_LCD_MODE,LCD_PHILLIPS_PASET); // Команда адреса колонки RAM
nlcd_SendByte(DATA_LCD_MODE,start_y); // Старт
nlcd_SendByte(DATA_LCD_MODE,start_y+end_y); // Конец
nlcd_SendByte(CMD_LCD_MODE,LCD_PHILLIPS_RAMWR); // Пишем в RAM
pBitmap = (unsigned char*)bitmap_data +5; // прибавляем 5, чтобы при чтении не учитывались первые
// 5 бит с служебной информацией
for (i= 0; i<((end_x+1)*(end_y+1))>>1; i++) // Цикл отрисовки спрайта анимации
{
CS_LCD_RESET; // Отключаем дисплей
switch(bit_col) // Устанавливаем отображение цветности изображения
{
case 0x04: // Если бит цвета изображения( спрайта) равен 0x04, то
{
unsigned char bitmap;
bitmap = pgm_read_byte(pBitmap++); // Выполняем- 12 бит
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
CS_LCD_SET; // включаем дисплей
}
break; // и выходим,
case 0x05: // если 0x05:
{
unsigned char bitmap;
bitmap = pgm_read_byte(pBitmap++); // Выполняем- 16 бит
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
CS_LCD_SET; // включаем дисплей
}
break; // и выходим,
default: case 0x02: // или 0x02-
{
unsigned char bitmap;
bitmap = pgm_read_byte(pBitmap++); // Выполняем- 8 бит
nlcd_SendByte(DATA_LCD_MODE,bitmap);
bitmap = pgm_read_byte(pBitmap++);
nlcd_SendByte(DATA_LCD_MODE,bitmap);
CS_LCD_SET; // включаем дисплей
}
break; // и выходим.
} // цветность определили
}// спрайт отрисовали
nlcd_SendByte(CMD_LCD_MODE,LCD_PHILLIPS_NOP);
lcd_delay_ms(Frame_delay); // Частота кадров анимации
}// цикл спрайтов
}// конец функции
Вот тут сам вопрос- как организовать бесконечный цикл вывода спрайтов изображения с выходом из функции?


