/* Count switch pressings and display on 7-segment display. If the PIC detects the switch in the ON position, increment the counter and check again after 1 second, if it is still in the ON position, wait till it goes to the OFF then after 0.5 seconds check for an ON condition to increment the counter and repeat till the counter reaches 5 then put high on pin RA1, when it reaches 7 put low on RA1 and high on pin RA2, and when it reaches 8, clear the counter and turn off pin RA2. Write the code in C language, test it on the simulator when you are sure that it is working properly burn it on the chip and put it in the circuit and verify that it is functioning correctly. Number of key presses should be displayed on seven segment display. Note that Flasher.asm and Flasher1i.asm contain Delay routines. RB0 to RB3 of PORTB will be used to drive the 7-segment display through 7448. RA0 for reading the switch while RA1 and RA2 for writing to the LEDs. */ #include "16f84a.h" #use delay (clock=4000000) // 4MHz crystal int1 a0, a1, a2; int a, b; void main() { set_tris_a(0x01); // pins RA0 for i/p, and RA1 and RA2 for o/p set_tris_b(0x00); // pins 0 to 7 of port B are outputs b=0; output_B(b); // clear port B while(1) { if (input(pin_a0)==1) // read the switch connected to RA0 { b++; // increment b output_B(b); // write to 7-segment display if (b==5) output_bit(pin_a1,1); // if b=7 set RA1=1 if (b==7) {output_bit(pin_a1,0); output_bit(pin_a2,1);} // if b=9 set RA1=0 and RA2=1 if (b==8) {output_bit(pin_a2,0); b=0; output_B(b);} // if b=11 => RA2=0, clr counter delay_ms(1000); // wait for 1 second } while (input(pin_a0)==1) {}; // wait until a0 goes down if ((b > 0) & input(pin_a0)==0) delay_ms(500); // now RA0 is off, wait for 0.5 second } } Figure 1: Connect RB3, RB2, RB1, RB0 to pins 6, 2, 1, 7 of 7448 BCD to 7-segment display driver, then pins 9, 10, 11, 12, 13, 15, 14 of 7448 to pins 1, 2, 3, 4, 5, 6, 7 (a, b, c, d, e, f, g) of the common cathode 7-segment display. Connect 470 Ω between pin 8 of the display and the ground 1 ; Lab3-retlw.ASM for 16F84. ; read RA3...RA0 and display on PORTB ... to Common cathode 7seg dispaly ; Usage of PIC 16F84 instructions. ;********************************************************* #include "p16f84.inc" ; EQUATES SECTION num equ 0x0c ;b=NUMBER to be displayed on 7seg ;********************************************************* LIST P=16F84 ; we are using the 16F84. ORG 0 ; org address in memory is 0 GOTO START ; goto start of program (jump over subroutines) ;********************************************************************** ; Configuration Bits __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;H’3FF1’ ;********************************************************* ;SETUP SECTION START: BSF STATUS,RP0 ;Turns to Bank1. MOVLW B’00001111’; bit 0 TO 3 of PORTA as I/P MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ;PORTB as OUTPUT ; BCF STATUS,RP0 ;Return to Bank0. CLRF PORTB ;Clears PortB. ;********************************************************* ;Program starts now. ;ADD NUMBERS FROM LOCATION TABLE AND STORE ;THE RESULT IN PORTB. USE INDIRECT ADDRESSING FOR READING. BEGIN: movf PORTA,W ; W <- PORTA (hex digit) CALL MAP ; get from MAP the 7seg display code MOVWF PORTB ; Output number to display. GOTO BEGIN ; repeat always ; MAP: ADDWF PCL RETLW 0x3f ; 0 RETLW 0x06 ; 1 RETLW 0x5b ; 2 RETLW 0x4f ; 3 RETLW 0x66 ; 4 RETLW 0x6d ; 5 RETLW 0x7d ; 6 RETLW 0x07 ; 7 RETLW 0x7f ; 8 RETLW 0x6f ; 9 RETLW b’01110111’; A RETLW b’01111100’; b RETLW b’01011000’; c RETLW b’01011110’; d RETLW b’01111001’; E RETLW b’01110001’; F ; END 2 Interface without 7448 BCD to 7segment driver /* Lab3.c Count switch pressings and drectly display on 7-segment display-Common cathode. If the PIC detects the switch in the ON position, increment the counter and check again after 0.5 second, if it is still in the ON position, wait till it goes to the OFF then after 0.5 seconds check for an ON condition to increment the counter and repeat till the counter reaches 5 then put high on pin RA1, when it reaches 7 put low on RA1 and high on pin RA2, and when it reaches 14 (=0xE), clear the counter and turn off pin RA2. Write the code in C language, test it on the simulator when you are sure that it is working properly burn it on the chip and put it in the circuit and verify that it is functioning correctly. Number of key presses should be displayed on seven segment display. Note that Flasher.asm and Flasher1i.asm contain Delay routines. RB0 to RB6 (7-segment) of PORTB will be used to drive the 7-segment display directly. RA0 for reading the switch while RA1 and RA2 for writing to the LEDs. */ #include "16f84a.h" #use delay (clock=4000000) // 4MHz crystal int b; int map[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0b01110111, 0b01111100, 0b01011000, 0b01011110, 0b01111001, 0b01110001}; // 0..0xF void main() { set_tris_a(0x11); // pins RA0 for o/p, and RA1 and RA22 for o/p set_tris_b(0x00); // pins 0 to 7 of port B are outputs b=0; output_B(map[b]); // clear port B while(1) { if (input(pin_a0)==1) // read the switch connected to RA0 { b++; output_B(map[b]); // write to 7-segment display if (b==5) output_bit(pin_a1,1); // if b=7 set RA1=1 if (b==7) {output_bit(pin_a1,0); output_bit(pin_a2,1);} // if b=9 set RA1=0 and RA2=1 if (b==0xe) {output_bit(pin_a2,0); b=0; output_B(map[b]);} delay_us(1); // wait for 1u second-Oshon simulator and 500m sec fo hardware } while (input(pin_a0)==1) {}; // wait until a0 goes down if ((b > 0) & input(pin_a0)==0) delay_us(1); // now RA0 is off, wait for 0.5 second } } and in Assembly language 3