|
За основу взята статья Светодиодный КУБ 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, который и будет зашит в МК.
Скачать исходник, прошивку и схему
Источник
|