За основу взята статья Светодиодный КУБ 5 х 5 х 5
Очень удобно работать с прошивками в програмной среде MPLAB .
При включении питания на нем отображается текст "PICPROJECTS", а затем продолжает работать с помощью ряда случайно выбранных эффектов анимации. Если переключатель S1 нажать при включении питания будет показывать отображения текста.
Для начала отредактируем слово высвечивающееся в кубе, по умолчанию это слово "PICPROJECTS" изменим его на "HELLO". Для этого открываем ledCubeC.asm и CubeProgram.inc, в CubeProgram.inc видим следующий рядок:
редактируем его на :
LDR Р.З., 4
MSET
LDR R0, 'H'
JSR WRITE
LDR R0, 'E'
JSR WRITE
LDR R0, 'L'
JSR WRITE
LDR R0, 'L'
JSR WRITE
LDR R0, '0 '
JSR WRITE
RET
Все очень просто. Каждый символ анимированый при помощи двух команд, например, буква "Р" осуществляется с помощью этих двух команд.
LDR R0, 'P'
JSR WRITE
Как вы уж поняли все коды для "рисования" прописаны в файле CubeProgram.inc, вот его и надо редактировать.
DP имеет 8 регистров; 4 общего назначения и 4 специального назначения. Все регистры 8 бит и могут хранить значения в диапазоне 0-255.
Положение эффектов определяется ее X, Y и Z координат.
Регистры
Все эффекты прописаны через спец регистры, в таблице приведены:
Имя регистра |
Функции |
Диапазон |
R0 |
Общего назначения |
0-255 |
R1 |
Общего назначения |
0-255 |
R2 |
Общего назначения |
0-255 |
R3 |
Общего назначения |
0-255 |
RHOLD |
Временная задержка для команды SHOW (х 10 мс) |
0-255 |
RX |
X координат для voxel и функций рисования |
0-4 |
RY |
Y координат для voxel и функций рисования |
0-4 |
RZ |
Z координат для voxel и функций рисования |
0-4 |
Набор инструкций
r - имя регистра
k - константа данных
Мнемоника |
Описание |
Флаги |
Регистр |
NOOP |
Нет операции |
|
|
|
|
|
|
MSET |
Изменить набор операций для voxel включить |
|
|
MCLR |
Изменить набор операций для voxel выключить |
|
|
MINV |
Измение операции, будет инвертировано текущее значение voxel |
|
|
|
|
|
|
SETALL |
Включите все трехмерные объекты в кубе (independant of MSET, MCLR and MINV instructions) |
|
|
CLRALL |
Выключите все трехмерные объекты в кубе (independant of MSET, MCLR and MINV instructions) |
|
|
INVALL |
Инвертировать все трехмерные объекты в кубе (independant of MSET, MCLR and MINV instructions) |
|
|
|
|
|
|
SHOW |
Передача буфера рисунока для отображения и величины загрузки в RHOLD регестрированого в таймере |
|
|
|
|
|
|
VOX k,k,k |
Загрузка RX, RY, RZ и изменить voxel [ 0 <= k <= 4 ] |
|
RX,RY,RZ |
VOXM |
Изменить voxel по текущим RX, RY, RZ координатам |
|
|
TSTVOX |
Испытание voxel по текущим RX, RY, RZ координат.
Fzero clear if voxel on : Fzero set if voxel off |
Fzero |
|
|
|
|
|
CHYR r |
Draw ASCII символов, указанного в регистре r in the Y (вертикальной) плоскости |
|
|
CHZR r |
Draw ASCII символов, указанного в регистре r in the Z (горизонтальной) плоскости |
|
|
CHY k |
Draw ASCII значение символа value k in the Y (вертикальной) плоскости [32 <= k <= 95] |
|
|
CHZ k |
Draw ASCII значение символа value k in the Z (горизонтальной) плоскости [32 <= k <= 95] |
|
|
|
|
|
|
LINE k,k,k,k |
Изменить линию трехмерные объекты, specify x inc, y inc, z inc, length |
|
RX,RY,RZ |
LINEX |
Modify line of voxels across the whole X axis, located at RY,RZ |
|
|
LINEY |
Modify line of voxels across the whole Y axis, located at RX,RZ |
|
|
LINEZ |
Modify line of voxels across the whole Z axis, located at RX,RY |
|
|
|
|
|
|
PLANEX |
Modify all voxels in the YZ plane, located in the X-axis at RX |
|
|
PLANEY |
Modify all voxels in the XZ plane, located in the Y-axis at RY |
|
|
PLANEZ |
Modify all voxels in the XY plane, located in the Z-axis at RZ |
|
|
|
|
|
|
ROTATEX |
Rotate entire cube along a line at y=2, z=2 in the x-axis |
|
|
|
|
|
|
SHXL |
Shift entire drawing buffer left one voxel. |
|
|
SHXR |
Shift entire drawing buffer right one voxel. |
|
|
SHYU |
Shift entire drawing buffer up one voxel |
|
|
SHYD |
Shift entire drawing buffer down one voxel |
|
|
SHZF |
Shift entire drawing buffer forward one voxel |
|
|
SHZB |
Shift entire drawing buffer back one voxel |
|
|
|
|
|
|
DECX |
Decrement RX register, modulo 5 |
Fzero |
RX |
DECY |
Decrement RY register, modulo 5 |
Fzero |
RY |
DECZ |
Decrement RZ register, modulo 5 |
Fzero |
RZ |
INCX |
Increment RX register, modulo 5 |
Fzero |
RX |
INCY |
Increment RY register, modulo 5 |
Fzero |
RY |
INCZ |
Increment RZ register, modulo 5 |
Fzero |
RZ |
|
|
|
|
DECR r |
Decrement register, modulo 256 |
Fzero |
r |
DECRSZ r |
Decrement register, modulo 256, Skip next instruction if result is zero |
|
r |
INCR r |
Increment register, modulo 256 |
Fzero |
r |
INCRSZ r |
Increment register, modulo 256, Skip next instruction if result is zero |
|
r |
|
|
|
|
PUSHR r |
Push register contents onto top of stack |
|
|
PULLR r |
Pull top of stack and place contents into register |
|
r |
PUSHXYZ |
Push registers RX, RY, RZ on to stack |
|
|
PULLXYZ |
Pull registers RX, RY, RZ from stack |
|
RX,RY,RZ |
DROP |
Pull entry from top of stack and discard it ( a -- ) |
|
|
SWAP |
Swap top two entries on stack. ( a b -- b a ) |
|
|
DUP |
Duplicate entry on top of stack. (a b -- a a b ) |
|
|
OVER |
Operates on the stack : (a b -- a b a ) |
|
|
ROT |
Operates on the stack : ( a b c -- b c a) |
|
|
TSTZ |
Test value on top of stack and condition Fzero flag (a -- a ) : a==0 Fzero set, a != 0 Fzero clear |
Fzero |
|
|
|
|
|
ADD |
pulls two values from the stack, adds them together and pushes result back onto stack |
Fzero
Fcarry |
|
SUB |
pulls two values from the stack, subtracts them and pushes result back onto stack
order is (TopOfStack-1) - (TopOfStack) -> TopOfStack |
Fzero
Fcarry |
|
AND |
pulls two values from the stack, performs a bitwise 'AND' result is pushed back onto stack |
Fzero |
|
OR |
pulls two values from the stack, performs a bitwise 'OR' result is pushed back onto stack |
Fzero |
|
XOR |
pulls two values from the stack, performs a bitwise 'XOR' result is pushed back onto stack |
Fzero |
|
NOT |
pull value from top of stack, perform bitwise 'NOT' operation on byte and push result back on to stack |
Fzero |
|
|
|
|
|
CMP r, k |
Compare register contents with k. If contents of r == k then Fzero Set, else Fzero Cleared. |
Fzero |
|
|
|
|
|
LDXYZ k,k,k |
Load RX, RY, RZ [ 0 <= k <= 4 ] (see also VOX k,k,k) |
|
RX,RY,RZ |
LDR r,k |
Load register with value k [0 <= k <= 255 ] |
|
r |
LDRAND r,k |
Load register with random number in the range [ 0 <= Random Number < k ] |
|
r |
LDTMR k |
Загрузка таймера с периодом в сек. [1 <= k <= 255 ] |
|
|
ADDTRND k |
Добавить случайное число в диапазоне [ 0 <= Random Number < k ] to contents of Timer |
|
|
|
|
|
|
SKIPZ |
Перейти следующей инструкции если Fzero flag is set |
|
|
SKIPNZ |
Перейти следующей инструкции если Fzero flag is clear |
|
|
SKIPC |
Перейти следующей инструкции если flag is set |
|
|
SKIPNC |
Перейти следующей инструкции если Fcarry flag is clear |
|
|
SKIPTOUT |
Пропустить следующую инструкцию, если таймер == 0 |
|
|
JUMP k |
Перейти к программе адрес k |
|
|
JSR k |
Перейти к подпрограмме по адресу k |
|
|
RET |
Вернуться из подпрограммы |
|
|
|
|
|
|
RANDSEED |
Seed random number generator with non-zero value from TMR0 |
|
|
SYNCEXT k |
Wait for a falling edge on SW1 input before continuing program execution or timer out |
Fzero |
|
TSTSW |
Испытание SW1 вводаt. Установите Fzero flag if switch active (pressed), Clear Fzero flag if switch not active |
Fzero |
|
После редактирования исходника необходимо создать HEX, который и будет зашит в МК.
Скачать исходник, прошивку и схему
Источник
|