Hello everyone,
I'm looking for some tips, to enhance the code listed here to simplify with less code the "Select case'.
This code is for a PIC18F25K22 using PortC as a 64 switches matrix scan and PortB as the receiver and decoder and PortA to send the data.
Thanks for any comments.
Attachment 0Code:' PIC18F25K22 64 Keys Encoder ' File :"D:\PIC\PBP3\18F25K22\64 Keys Encoder\64 Keys Encoder.pbp" ' Date : Feb 13 2025 ' ' WPUB : p152 PORTB only ' PORTA : Flags ' PORTB : Row Input ' PORTC : Column Out ;----[18F25K22 Hardware Configuration]------------------------------------------ #CONFIG CONFIG FOSC = INTIO67 ; Internal oscillator block CONFIG PLLCFG = ON ; Oscillator used directly CONFIG PRICLKEN = OFF ; Primary clock can be disabled by software CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled CONFIG IESO = OFF ; Oscillator Switchover mode disabled CONFIG PWRTEN = OFF ; Power up timer disabled CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled) CONFIG BORV = 190 ; VBOR set to 1.90 V nominal CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect CONFIG WDTPS = 32768 ; 1:32768 CONFIG CCP2MX = PORTC1 ; CCP2 input/output is multiplexed with RC1 CONFIG PBADEN = OFF ; PORTB<5:0> pins are configured as digital I/O on Reset CONFIG CCP3MX = PORTB5 ; P3A/CCP3 input/output is multiplexed with RB5 CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status CONFIG T3CMX = PORTC0 ; T3CKI is on RC0 CONFIG P2BMX = PORTB5 ; P2B is on RB5 CONFIG MCLRE = INTMCLR ; MCLR pin enabled, RE3 input pin disabled CONFIG STVREN = ON ; Stack full/underflow will cause Reset CONFIG LVP = OFF ; Single-Supply ICSP disabled CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode) CONFIG DEBUG = OFF ; Disabled CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected CONFIG CPD = OFF ; Data EEPROM not code-protected CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected CONFIG WRTD = OFF ; Data EEPROM not write-protected CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks CONFIG EBTRB = OFF ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks #ENDCONFIG define OSC 64 ' OSC 64Mhz ANSELA = 0 ' Set all digital ANSELB = 0 ' Set all digital ANSELC = 0 ' Set all digital WPUB = $FF ' Set Weak PullUP PORTB only 'CMCON0 = 7 TRISA = 000000 ' PORTA Key Output TRISB = 111111 ' PORTB Intput Keypad Rows in TRISC = 000000 ' PORTC Output Keypad Column out TRISE = 001000 ' PORTE.3 MCLRE as input '1' other output '0' OSCCON = $70 ' Internal OSC p:30 OSCTUNE = $40 ' for 64Mhz FOSC p:35 Latch1 var byte ' Latch1 Flag Latch1 = 0 LRShift VAR BIT ' Shift Direction Flag LRSHIFT = 0 TTL VAR WORD 'Key val TTL = 0 TTLadd var word ' adding to PORTC val ttladd = 0 PORTKey var byte ' Key data portkey = 0 Baud var word ' Serout2 Baud Rate Baud = 84 'Baud = 16468 PORTB = 0 ' PORTB set to 0 Keypad Row PAUSE 10 PORTC = 000001 ' Keypad Column out to Row PORTB PORTA.0 = 1 ' serial port = 1 'avoid random data' PORTA.1 = 0 ' Data Available MAIN: ' Main Routine PAUSE 1 ' needed for PORTC > PORTB Data transfert LATB = PORTB ' Needed to use the value of PORTB ' Output Data to PORTC IF PORTB > 0 AND Latch1 = 0 THEN Latch1 = 1 LATC = LATB PAUSE 5 ' prevent duplicate IF PORTC = 1 THEN TTLADD = 0 endif IF PORTC = 2 THEN TTLADD = 128 endif IF PORTC = 4 THEN TTLADD = 384 endif IF PORTC = 8 THEN TTLADD = 512 endif IF PORTC = 16 THEN TTLADD = 640 endif IF PORTC = 32 THEN TTLADD = 758 endif IF PORTC = 64 THEN TTLADD = 896 endif IF PORTC = 128 THEN TTLADD = 1024 endif ' prevent duplicate TTL = TTLADD + PORTB ' Select PORTKkey val Select Case ttl case 1 portkey = 1 : goto P case 2 portkey = 2 : goto P case 4 portkey = 3 : goto P case 8 portkey = 4 : goto P case 16 portkey = 5 : goto P case 32 portkey = 6 : goto P case 64 portkey = 7 : goto P case 128 portkey = 8 : goto P case 129 portkey = 9 : goto P case 130 portkey = 10 : goto P case 132 portkey = 11 : goto P case 136 portkey = 12 : goto P case 144 portkey = 13 : goto P case 160 portkey = 14 : goto P case 192 portkey = 15 : goto P case 256 portkey = 16 : goto P case 385 portkey = 17 : goto P case 386 portkey = 18 : goto P case 388 portkey = 19 : goto P case 392 portkey = 20 : goto P case 400 portkey = 21 : goto P case 416 portkey = 22 : goto P case 448 portkey = 23 : goto P case 512 portkey = 24 : goto P case 513 portkey = 25 : goto P case 514 portkey = 26 : goto P case 516 portkey = 27 : goto P case 520 portkey = 28 : goto P case 528 portkey = 29 : goto P case 544 portkey = 30 : goto P case 576 portkey = 31 : goto P case 640 portkey = 32 : goto P case 641 portkey = 33 : goto P case 642 portkey = 34 : goto P case 644 portkey = 35: goto P case 648 portkey = 36 : goto P case 656 portkey = 37 : goto P case 672 portkey = 38 : goto P case 704 portkey = 39 : goto P case 768 portkey = 40 : goto P case 759 portkey = 41 : goto P case 760 portkey = 42 : goto P case 762 portkey = 43 : goto P case 766 portkey = 44 : goto P case 774 portkey = 45 : goto P case 790 portkey = 46 : goto P case 822 portkey = 47 : goto P case 886 portkey = 48 : goto P case 897 portkey = 49 : goto P case 898 portkey = 50 : goto P case 900 portkey = 51 : goto P case 904 portkey = 52 : goto P case 912 portkey = 53 : goto P case 928 portkey = 54 : goto P case 960 portkey = 55 : goto P case 1024 portkey = 56 : goto P case 1025 portkey = 57 : goto P case 1026 portkey = 58 : goto P case 1028 portkey = 59 : goto P case 1032 portkey = 60 : goto P case 1040 portkey = 61 : goto P case 1056 portkey = 62 : goto P case 1088 portkey = 63 : goto P case 1152 portkey = 64 : goto P end select ' Select PORTKkey val P: pause 10 PORTA.1 = 1 ' Data Available 'SEROUT2 PORTA.0,Baud,[dec3 LATC," PORTC Bin: ", bin8 LATC,13,10] ' SW PORTC Column to PORTB Row 'SEROUT2 PORTA.0,Baud,[dec3 LATB," PORTB Bin: ", bin8 LATB," DEC TTL : ",DEC5 TTL," BIN TTL: ",BIN16 TTL,13,10] ' SW PORTB Row from PORTC Column sEROUT2 PORTA.0,Baud,[" PORTB Dec :",dec3 LATB," PORTB Bin: ", bin8 LATB," TTL Dec : ",DEC4 TTL," TTL Bin : ",BIN16 TTL," Port Key: ",dec2 portkey," Port Key Bin : ",bin8 portkey,13,10] ENDIF ' Wait for Key Release WHILE PORTB > 0 WEND ' Reset Flag latch1 = 0 ' Latch1 PORTA.1 = 0 ' Data Available LATC = 0 ' LATC TTL = 0 pause 50 ' Debounce pause ' Shift Direction Flag IF PORTC = 1 THEN lrshift = 0 endif IF PORTC = 128 THEN lrshift = 1 endif ' Shift PORTC if lrshift = 0 then PORTC = PORTC << 1 ' Shift Left endif if lrshift = 1 then PORTC = PORTC >> 1 ' Shift Right ENDIF goto main ' restart loop
Attachment 0
![]()


Reply With Quote



Bookmarks