gavrasm Gerd's AVR assembler version 2.1 (C)2006 by DG4FAC
----------------------------------------------------------
Source file: hello.LCD.44.asm
Hex file:    hello.LCD.44.hex
Eeprom file: hello.LCD.44.eep
Compiled:    17.11.2008, 01:35:22
Pass:        2
     1: ;
     2: ; hello.LCD.44.asm
     3: ; 
     4: ; LCD hello-world
     5: ;
     6: ; Neil Gershenfeld
     7: ; CBA MIT 11/15/08
     8: ;
     9: ; (c) Massachusetts Institute of Technology 2008
    10: ; Permission granted for experimental and personal use;
    11: ; license for commercial sale available from MIT.
    12: ;
    13: .include "tn44def.inc"
 -> Warning 009: Include defs not necessary, using internal values!
   File: hello.LCD.44.asm, Line: 13
   Source line: .include "tn44def.inc"
    14: ;
    15: ; definitions
    16: ;
    17: .equ DB7 = PA0
    18: .equ DB6 = PA2
    19: .equ DB5 = PA1
    20: .equ DB4 = PA3
    21: .equ E = PA5
    22: .equ RS = PA4
    23: ;
    24: ; registers
    25: ;
    26: .def lcdbyte = R16
    27: .def temp = R18
    28: .def temp1 = R19
    29: .def temp2 = R20
    30: .def temp3 = R21
    31: ;
    32: ; code segment
    33: ;		
    34: .cseg
    35: .org 0
    36: 000000   C066  rjmp reset
    37: ;
    38: ; long_delay
    39: ; delay before redraw
    40: ;
    41: .equ long_delay_time = 100
    42: long_delay:
    43: 000001   E634  ldi temp1, long_delay_time
    44:    long_delay1:
    45: 000002   E644  ldi temp2, long_delay_time
    46:       long_delay2:
    47: 000003   E654  ldi temp3, long_delay_time
    48:          long_delay3:
    49: 000004   955A  dec temp3
    50: 000005   F7F1  brne long_delay3
    51: 000006   954A  dec temp2
    52: 000007   F7D9  brne long_delay2
    53: 000008   953A  dec temp1
    54: 000009   F7C1  brne long_delay1
    55: 00000A   9508  ret
    56: ;
    57: ; lcd_delay
    58: ; delay between commands
    59: ;
    60: .equ lcd_delay_time = 100
    61: lcd_delay:
    62: 00000B   E634  ldi temp1, lcd_delay_time
    63:    lcd_delay1:
    64: 00000C   E644  ldi temp2, lcd_delay_time
    65:       lcd_delay2:
    66: 00000D   954A  dec temp2
    67: 00000E   F7F1  brne lcd_delay2
    68: 00000F   953A  dec temp1
    69: 000010   F7D9  brne lcd_delay1
    70: 000011   9508  ret
    71: ;
    72: ; lcd_putchar
    73: ; put character in lcdbyte
    74: ;
    75: lcd_putchar:
    76:    ;
    77:    ; set RS for data
    78:    ; 
    79: 000012   9ADC  sbi PORTA, RS
    80:    ;
    81:    ; output high nibble
    82:    ;
    83: 000013   98D8  cbi PORTA, DB7
    84: 000014   FD07  sbrc lcdbyte, 7
    85: 000015   9AD8  sbi PORTA, DB7
    86: 000016   98DA  cbi PORTA, DB6
    87: 000017   FD06  sbrc lcdbyte, 6
    88: 000018   9ADA  sbi PORTA, DB6
    89: 000019   98D9  cbi PORTA, DB5
    90: 00001A   FD05  sbrc lcdbyte, 5
    91: 00001B   9AD9  sbi PORTA, DB5
    92: 00001C   98DB  cbi PORTA, DB4
    93: 00001D   FD04  sbrc lcdbyte, 4
    94: 00001E   9ADB  sbi PORTA, DB4
    95:    ;
    96:    ; strobe E
    97:    ;
    98: 00001F   0000  nop
    99: 000020   9ADD  sbi PORTA, E
   100: 000021   0000  nop
   101: 000022   98DD  cbi PORTA, E
   102:    ;
   103:    ; wait
   104:    ;
   105: 000023   DFE7  rcall lcd_delay ; can be shorter
   106:    ;
   107:    ; output low nibble
   108:    ;
   109: 000024   98D8  cbi PORTA, DB7
   110: 000025   FD03  sbrc lcdbyte, 3
   111: 000026   9AD8  sbi PORTA, DB7
   112: 000027   98DA  cbi PORTA, DB6
   113: 000028   FD02  sbrc lcdbyte, 2
   114: 000029   9ADA  sbi PORTA, DB6
   115: 00002A   98D9  cbi PORTA, DB5
   116: 00002B   FD01  sbrc lcdbyte, 1
   117: 00002C   9AD9  sbi PORTA, DB5
   118: 00002D   98DB  cbi PORTA, DB4
   119: 00002E   FD00  sbrc lcdbyte, 0
   120: 00002F   9ADB  sbi PORTA, DB4
   121:    ;
   122:    ; strobe E
   123:    ;
   124: 000030   0000  nop
   125: 000031   9ADD  sbi PORTA, E
   126: 000032   0000  nop
   127: 000033   98DD  cbi PORTA, E
   128:    ;
   129:    ; wait and return
   130:    ;
   131: 000034   DFD6  rcall lcd_delay ; can be shorter
   132: 000035   9508  ret
   133: ;
   134: ; lcd_putcmd
   135: ; put command in lcdbyte
   136: ;
   137: lcd_putcmd:
   138:    ;
   139:    ; clear RS for command
   140:    ; 
   141: 000036   98DC  cbi PORTA, RS
   142:    ;
   143:    ; output command bits
   144:    ;
   145: 000037   BB0B  out PORTA, lcdbyte
   146:    ;
   147:    ; strobe E
   148:    ;
   149: 000038   0000  nop
   150: 000039   9ADD  sbi PORTA, E
   151: 00003A   0000  nop
   152: 00003B   98DD  cbi PORTA, E
   153:    ;
   154:    ; wait and return
   155:    ;
   156: 00003C   DFCE  rcall lcd_delay
   157: 00003D   9508  ret
   158: ;
   159: ; lcd_init
   160: ; initialize the LCD
   161: ;
   162: lcd_init:
   163:    ;
   164:    ; power-up delay
   165:    ;
   166: 00003E   DFCC  rcall lcd_delay
   167:    ;
   168:    ; initialization sequence
   169:    ;
   170: 00003F   E00A  ldi lcdbyte, (1 << DB5) + (1 << DB4)
   171: 000040   DFF5  rcall lcd_putcmd
   172: 000041   E00A  ldi lcdbyte, (1 << DB5) + (1 << DB4)
   173: 000042   DFF3  rcall lcd_putcmd
   174: 000043   E00A  ldi lcdbyte, (1 << DB5) + (1 << DB4)
   175: 000044   DFF1  rcall lcd_putcmd
   176:    ;
   177:    ; 4-bit interface
   178:    ;
   179: 000045   E002  ldi lcdbyte, (1 << DB5)
   180: 000046   DFEF  rcall lcd_putcmd
   181:    ;
   182:    ; two lines, 5x7 font
   183:    ;
   184: 000047   E002  ldi lcdbyte, (1 << DB5)
   185: 000048   DFED  rcall lcd_putcmd
   186: 000049   E001  ldi lcdbyte, (1 << DB7)
   187: 00004A   DFEB  rcall lcd_putcmd
   188:    ;
   189:    ; display on
   190:    ;
   191: 00004B   2700  clr lcdbyte
   192: 00004C   DFE9  rcall lcd_putcmd
   193: 00004D   E007  ldi lcdbyte, (1 << DB7) + (1 << DB6) + (1 << DB5)
   194: 00004E   DFE7  rcall lcd_putcmd
   195:    ;
   196:    ; entry mode
   197:    ;
   198: 00004F   2700  clr lcdbyte
   199: 000050   DFE5  rcall lcd_putcmd
   200: 000051   E006  ldi lcdbyte, (1 << DB6) + (1 << DB5)
   201: 000052   DFE3  rcall lcd_putcmd
   202: 000053   9508  ret
   203: ;
   204: ; lcd_print
   205: ; print a null-terminated string
   206: ;
   207: lcd_print:
   208:    lcd_print_loop:
   209: 000054   95C8  lpm
   210: 000055   2D00  mov lcdbyte, R0
   211: 000056   3000  cpi lcdbyte, 0
   212: 000057   F019  breq return
   213: 000058   DFB9  rcall lcd_putchar
   214: 000059   9631  adiw zl, 1
   215: 00005A   CFF9  rjmp lcd_print_loop
   216:    return:
   217: 00005B   9508  ret
   218: ;
   219: ; strings to print
   220: ;
   221: line_1:
   222:    .db "Hello to",0
 -> Warning 004: Number of bytes on line is odd, added 00 to fit program memory!
   File: hello.LCD.44.asm, Line: 222
   Source line:    .db "Hello to",0
        00005C 6548 6C6C 206F 6F74
        000060 0000
   223: line_2:
   224:    .db "the world!",0
 -> Warning 004: Number of bytes on line is odd, added 00 to fit program memory!
   File: hello.LCD.44.asm, Line: 224
   Source line:    .db "the world!",0
        000061 6874 2065 6F77 6C72
        000065 2164 0000
   225: ;
   226: ; reset routine
   227: ;
   228: reset:
   229:    ;
   230:    ; set stack pointer to top of RAM
   231:    ;
   232: 000067   E021  ldi temp, high(RAMEND)
   233: 000068   BF2E  out SPH, temp
   234: 000069   E52F  ldi temp, low(RAMEND)
   235: 00006A   BF2D  out SPL, temp
   236:    ;
   237:    ; init I/O pins
   238:    ;
   239: 00006B   98D8  cbi PORTA, DB7
   240: 00006C   9AD0  sbi DDRA, DB7
   241: 00006D   98DA  cbi PORTA, DB6
   242: 00006E   9AD2  sbi DDRA, DB6
   243: 00006F   98D9  cbi PORTA, DB5
   244: 000070   9AD1  sbi DDRA, DB5
   245: 000071   98DB  cbi PORTA, DB4
   246: 000072   9AD3  sbi DDRA, DB4
   247: 000073   98DD  cbi PORTA, E
   248: 000074   9AD5  sbi DDRA, E
   249: 000075   98DC  cbi PORTA, RS
   250: 000076   9AD4  sbi DDRA, RS
   251:    ;
   252:    ; init LCD
   253:    ;
   254: 000077   DFC6  rcall lcd_init
   255:    ;
   256:    ; main loop
   257:    ;
   258:    main:
   259:       ;
   260:       ; go to zero position
   261:       ;
   262: 000078   2700  clr lcdbyte
   263: 000079   DFBC  rcall lcd_putcmd
   264: 00007A   E002  ldi lcdbyte, (1 << DB5)
   265: 00007B   DFBA  rcall lcd_putcmd
   266:       ;
   267:       ; print first line
   268:       ;
   269: 00007C   EBE8  ldi zl,low(line_1*2)
   270: 00007D   E0F0  ldi zh,high(line_1*2)
   271: 00007E   DFD5  rcall lcd_print
   272:       ;
   273:       ; move to second line
   274:       ;
   275: 00007F   E005  ldi lcdbyte, (1 << DB7) + (1 << DB6)
   276: 000080   DFB5  rcall lcd_putcmd
   277: 000081   2700  clr lcdbyte
   278: 000082   DFB3  rcall lcd_putcmd
   279:       ;
   280:       ; print second line
   281:       ;
   282: 000083   ECE2  ldi zl,low(line_2*2)
   283: 000084   E0F0  ldi zh,high(line_2*2)
   284: 000085   DFCE  rcall lcd_print
   285:       ;
   286:       ; pause
   287:       ;
   288: 000086   DF7A  rcall long_delay
   289:       ;
   290:       ; clear display
   291:       ;
   292: 000087   2700  clr lcdbyte
   293: 000088   DFAD  rcall lcd_putcmd
   294: 000089   E008  ldi lcdbyte, (1 << DB4)
   295: 00008A   DFAB  rcall lcd_putcmd
   296:       ;
   297:       ; repeat
   298:       ;
   299: 00008B   CFEC  rjmp main

Program             :      129 words.
Constants           :       11 words.
Total program memory:      140 words.
Eeprom space        :        0 bytes.
Data segment        :        0 bytes.
Compilation completed, no errors.
Compilation endet 17.11.2008, 01:35:22
