Stefan Schuermans commited on 2012-06-28 20:42:22
Showing 1 changed files, with 98 additions and 11 deletions.
| ... | ... |
@@ -43,6 +43,12 @@ |
| 43 | 43 |
.def CNT = r17 |
| 44 | 44 |
.def DATA = r18 |
| 45 | 45 |
|
| 46 |
+; current mode |
|
| 47 |
+.def MODE = r19 |
|
| 48 |
+.equ MODE_ALL = 0 ; play all animations |
|
| 49 |
+.equ MODE_SINGLE = 1 ; play single animation only |
|
| 50 |
+.equ MODE_UNKNOWN = 0xFF ; unknown mode |
|
| 51 |
+ |
|
| 46 | 52 |
|
| 47 | 53 |
|
| 48 | 54 |
.DSEG |
| ... | ... |
@@ -159,12 +165,17 @@ ROW_OFF_LOOP: |
| 159 | 165 |
|
| 160 | 166 |
|
| 161 | 167 |
; play an animation N times (mode 0) or infinitely (mode 1) |
| 162 |
-; parameters: animation function, N |
|
| 168 |
+; parameters: animation function, N, animation number |
|
| 163 | 169 |
.MACRO PL_ANIM |
| 164 | 170 |
PL_ANIM_LOOP: |
| 171 |
+ ; play animation N times |
|
| 165 | 172 |
rcall_N @0,@1 - 1 |
| 166 |
- sbic MODE_SW_PIN,MODE_SW_BIT |
|
| 167 |
- rjmp PL_ANIM_LOOP |
|
| 173 |
+ ; read new mode |
|
| 174 |
+ ldi CNT,@2 |
|
| 175 |
+ rcall MODE_READ |
|
| 176 |
+ ; keep playing animation in mode 1 |
|
| 177 |
+ cpi MODE,MODE_SINGLE |
|
| 178 |
+ breq PL_ANIM_LOOP |
|
| 168 | 179 |
.ENDM |
| 169 | 180 |
|
| 170 | 181 |
|
| ... | ... |
@@ -641,25 +652,101 @@ ANIM_BW_WORM_LOOP: |
| 641 | 652 |
|
| 642 | 653 |
|
| 643 | 654 |
|
| 655 |
+; read mode from switch and (store animation number) |
|
| 656 |
+; input: MODE = old mode, CNT = animation number |
|
| 657 |
+; output: MODE = new mode |
|
| 658 |
+; changes: TMP, DATA |
|
| 659 |
+MODE_READ: |
|
| 660 |
+; read new mode (into DATA) |
|
| 661 |
+ ldi DATA,MODE_ALL |
|
| 662 |
+ sbic MODE_SW_PIN,MODE_SW_BIT |
|
| 663 |
+ ldi DATA,MODE_SINGLE |
|
| 664 |
+; mode was changed from all to single -> save animation number |
|
| 665 |
+ cpi MODE,MODE_ALL ; old mode not all -> do nothing |
|
| 666 |
+ brne MODE_READ_NOT_0_TO_1 |
|
| 667 |
+ cpi DATA,MODE_SINGLE ; new mode not single -> do nothing |
|
| 668 |
+ brne MODE_READ_NOT_0_TO_1 |
|
| 669 |
+ sbic EECR,EEPE ; EEPROM write ongoing -> do nothing |
|
| 670 |
+ rjmp MODE_READ_NOT_0_TO_1 |
|
| 671 |
+ ldi TMP,0<<EEPM1|0<<EEPM0 ; set EEPROM programming mode |
|
| 672 |
+ out EECR,TMP |
|
| 673 |
+ ldi TMP,0 ; set EEPROM address |
|
| 674 |
+ out EEARL,TMP |
|
| 675 |
+ mov TMP,CNT ; set EEPROM data to animation number |
|
| 676 |
+ com TMP ; with NOTed number in upper nibble |
|
| 677 |
+ swap TMP |
|
| 678 |
+ andi TMP,0xF0 |
|
| 679 |
+ or TMP,CNT |
|
| 680 |
+ out EEDR,TMP |
|
| 681 |
+ sbi EECR,EEMPE ; begin writing EEPROM |
|
| 682 |
+ sbi EECR,EEPE |
|
| 683 |
+MODE_READ_NOT_0_TO_1: |
|
| 684 |
+; remember new mode (in MODE) |
|
| 685 |
+ mov MODE,DATA |
|
| 686 |
+; done |
|
| 687 |
+ ret |
|
| 688 |
+ |
|
| 689 |
+ |
|
| 690 |
+ |
|
| 644 | 691 |
; main program |
| 645 | 692 |
MAIN: |
| 646 | 693 |
wdr |
| 647 | 694 |
|
| 648 | 695 |
; initialization |
| 696 |
+ ldi MODE,MODE_UNKNOWN ; unknown mode |
|
| 697 |
+ |
|
| 698 |
+; get number of fist animation from EEPROM (into CNT) |
|
| 699 |
+ ldi TMP,0 ; set EEPROM address |
|
| 700 |
+ out EEARL,TMP |
|
| 701 |
+ sbi EECR,EERE ; start EEPROM read |
|
| 702 |
+ in CNT,EEDR ; get read value |
|
| 703 |
+ mov TMP,CNT ; check if high nibble contains NOTed |
|
| 704 |
+ com TMP ; value |
|
| 705 |
+ swap TMP |
|
| 706 |
+ cp CNT,TMP |
|
| 707 |
+ brne MAIN_FIRST_ANIM_END |
|
| 708 |
+ andi CNT,0x0F ; throw away check value in high nibble |
|
| 709 |
+; jump to first animation |
|
| 710 |
+ cpi CNT,0 |
|
| 711 |
+ breq MAIN_FIRST_0 |
|
| 712 |
+ cpi CNT,1 |
|
| 713 |
+ breq MAIN_FIRST_1 |
|
| 714 |
+ cpi CNT,2 |
|
| 715 |
+ breq MAIN_FIRST_2 |
|
| 716 |
+ cpi CNT,3 |
|
| 717 |
+ breq MAIN_FIRST_3 |
|
| 718 |
+ cpi CNT,4 |
|
| 719 |
+ breq MAIN_FIRST_4 |
|
| 720 |
+ cpi CNT,5 |
|
| 721 |
+ breq MAIN_FIRST_5 |
|
| 722 |
+ cpi CNT,6 |
|
| 723 |
+ breq MAIN_FIRST_6 |
|
| 724 |
+ cpi CNT,7 |
|
| 725 |
+ breq MAIN_FIRST_7 |
|
| 726 |
+MAIN_FIRST_ANIM_END: |
|
| 727 |
+ |
|
| 649 | 728 |
|
| 650 | 729 |
MAIN_LOOP: |
| 651 | 730 |
wdr |
| 652 | 731 |
|
| 653 | 732 |
; main loop |
| 654 | 733 |
|
| 655 |
- PL_ANIM ANIM_BLINK,3 |
|
| 656 |
- PL_ANIM ANIM_WORM,3 |
|
| 657 |
- PL_ANIM ANIM_FLICKER,10 |
|
| 658 |
- PL_ANIM ANIM_BW_RUN,3 |
|
| 659 |
- PL_ANIM ANIM_FADE,2 |
|
| 660 |
- PL_ANIM ANIM_BW_WORM,3 |
|
| 661 |
- PL_ANIM ANIM_WOBBLE,5 |
|
| 662 |
- PL_ANIM ANIM_RUN,3 |
|
| 734 |
+MAIN_FIRST_0: |
|
| 735 |
+ PL_ANIM ANIM_BLINK,3,0 |
|
| 736 |
+MAIN_FIRST_1: |
|
| 737 |
+ PL_ANIM ANIM_WORM,3,1 |
|
| 738 |
+MAIN_FIRST_2: |
|
| 739 |
+ PL_ANIM ANIM_FLICKER,10,2 |
|
| 740 |
+MAIN_FIRST_3: |
|
| 741 |
+ PL_ANIM ANIM_BW_RUN,3,3 |
|
| 742 |
+MAIN_FIRST_4: |
|
| 743 |
+ PL_ANIM ANIM_FADE,2,4 |
|
| 744 |
+MAIN_FIRST_5: |
|
| 745 |
+ PL_ANIM ANIM_BW_WORM,3,5 |
|
| 746 |
+MAIN_FIRST_6: |
|
| 747 |
+ PL_ANIM ANIM_WOBBLE,5,6 |
|
| 748 |
+MAIN_FIRST_7: |
|
| 749 |
+ PL_ANIM ANIM_RUN,3,7 |
|
| 663 | 750 |
|
| 664 | 751 |
; bottom of main loop |
| 665 | 752 |
|
| 666 | 753 |