Up to now, each of the programs has run as soon as the power was applied to the circuit.
In this section we add 3 push-buttons.
Push-buttons can also be called “Keys” or “input Devices” and to make sure they will be be read instantly, it is important they are “poled” (scanned) on a regular basis.
This involves putting the “Buttons” in a place where the micro is passing very often. A suitable position is inside a delay routine.
Adding push-buttons to a project gives you the capability of selecting, starting or stopping a routine as well as calling one up at any time during the running of another routine.
Writing the code for a set of push buttons can be quite complex as there are a number of things that must be taken into account, to get a push-button to work correctly.
The main problem is DEBOUNCING the button.
Suppose you are using a button to increment a number on a display. When the button is pressed, the program increments the display and returns to scan the button again. This all happens very quickly and the program thinks the button has been pushed again, so the display is incremented once more.
The micro generally goes through a routine so fast that the display can get incremented lots of times before you have time to release the button.
To prevent this from happening, the micro must look to see if the button has been released before another increment can occur.
But there’s still one more feature that has to be included in the program.
When the button is pushed, the contacts make and break a number of times before finally making contact.
The micro sees this as a number of presses and the counter can be advanced a number of counts on a single press.
This also occurs when the button is being released. In some of the experiments, you can see the effect of switch-bounce by pressing and releasing the button very slowly. The counter will count more than one digit or an animation will appear on the screen two times.
To prevent this, the program must have a “loop counter” or delay so that only one count is recorded in say 1/10th of a second.
This is called fully debouncing the switch and this type of routine should be included in all programs to prevent any type of “double-counting.”
The next series of programs in this test section will show how to interface a push-switch to a LED and test it.
The circuit diagram for the project is shown below so you can see how the push-buttons are connected to the microcontroller. When the button is not pressed, the input line sees a LOW. When the button is pressed, the input line sees a HIGH.
SWITCH PROGRAM-1
This program turns on a LED on the display when buttonA is pressed.
In this program there is no debouncing. The program sets up the ports with PortA as input and PortB as output. The program then loops around (poles) the switch looking for a keypress. The program then turns on a LED and loops.
There is an important point to note with the program.
For the 3rd, 4th, 5th and 6th instructions, the program is accessing a special bank of registers that are in a different part of the microcontroller to the programming and port files. We get into the “special section” via the instruction BSF 03,5 and get out of the “special section” via BCF 03,5.
The instruction on line 6: MOVLW 06h moves the “value in W” into a register called the IN/OUT CONTROL REGISTER. This register is called 06 and is not the register we call the PORT REGISTER.
The 8th instruction seems to do the same thing. BUT IT DOESN’T.
The micro has come out of page1 and is in the programming page. The programming page is Page0.
The 8th instruction takes the value in W (we put 00 into W in the 5th instruction) and put it into file 06. We call file 06 PORTB REGISTER. This time file 06 is PortB and the instruction will make all outputs of portB LOW.
The program only works once. You have to turn the power off and on again to re-test the program.
;PIC16F84 and only F84 chip
;Detects ButtonA and illuminates a LED
Start ORG 0x00 BSF 03,5 ;Go to page1 for setting IN/OUT MOVLW 1Ch ;Make RA2, RA3 and RA4 inputs MOVWF 05h MOVLW 00h ;Put 00 into W MOVWF 06h ;Make all RB lines output BCF 03,5 ;Go to Page0 for programming MOVWF 06h ;Put 00 into output port to turn off all LEDs Loop1 BTFSS 05,2 ;Test button A GOTO Loop1 ; line is LOW Loop2 MOVLW 01h ;Line is HIGH. Put 1 into W MOVWF 06h ;output 1 to the display GOTO Loop2 ;do-nothing in a loop END
The block of numbers below is the HEX file for Switch 1. Copy and paste it into a text program such as TEXTPAD or NOTEPAD and call it: Switch-1.hex
:1000000083161C3085000030860083128600051997 :080010000728013086000928D1 :00000001FF
The next program: Switch-2, is also a very simple program. It tests buttons A, B, C and puts a LED on the screen for each button.
;PIC16F84 and only F84 chip ;Detects Buttons A, B and C and illuminates LEDs
Start ORG 0x00 BSF 03,5 MOVLW 1Ch ;Make RA2, RA3 and RA4 inputs MOVWF 05h MOVLW 00h ;Put 00 into W MOVWF 06h ;Make all RB lines output BCF 03,5 ;Go to Page0 for programming MOVWF 06h ;Put 00 into output port to turn off all LEDs Loop1 BTFSS 05,2 ;Test button A to see if line is HIGH GOTO Loop2 ; MOVLW 01h ;Put 1 into W to turn on lower LED MOVWF 06h ;output 1 to the display Loop2 BTFSS 05,3 ;Test button B to see if line is HIGH GOTO Loop3 MOVLW 08h ;Put 08 into W to turn on middle LED MOVWF 06h ;Output 08 to display Loop3 BTFSS 05,4 ;Test button C to see if line is HIGH GOTO Loop1 MOVLW 40h ;Put 40h into W to turn on top LED MOVWF 06h GOTO Loop1 ;Loop all the switches again END
The block of numbers below is the HEX file for Switch 2. Copy and paste it into a text program such as TEXTPAD or NOTEPAD and call it: Switch-2.hex
:1000000083161C3085000030860083128600051997 :100010000B280130860085190F2808308600051A44 :08002000072840308600072884 :00000001FF
Switch-3 Program has debounce. It detects the 3 switches and puts a flashing LED on the screen for each switch. To do this requires a lot of programming. The micro has to scan the keys, toggle the LEDs ON or OFF and flash the LEDs.
;PIC16F84 and only F84 chip
;Detects Buttons A, B and C (with debounce) and flashes LEDs
Start ORG 0x00 BSF 03,5 MOVLW 1Ch ;Make RA2, RA3 and RA4 inputs MOVWF 05h MOVLW 00h ;Put 00 into W MOVWF 06h ;Make all RB lines output BCF 03,5 ;Go to Page0 for programming MOVWF 06h ;Put 00 into output port to turn off all LEDs MOVWF 1Dh ;zero the debounce file MOVWF 1Eh ;Zero the flag file Scan1 MOVLW 0FFh MOVWF 1Ah MOVLW 080h MOVWF 1Bh Scan2 BTFSC 05,2 ;Test if Button A pressed. (Not pressed, line = LOW) GOTO AA ;Button A is pressed BTFSS 1E,5 ;A not pressed. Check to see if flag bit 5 is SET GOTO Scan3 ;Not SET MOVF 1Dh,0 ;Bit 5 SET. Copy 1D into W XORLW 00 BTFSC 03,2 ;Is file 1D = 0? GOTO Scan5 ;Debounce file is zero DECFSZ 1Dh,1 ;Decrement debounce file GOTO Scan5 BCF 1E,5 Scan3 BTFSC 05,3 ;Test if button B pressed GOTO BB ;B pressed BTFSS 1E,6 ;B not pressed. Check to see if flag bit 6 is SET GOTO Scan4 ;Not SET MOVF 1Dh,0 ;Bit 6 SET. Copy 1D into W XORLW 00 BTFSC 03,2 ;Is file 1D = 0? GOTO Scan5 ;Debounce file is zero DECFSZ 1Dh,1 ;Decrement debounce file GOTO Scan5 BCF 1E,6 Scan4 BTFSC 05,4 ;Test if button C pressed. GOTO CC ;C pressed BTFSS 1E,7 ;C not pressed. Check to see if flag bit 7 is SET GOTO Scan5 ;Not SET MOVF 1Dh,0 ;Bit 7 SET. Copy 1D into W XORLW 00 BTFSC 03,2 ;Is file 1D = 0? GOTO Scan5 ;Debounce file is zero DECFSZ 1Dh,1 ;Decrement debounce file GOTO Scan5 BCF 1E,7 Scan5 NOP Del1 DECFSZ 1Ah,1 ;Delay section GOTO Del1 DECFSZ 1Bh,1 GOTO Scan2 BTFSS 1E,2 ;Test for LED A active GOTO Scan8 MOVLW 01 XORWF 06h,1 ;Toggle LED A Scan6 BTFSS 1E,3 ;Test for LED B active GOTO Scan9 MOVLW 08 XORWF 06h,1 ;Toggle LED B Scan7 BTFSS 1Eh,4 ;Test for LED C active GOTO Scan10 MOVLW 40h XORWF 06h,1 ;Toggle LED C GOTO Scan1 Scan8 BCF 06h,0 GOTO Scan6 Scan9 BCF 06h,3 GOTO Scan7 Scan10 BCF 06h,6 GOTO Scan1 AA MOVLW 00 XORWF 1D,0 ;Is 1D = 0? BTFSS 03,2 GOTO Scan5 ;1D is not zero BSF 1E,5 ;1D is zero. Put a flag in 1E for button A MOVLW 04h ;Toggle LED A ON/OFF XORWF 1E,1 MOVLW 10h ;Put 10h into debounce file 1D MOVWF 1Dh GOTO Scan5 BB MOVLW 00 XORWF 1D,0 ;Is 1D = 0? BTFSS 03,2 GOTO Scan5 ;1D is not zero BSF 1E,6 ;1D is zero. Put a flag in 1E for button B MOVLW 08h ;Toggle LED B ON/OFF XORWF 1E,1 MOVLW 10h ;Put 10h into debounce file 1D MOVWF 1Dh GOTO Scan5 CC MOVLW 00 XORWF 1D,0 ;Is 1D = 0? BTFSS 03,2 GOTO Scan5 ;1D is not zero BSF 1E,7 ;1D is zero. Put a flag in 1E for button C MOVLW 10h ;Toggle LED C ON/OFF XORWF 1E,1 MOVLW 10h ;Put 10h into debounce file 1D MOVWF 1Dh GOTO Scan5 END
The block of numbers below is the HEX file for Switch 3. Copy and paste it into a text program such as TEXTPAD or NOTEPAD and call it: Switch-3.hex
:1000000083161C30850000308600831286009D0018 :100010009E00FF309A0080309B00051D46289E1EE2 :1000200018281D08003A03192E289D0B2E289E1211 :10003000851D50281E1F23281D08003A03192E284D :100040009D0B2E281E13051E5A289E1F2E281D08A4 :10005000003A03192E289D0B2E289E1300009A0BA0 :100060002F289B0B0D281E1D4028013086069E1D43 :100070004228083086061E1E44284030860609287D :100080000610372886113B280613092800301D0664 :10009000031D2E289E1604309E0610309D002E282B :1000A00000301D06031D2E281E1708309E06103036 :1000B0009D002E2800301D06031D2E289E1710308F :0800C0009E0610309D002E2861 :00000001FF
All the testing has now been done. We have checked the wiring of the microcontroller to the LEDs, the scanning provided by the 4017 chip, the connection of the buttons and the debounce routine. We are now ready for the REAL THING! The programs for the 5x7.
The 5x7 is like a beautifully-bound BLANK notebook. In it you can write anything you like. It can be a murder mystery, poem, short story or complete novel.
Exactly the same applies with this project. You can write one program, 10 programs, add more input or output devices, or join it up with other modules to create a larger screen.
In fact, almost anything is possible and although the screen is only 5 pixels wide by 7 pixels high, it represents a module or “window” that can be expanded to a “Las Vegas” billboard by simply adding more modules.
Without any more discussion, let’s go to the Programs Page: 5x7 EXPERIMENTS: Page-1.
Quick Links
Legal Stuff
Social Media