Search the web
Sign In
New User? Sign Up
AVRButterFly · AVR ButterFly & Beginners Group
? Already a member? Sign in to Yahoo!

Yahoo! Groups Tips

Did you know...
Hear how Yahoo! Groups has changed the lives of others. Take me there.

Best of Y! Groups

   Check them out and nominate your group.
Having problems with message search? Fill out this form to ensure your group is one of the first to be migrated to the new message search system.

Messages

  Messages Help
Advanced
SCROLL LONG MESSAGE ACROSS LCD SCREEN in ASM (442 Bytes)   Message List  
Reply | Forward Message #982 of 996 |
Scroll a long message defined by a .db "Message." terminated with a period across the LCD screen on the Butterfly. Approx 440 bytes.

;------------------------------------------;
;         HELLO WORLD #3 (SCROLLING)       ;
;         =============================    ;
;                                          ;
; AUTHOR: DANIEL J, DOREY AKA RETRODAN     ;
; 05-OCT-09: CREATED LAST UPDATE:20-OCT-09 ;
;                                          ;
; SCROLLS LONG MESSAGES ACROSS LCD SCREEN  ;
; MESSAGE TERMINATED WITH A PERIOD (.)     ;
;------------------------------------------;
.NOLIST
.INCLUDE "M169DEF.INC"    ;BUTTERFLY DEFS
.LIST

;---------------------------------:
; RENAME/DEFINE WORKING REGISTERS ;
;---------------------------------;

.SET CHR6BUF = 2      ;6 CHAR BUFFER IS [R2,R3,R4,R5,R6,R7]

.DEF ZERO    = R8
.DEF T1      = R11
.DEF T2      = R12

.DEF A       = R16    ;R16:R31 CAN BE LOADED IMMEDIATE (LDI)
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF N       = R24

.SET BLANK_CHAR=SPACE-LCD_TABLE

.ORG $0000
       RJMP RESET

;-----------------;
; INITIALIZATIONS ;
;-----------------;
RESET: CLR ZERO
       LDI A,HIGH(RAMEND) ;SETUP THE STACK POINTER
       OUT SPH,A          ;AT TOP OF MEMORY AND
       LDI A,LOW(RAMEND)  ;GROW DOWNWARDS
       OUT SPL,A
       RCALL LCD_INIT     ;INITIALIZE LCD
       RCALL LCD_CLR      ;CLEAR LCD SEGMENTS

;-----------;
; MAIN LOOP ;
;-----------;                      
MAIN:
LOOP:  LDI YL,LOW(MESSAGE*2) ;SET A POINTER TO MESSAGE
       LDI YH,HIGH(MESSAGE*2)
       RCALL SCROLL          ;SCROLL MESSAGE
       RCALL DELAY           ;WAIT
       RCALL DELAY
       RCALL DELAY
DONE:    RJMP LOOP
MESSAGE: .DB "     HELLO TO THE WORLD FROM INSIDE THE AVR168 BUTTERFLY USING ASSEMBLY LANGUAGE     ."

;---------------------;
; SCROLL MESSAGE LOOP ;
;---------------------;
SCROLL: MOVW Z,Y                  ;MOVE FROM 1ST POINTER TO 2ND
        PUSH YL                   ;SAVE 1ST POINTER
        PUSH YH
        RCALL SHOWBUF             ;DISPLAY WHAT Z POINTS AT
        RCALL DELAY               ;WAIT
        POP YH                    ;RESTORE 1ST POINTER
        POP YL
        ADIW YH:YL,1              ;INCREMENT POINTER
        CPI A,'.'                 ;STOP AT PERIOD '.'
         BRNE SCROLL
          RET

;-------------------------------;
; COPIES TEXT TO DISPLAY BUFFER ;
; MUST LOAD (Z) FIRST           ;
;-------------------------------;
SHOWBUF:LPM  A,Z+
        MOV  R7,A
        LPM  A,Z+
        MOV  R6,A
        LPM  A,Z+
        MOV  R5,A
        LPM  A,Z+
        MOV  R4,A
        LPM  A,Z+
        MOV  R3,A
        LPM  A,Z+
        MOV  R2,A
        PUSH A
        RCALL DISPN
        POP A
         RET
;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
          BRLO NOZINC   ;PAST 2ND READ?
           BRTC NOZINC  ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
          BRNE DISPLUP  ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;-----------------------------------;
; PAUSE/DELAY ROUTINE               ;
; USES R0:R1 - NOT RESTORED         ;
; WARNING R0:R1 ARE NOT INITIALIZED ;
; USES A - RESTORED                 ;
;-----------------------------------;
PAUSE:
DELAY: PUSH A
       LDI A,8
DLUPE: DEC R0
        BRNE DLUPE
         DEC R1
          BRNE DLUPE
           DEC A
            BRNE DLUPE
             POP A
              RET

;-----------------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2          ;                                                          ;
;    ALTERATIONS FROM ORIGINAL CHAR SET FOUND IN APP NOTES  ;
; 1. CONVERTED TO BINARY FROM HEX FOR LEGIBITIY             ;
; 2. REPLACED SOME CHARS                                    ;
; 3. PLACED ALPHABET RIGHT AFTER NUMBERS EASES TABLE        ;
;    LOOKUPS WHEN USING HEX: 10 OVERFLOWS INTO A, 11=>B ETC ;
; 4. ZERO MOVED TO FIRST ENTRY TO EASE TABLE LOOKUPS        ;
;-----------------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
 .DW 0b0010000010000000 ;1
 .DW 0b0001111000010001 ;2
 .DW 0b0001101100010001 ;3
 .DW 0b0000101101010000 ;4
 .DW 0b0001101101000001 ;5
 .DW 0b0001111101000001 ;6
 .DW 0b0000000101010001 ;7
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S
 .DW 0b0010000010000001 ;T
 .DW 0b0001010101010000 ;U
 .DW 0b1000000100110000 ;V
 .DW 0b1100010101010000 ;W
 .DW 0b1100000000101000 ;X
 .DW 0b0010000000101000 ;Y
 .DW 0b0101000000001001 ;Z
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>



Tue Oct 20, 2009 4:35 pm

retr0dan
Offline Offline
Send Email Send Email

Forward
Message #982 of 996 |
Expand Messages Author Sort by Date

Scroll a long message defined by a .db "Message." terminated with a period across the LCD screen on the Butterfly. Approx 440 bytes. ...
retr0dan
Offline Send Email
Oct 20, 2009
4:35 pm
Advanced

Copyright © 2009 Yahoo! Inc. All rights reserved.
Privacy Policy - Terms of Service - Guidelines - Help