5x7 Display
Experiments
Page5
REMINDER:
These are the items you need for these experiments:
- the 5x7 Display Project (fully
built),
- a 6v battery,
- an interface cable
(the components come with the kit)
- a computer.
The first 6 experiments are on:
"Experiments
Page1." (Turning a LED on, Blinking, Scanning up/down,
Reaction Game - Hit the middle LED)
Experiments 7, 8, 9 are on:
"Experiments
Page2." (shifting columns of LEDs left/right back/forth)
Experiments 10, 11 are on:
"Experiments
Page3." (Start/Stop action via switch, Elevator display)
Experiment 12 is on:
"Experiments
Page4." (TE Moving Sign)
EXPERIMENT-13 Single
Digit UP-COUNTER
The 5x7 Display can display numbers and letters as well as graphics. It
can also be a one digit, two digit or three digit counter. The next 4
experiments will show the types of counters that can be produced by the 5x7
Display Module. In this experiment we will produce a single digit UP
COUNTER using button A to increment the display. The layout of the
digits is shown in the diagram below: Each
digit needs 5 locations in a table as they will be scanned on the
Screen. The display will start at zero an increment each time the switch
is pressed.
Most of the routines for this program have already been presented. It's only
a matter of combining them with some slight modifications.
The Program will have 5 Ghost locations and the routine for transferring
data from these locations to the screen can be found in Experiment-12 under
"Scan." This routine takes data from files 11h, to 15h and moves
it to output port B (file 06). A delay is called and the 4017 is clocked to
output to the next column. After 5 columns, the 4017 is reset and the
process starts again. In the Delay/clock sub-routine, the display is turned
off while the 4017 advances to the next position, to prevent
"mirroring" on the screen. This is a very dim image on the screen
containing information from the previous column. It's also called
"Ghosting" or "Blurring."
The sub-routine to take information from the table to the Ghost locations
has already been presented but not 5 bytes at a time.
We are going to introduce a new approach to doing this called INDIRECT
ADDRESSING. This method is ideal when data in consecutive locations has to
be transferred to files that are also numerically next to each other.
It involves the use of the Indirect Register (or file) called INDF. This
file is used in conjunction with another file called the FSR. This is
"File
Select Register" and the sub-routine start by telling the FSR the value of
the first location where you want to place the information. (It can also be
given the address of the file where you want information to be
collected).
When you access INDF and request its contents to be placed in another file,
the value of its contents will be the value of the file looked at by FSR.
This means that FSR can be incremented and by looking at a single file
(called INDF) you can get a string of values. This can save a lot of
programming. It only becomes economical if 5 or more values need to be
transferred.
Finally you need to incorporate a sub-routine that looks at the input button
(push-switch A) and makes sure it is fully debounced.
Start by creating the table, Table1: Number "1" has
"00" as first and fifth bytes in the table so the number sits in
the centre of the screen.
To produce a down-counter, simply reverse the order of the
digits in the table.
By now you will see some of the advantages of learning to program. You can produce
items that can be tailor-made to specific requirements and added to a PC
board already in production. The display can use any colour or size LED and
they can be doubled-up to produce larger "pixels."
Some of the running-sign manufacturers are very clever. They use a block of
4 high-bright LEDs to represent each pixel and the signs are only 7-lines
high. At first glance you would not notice the "blocky" effect of
the writing as the words are clearly seen. It only when you look closely and
see how few LEDs are required to produce the sign, that the "smart
thinking" has come to the fore.
The advantage of producing everything yourself is it slows down someone else
copying your designs. No-one can go out and buy a module to duplicate what
you have done. And you have the advantage of simplifying your range of
components. But basically it comes down to cost. You can actually produce a
microcontroller product cheaper than a discreet product. A four-digit
counter chip we used in a project some time ago has increased in price so
much that it costs twice as much as a PIC micro!
Don't be put off by the simplicity of these experiment. They use up less
than 1/10th of the memory and demonstrate less than 1/100 the capability of
the micro. They are only intended as the first stepping-stone to
programming.
What a dream! To be able to produce a counter by simply writing a few lines
of code! See the range of 4 counter experiments and you will able to see how
they can be adapted to suit your own needs. Start with the 0-9 UP
Counter:
|
Experiment-13
for "5x7 Display" Project
;PIC16F84 and only F84 chip
; 0-9 Up Counter
Start ORG 0x00
BSF 03,5
;Go to page1 for setting-up the ports
MOVLW 0Ch
;Put 0C into W
MOVWF 05h
; to make RA2 & RA3 input
MOVLW 00h
;Put 00 into W
MOVWF 06h
;to make all RB lines output
BCF 03,5
;Go to Page0 for programming
GOTO Main
Table1 ADDWF 02h,1 ;Add W to Program Counter
RETLW 3Eh
;0
RETLW 41h
RETLW 41h
RETLW 41h
RETLW 3Eh
RETLW 00h
;1
RETLW 10h
RETLW 20h
RETLW 7Fh
RETLW 00h
RETLW 27h
;2
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 31h
RETLW 22h
;3
RETLW 41h
RETLW 49h
RETLW 49h
RETLW 36h
RETLW 0Ch
;4
RETLW 14h
RETLW 24h
RETLW 7Fh
RETLW 04h
RETLW 7Ah
;5
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 46h
RETLW 3Eh
;6
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 26h
RETLW 40h
;7
RETLW 47h
RETLW 48h
RETLW 50h
RETLW 60h
RETLW 36h
;8
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 36h
RETLW 32h
;9
RETLW 49h
RETLW 49h
RETLW 49h
RETLW 3Eh
RETLW 00h
;Ghost routine transfers data from the Ghost files to the Video Screen
; and scans the Video Screen ONCE
Ghost BSF 05,1 ;Reset 4017
NOP
BCF 05,1
MOVF 11h,0
;Move the data from the
MOVWF 06h
; Ghost files to
CALL DelA
; the output port
MOVF 12h,0
; and call a Delay so the
MOVWF 06h
; LED can be illuminated
CALL DelA
MOVF 13h,0
MOVWF 06h
CALL DelA
MOVF 14h,0
MOVWF 06h
CALL DelA
MOVF 15h,0
MOVWF 06h
CALL DelA
RETURN
DelA DECFSZ 1Bh,1
GOTO DelA
MOVLW 00h
MOVWF 06
Clk BCF 05,0
;Clock the 4017 to the
NOP
; next output
BSF 05,0
RETURN
;"FillGh" Fill moves 5 bytes of data from Table1 to
; to Ghost area via Indirect Addressing
FillGh MOVLW 05
MOVWF 18h
;5 cycles of Loading
MOVLW 11h
MOVWF 04
;Move start of Ghost locations to FSR
FillGh2 MOVF 17h,0 ;Move table pointer to W
CALL Table1
MOVWF 00
;Move W to INDF (move into what FSR looks at)
INCF 04h,1
;Increment the FSR to look at next file
INCF 17h,1
DECFSZ 18h,1
GOTO FillGh2
RETURN
;MAIN ROUTINE
Main MOVLW 00
MOVWF 17h
;Load Table1 pointer with 00
CALL FillGh
;Put "0" on Screen
Main1 BCF 1E,5
Main2 CALL Ghost
;Display whatever is in Ghost files
BTFSC 05h,2
;Test for buttonA
GOTO Main3
;Pushed
GOTO Main1
;Not pushed
Main3 BTFSC 1E,5
GOTO Main2
MOVF 17h,0
;Has pointer reached end of table?
XORLW 32h
;End of Table is 32h bytes.
BTFSS 03,2
;Test the zero flag
GOTO
Main4
MOVLW 00
MOVWF 17h
Main4 CALL FillGh
;No. Put next number on screen
BSF 1E,5
;Set the button flag
GOTO Main2
END
|
|
|
The block of numbers
below is the HEX file for Experiment-13. Copy and paste it into a
text program such as TEXTPAD or NOTEPAD and call it: Expt-13.hex
|
|
|
:1000000083160C3085000030860083126228820738
:100010003E344134413441343E34003410342034D1
:100020007F3400342734493449344934313422345C
:1000300041344934493436340C34143424347F3454
:1000400004347A3449344934493446343E344934EA
:1000500049344934263440344734483450346034C9
:1000600036344934493449343634323449344934E5
:1000700049343E3400348514000085101108860090
:100080004E20120886004E20130886004E201408C9
:1000900086004E20150886004E2008009B0B4E2837
:1000A0000030860005100000051408000530980097
:1000B00011308400170807208000840A970A980BE3
:1000C0005A2808000030970056209E123B20051D3C
:1000D0006A2865289E1A66281708323A031D722876
:0A00E0000030970056209E16662897
:00000001FF |
EXPERIMENT-14
Two Digit UP-COUNTER
This experiment adds more features to the
counter series. Since we can only display one digit at a time, we have a
choice as to how two digits can be displayed.
1. Digits can be squashed up and alternated on the screen,
2. Digits can be scrolled onto the screen.
3. Standard-size digits can be flashed on the screen.
As you may have guessed, we will take the most difficult path - digits
squashed-up and alternated on the screen. All digits can be reduced in width
by one column with the 10's digit on the left-hand side and the units on the
right-hand side. This adds to a viewability of the display.
The table has been created from the digits in the diagram above and
generally the middle column has be removed.
This experiment also adds a new concept to programming. There is one point
you have to remember. You have to know how
the program runs to be able to understand each routine.
Even a person producing a program must compile a description of how the
programs to help in case the program need refinements at a later date.
Every program is structured differently and you need to know how it has been
put together.
In our case, the approach is new. It's simpler than before but the program
is longer because there are more things that have to be done.
The program begins by putting 00 on the screen. The instructions
for this are the first 3 in Main. The program then constantly
loops Main doing the following 4 things:
1. It puts the first digit on the screen - the 10's digit, and loops around
this routine to create a delay so the digit can be seen.
2. It blanks the screen by calling a delay
3. It turns on the right-hand digit (the "1's") and loops to show
digit.
4. It blanks the screen for a longer period of time to indicate end of the number.
The routine then repeats.
During each of the loops the program looks to see if button A is pressed. If
it is pressed, the program checks to see if it is the first pass.
The program then sets the button flag (bit5 in file 1E) and calls the
"00 to 99" counter routine.
This routine increments the units digit and also the
pointer that looks at Table1. The program then check to see if the file is
10. Ten is equal to 0A and by testing bits 1 and 3, it is able to determine
if ten has been reached. If it has, the program zero's the file and zero's
the pointer for table1 and increments the 10's file. The 10's file is also
tested to see when it reaches ten, so that the maximum readout is 99 and
then the numbers start again at
00.
A couple of additional features called "housekeeping" have to be included
in the program. One is the pointer for the Table. Each digit has to
have its own pointer and this points to the first byte of the digit. After
the first pass of the program this pointer will be incremented and so the
pointer has to be passed to another temporary file that can be incremented
during each pass without affecting the main pointer.
The other housekeeping feature is switch debounce (also called switch
repeat). To prevent a switch repeating or bouncing, the program must set a
button flag after the first time the switch is detected. This is because the
program will come around to the same instructions in a fraction of a
second! After the instruction, the program will have instructions for the
switch to carry out. The next time the micro detects the switch, it
will come to an instruction to test the flag. This instruction must appear
BEFORE the SET instruction and it will steer the micro away from carrying
out the switch instructions.
When the button is released, the micro will will carry out and instruction
to CLEAR the switch flag. It sounds simple but the three instructions must
be placed in the right places in a program for them to work.
The remaining two sub-routines LHD and RHD, put the digits on the screen. Each routine
performs one pass of the screen
For the left-hand digit, the first 4 columns are taken from Table1 and the 5th column is blank.
The data for each column is obtained from the "CALL Table1" instruction. This
instruction requires the "jump" value to be placed in W before
executing the CALL Table1 instruction. At the end of the instruction, W
contains the Table value and this can be moved to the output port. If a
Delay routine is called, the column will be seen on the screen. This is how
the 5 columns are displayed and the program returns to Main.
The same happens with the right-hand digit, but this time the 1st column is
blank.
Note that the table pointer must be incremented 4 times to look at the next
digit.
It's fairly simple programming but some of the routines are very clever.
The flow-Chart below shows the operation of the Main routine:
|
Experiment-14
for "5x7 Display" Project
;PIC16F84 and only F84 chip
; 0-99 Up Counter
Start ORG 0x00
BSF 03,5
;Go to page1 for setting-up the ports
MOVLW 0Ch ;Put 0C into W
MOVWF 05h ; to make RA2 & RA3 input
MOVLW 00h ;Put 00 into W
MOVWF 06h ;to make all RB lines output
BCF 03,5
;Go to Page0 for programming
GOTO Main
Table1 ADDWF 02h,1
;Add W to Program Counter
RETLW 3Eh ;0
RETLW 41h
RETLW 41h
RETLW 3Eh
RETLW 00h ;1
RETLW 20h
RETLW 7Fh
RETLW 00h
RETLW 27h ;2
RETLW 49h
RETLW 49h
RETLW 31h
RETLW 22h ;3
RETLW 49h
RETLW 49h
RETLW 36h
RETLW 1Ch ;4
RETLW 24h
RETLW 7Fh
RETLW 04h
RETLW 7Ah ;5
RETLW 49h
RETLW 49h
RETLW 46h
RETLW 3Eh ;6
RETLW 49h
RETLW 49h
RETLW 26h
RETLW 40h ;7
RETLW 47h
RETLW 48h
RETLW 70h
RETLW 36h ;8
RETLW 49h
RETLW 49h
RETLW 36h
RETLW 32h ;9
RETLW 49h
RETLW 49h
RETLW 3Eh
RETLW 00h
;"LHD" Moves 4 bytes of data from Table1 plus a BLANK
; to output to produce Left-hand digit
; It scans the Video Screen ONCE
LHD BSF 05,1 ;Reset 4017
NOP
BCF 05,1
MOVF 17h,0 ;Copy 17h to W
MOVWF 23h ;17h copied to 23h for temp incrementing
MOVLW 04
MOVWF 18h ;4 cycles of Loading in count file 18h
LHD2 MOVF 23h,0
;Copy 23h to W
CALL Table1
MOVWF 06h
CALL Del
INCF 23h,1
DECFSZ 18h,1
GOTO LHD2
MOVLW 00 ;Last column is blank as numbers are squashed.
MOVWF 15h
CALL Del
RETURN
RHD BSF 05,1
;Reset 4017
NOP
BCF 05,1
MOVLW 00 ;First column is blank as numbers are squashed.
MOVWF 06h
CALL Del
MOVF 19h,0 ;Copy 19h to W
MOVWF 24h ;19h copied to 24h for temp incrementing
MOVLW 04
MOVWF 18h ;4 cycles of Loading in count file 18h
RHD2 MOVF 24h,0
;Copy 23h to W
CALL Table1
MOVWF 06h
CALL Del
INCF 24h,1
DECFSZ 18h,1
GOTO RHD2
RETURN
Del DECFSZ 1Bh,1
GOTO Del
MOVLW 00h
MOVWF 06
Clk BCF 05,0
;Clock the 4017 to the
NOP
; next output
BSF 05,0
RETURN
Delay MOVLW 04
MOVWF 1B
Delay1 DECFSZ 1Ah,1
;Delay for main program for scanning
GOTO Delay1
DECFSZ 1B,1
GOTO Delay1
RETURN
;00 to 99 COUNTER
OOto99 INCF 22h,1
INCF 19h,1
INCF 19h,1
INCF 19h,1
INCF 19h,1
BTFSS 22h,1 ;Bits 1 & 3 make up the number 10!
RETURN
BTFSS 22h,3
RETURN
;File 22h is not 10!
MOVLW 00
MOVWF 22h
;Zero the digits file
MOVWF 19h
;Zero the pointer for RHD
INCF 21h,1
INCF 17h,1
INCF 17h,1
INCF 17h,1
INCF 17h,1
BTFSS 21h,1
RETURN
BTFSS 21h,3
RETURN
;File 21h is not 10!
MOVLW 00
MOVWF 21h
;Zero file 21h
MOVWF 17h
;Zero the pointer for LHD
RETURN
SwA BTFSC 05h,2
;Test for buttonA
GOTO SwA1
;Pushed
GOTO SwA2
;NOT pushed
SwA1 BTFSC 1E,5
;First time for press A?
RETURN
BSF 1E,5
;Set the button flag
CALL OOto99
;Increment count
RETURN
SwA2 BCF 1E,5
RETURN
;MAIN ROUTINE
Main MOVLW 00
MOVWF 21h
;21h is units file. Start=0
MOVWF 22h
;22h is 10's file. Start=0
MOVWF 17h
;1's pointer in table1
MOVWF 19h
;10's pointer in table1
Main1 MOVLW 60h
;Delay to show LHD
MOVWF 1Ch
Main2 CALL LHD
CALL SwA
DECFSZ 1Ch,1
GOTO Main2
MOVLW 10h
;Delay after first digit is displayed
MOVWF 1Ch
Main3 CALL Delay
CALL SwA
DECFSZ 1Ch,1
GOTO Main3
MOVLW 60h
;Delay to show RHD
MOVWF 1Ch
Main4 CALL RHD
CALL SwA
DECFSZ 1Ch,1
GOTO Main4
MOVLW 0A0h
;Delay after RHD
MOVWF 1Ch
Main5 CALL Delay
CALL SwA
DECFSZ 1Ch,1
GOTO Main5
GOTO Main1
;Repeat routine
END
|
How the numbers appear on the screen
|
|
The block of numbers
below is the HEX file for Experiment-14. Copy and paste it into a
text program such as TEXTPAD or NOTEPAD and call it: Expt-14.hex
|
|
|
:1000000083160C3085000030860083128728820713
:100010003E34413441343E34003420347F340034A3
:10002000273449344934313422344934493436345C
:100030001C3424347F3404347A344934493446340B
:100040003E344934493426344034473448347034DB
:1000500036344934493436343234493449343E3400
:1000600000348514000085101708A30004309800A0
:100070002308072086005520A30A980B3828003053
:10008000950055200800851400008510003086007A
:1000900055201908A4000430980024080720860081
:1000A0005520A40A980B4D2808009B0B55280030BA
:1000B0008600051000000514080004309B009A0B10
:1000C0005F289B0B5F280800A20A990A990A990ADF
:1000D000990AA21C0800A21D08000030A200990085
:1000E000A10A970A970A970A970AA11C0800A11D5E
:1000F00008000030A10097000800051D8028852811
:100100009E1A08009E16642008009E120800003007
:10011000A100A2009700990060309C0031207D2052
:100120009C0B8E2810309C005D207D209C0B942819
:1001300060309C0043207D209C0B9A28A0309C00BE
:0A0140005D207D209C0BA0288C2878
:00000001FF
|
Go to the next page of experiments:
5x7
EXPERIMENTS: Page-6
|