Purpose: Using the embedded controller to input and sort ten binary integers, then display the lowest, highest and average on an LCD.
Objective: This workshop is designed to familiarize the student with elements of the embedded microcontroller.
Real world application: LCD output
Requirements:
Hardware: Scott Edwards Electronics LCD, DIP switch
Software commands: Call clr_pa4, Call tst_pa4, Serout ?, N2400, (#b?)
Procedure: Create a program that will take read ten integer into eeprom , then sort them, then display the sorted data on an LCD. Use a DIP switch to create a binary input on PB0-6. To set the input to an integer value of 17, PB0 and PB3 would have logic 1 input, all others would have a logic 0. To input a value 113, then PB0, 4,5,6 would be high and all others would be low. Store the ten integers into eeprom starting at address 1. Use PA4 signal when to take an input. When PA4 is high the integer input can be changed, cycling PA4 to logic 0 shall signal the program store the input, cycling the input back to logic 1 will allow the an integer input to be changed again.
After ten inputs are received the program will sort the data in ascending order and then display the data on the LCD as follows:
LCD line1:-> LOW#<lowest integer> AVG#<average integer
LCD line2:-> HIGH#<highest integer>
Hint: Use inverted RS-232 input to the LCD (output from Picstic)
Example: serout 7,N2400,(#b1)
Circuit Drawing for Workshop #7
PicBasic Code for Workshop #7
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'This program will take in 10 binary integers, store them in internal
'eeprom and sort them in ascending order. The lowest, highest and
'average values are then outputted to an LCD.
'Herb Wagner
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
b2 = 1: b1 = 0 'clear counter variables
dirs = %10000000 'set PB0-6 as inputs
'////////////////////////////////////////////////////////////////////////
begn: if b2 > 10 then sort
'test input counter > 10 sort the
'integers
b2 = b2 + 1 'increm. input
counter
set: call clr_pa4
'clear pa4
call tst_pa4
'take input from pa4
if bit1 = 1 then in
'check input, if 1 get numb
goto set
'////////////////////////////////////////////////////////////////////////
in: b1 = b1 + 1
'set eeprom address location
out: serout 7,N2400,(254,1) 'clear
LCD
b4 = pins
'read PB0 - 6 as binary integer value
write b1,b4
'store it into eeprom
serout 7,N2400,(#b4)
'display on LCD
pause 500
'pause 1/2 sec
call clr_pa4
'clear pa4
call tst_pa4
'take new input from pa4
if bit1 = 0 then begn
'check input, if 0 then get another
goto out
'repeat procedure
'/////////////////////////////////////////////////////////////////////////
'The following will sort the 10 integers in eeprom ... lowest at
'address 1, highest in address 10
sort: for b7 = 1 to 10
for b3 = 1 to 9
read b3,b4
b6 = b3 + 1
read b6,b8
if b8 < b4 then swop
nex: next b3
next b7
goto avg
swop: write b3,b8
write b6,b4
goto nex
'////////////////////////////////////////////////////////////////////////
'This code will compute the avg value of the 10 numbers stored in eeprom
avg: w9 = 0
for b2 = 1 to 10
read b2,b7
w9 = b7 + w9
next b2
b7 = w9 / 10
'////////////////////////////////////////////////////////////////////////
'The following lines will display the lowest value, the highest value
'and the average value on the LCD
display: serout 7,N2400,(254,1)
b3 = 1
read b3,b4
serout 7,N2400,("Low#:")
serout 7,N2400,(#b4)
serout 7,N2400,(" High#:")
b3 = 10
read b3,b4
serout 7,N2400,(254,192)
'carriage return
serout 7,N2400,(#b4)
serout 7,N2400,(" Avg#:")
serout 7,N2400,(#b7)
end
'////////////////////////////////////////////////////////////////////////
'Assembly subroutines to clear pa4 and pole pa4
asm
_clr_pa4 bcf porta,4
bsf status,5
bcf trisa,4
bcf status,5
goto done
_tst_pa4 bsf status,5
bsf trisa,4
bcf status,5
bcf _b0,1
btfsc porta,4
bsf _b0,1
goto done
endasm