Assignment 3 Solution


Category: Tag:



  • Introduction to peripherals: LCD

  • Practice with C strings and indirect addressing

  • Exposure to the issues around busy-waiting


You will be required to demonstrate your solution to at least one part of the assignment. You will be required to explain how your code works and make a small change to your code. You must demonstrate competence with AVR Studio 7 and uploading the code to the board.

Demonstrations will take place outside lecture and lab times. A sign up sheet will be posted on the door to the lab. If you do not sign up for a demonstration, you will receive 0 for the assignment.

AVR Studio Project

As in assignment 2, you should create a new assembly language project in AVR Studio for this assignment. Download the sample code and add the files to the project.


The boards we are using have a Hitachi HD44780 compatible LCD display attached. This LCD display has its own (simple) processor that you must communicate with using a specific protocol in order to initialize and control the LCD screen.

You can learn more about how the LCD controller works by looking at the data sheet:

Luckily for you, a former student has written a library which does all the hard work communicating with the LCD controller and all you have to do is use the subroutines they have written.

The table below lists the subroutines, their parameters and what they do.


Parameters (passed on the stack)




Initializes the LCD screen. This

subroutine must be called before

any other subroutine in the LCD

library is used.


X – 1 byte

Move the LCD cursor to position

Y – 1 byte

(x,y). The first line on the LCD

is line 0, the second line is line 1.


Address of C-String in data memory – 2 bytes

Display the null terminated

string at the current cursor

position. This routine does no

length checking. It is up to you

to make sure the string isn’t

longer than the available space

on the LCD.



Clear the LCD screen.


Address of source string in Program Memory –

Copy a C string from program

2 bytes

memory into data memory.

Address of destination string in Data Memory

2 bytes

You’ve been given a sample program that shows you how to use these LCD functions in the file:


Part I – Simple LCD scrolling

You’ve seen LCD screens in various devices where the message scrolls across the screen. In this assignment you will create your own scrolling message device.

In this assignment we will have two messages that are scrolled across the LCD, one message on the first line, and another message on the second line. For discussion purposes, assume that:

msg1 = “This is the first message displayed on the first line of the LCD.”

msg2 = “On the second line of the LCD there is another message that is scrolled.”

When the program first starts, the LCD screen will contain:

This is the firs

And on the secon

After approximately ½ a second, the LCD screen will be updated to contain:

his is the first

nd on the second

And so on, so that approximately every ½ second the message will scroll one character to the left.

One important point is what happens when either of the messages near the end. The messages are to be treated as if they wrap-around. For example, at some point, the LCD will contain:

of the LCD.This

that is scrolle

Which shows that the first message has wrapped around to the start, while the second hasn’t yet reached the end.

Implementation Hints

Data Definitions


DO NOT include a .org directive in your data segment. The lcd library has already used the .org directive and if you use it again, you will overwrite internal storage for the lcd library.

Your instructor’s solution has the following in the data segment:

  • sample strings

  • These are in program memory

msg1_p: .db “This is the message on the first line. Here it goes.”, 0

msg2_p: .db “— buy — more — pop — buy “, 0



  • The program copies the strings from program memory

  • into data memory.

  • l1ptr and l2ptr index into these strings


msg1: .byte 200

msg2: .byte 200

  • These strings contain the 16 characters to be displayed on the LCD

  • Each time through the loop, the pointers l1ptr and l2ptr are incremented

  • and then 16 characters are copied into these memory locations

line1: .byte 17

line2: .byte 17

  • These keep track of where in the string each line currently is

l1ptr:.byte 2

l2ptr:.byte 2

Suggested Code Structure

With these data definitions shown above, the main loop of the scrolling application looks like:

initialize the lcd

clear the lcd

copy the strings from program to data memory

set l1ptr and l2ptr to point at the start of the display strings do forever:

clear line1 and line2

display line1 and line2

copy from the pointers in msg1 and msg2 to line1 and line2 display line1 and line2

move the pointers forward (wrap around when appropriate) delay

You should make extensive use of subroutines in your code. In your instructor’s solution, each line above is its own subroutine.

Including the delay code (which you can borrow from your lab) your instructor’s solution is ~300 lines of assembly language.

Start early!

Part II – Extend the scrolling application

Part II of the assignment allows you to get creative and extend the scrolling application to add some additional features.

At a minimum, you must extend the application so that you can press the “UP” button to stop the display scrolling. If the scrolling is stopped, pressing the “DOWN” button will restart the scrolling. Completing only this modification will score 50% of the Part II grade.

Some other suggested improvements:

  1. Allow button presses to increase and decrease the scrolling speed

  1. Allow the user to select different messages

  1. Do something with the LEDs while scrolling

In order to handle button presses gracefully you will have to do something other than busy loop waiting

either by checking the buttons in your delay subroutine or by using timer interrupts. Your instructor will be covering timer interrupts in the next week or so.


Submit a3.asm file using connex. Do NOT submit your project file – just the .asm files.


If you submit a program that does not assemble you will receive 0 for that part of the assignment.

If you do not complete a demonstration of your code during the posted demonstration times, you will not receive a grade for this assignment

Part I

10 marks

Part II

8 marks


18 marks