Added keypad example

This commit is contained in:
Fernando 2025-05-07 08:53:30 -06:00
parent fa063aa081
commit b65be9a729
15 changed files with 3077 additions and 31 deletions

432
c/btest/main.asm Executable file
View File

@ -0,0 +1,432 @@
;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.5.0 #15242 (Linux)
;--------------------------------------------------------
; PIC16 port for the Microchip 16-bit core micros
;--------------------------------------------------------
list p=18f4550
radix dec
CONFIG XINST=OFF
CONFIG FOSC=HS
CONFIG WDT=OFF
CONFIG LVP=OFF
CONFIG MCLRE=OFF
;--------------------------------------------------------
; public variables in this module
;--------------------------------------------------------
global _setup
global _isr
global _main
global _sram_end
;--------------------------------------------------------
; extern variables in this module
;--------------------------------------------------------
extern _SPPCFGbits
extern _SPPEPSbits
extern _SPPCONbits
extern _UFRMLbits
extern _UFRMHbits
extern _UIRbits
extern _UIEbits
extern _UEIRbits
extern _UEIEbits
extern _USTATbits
extern _UCONbits
extern _UADDRbits
extern _UCFGbits
extern _UEP0bits
extern _UEP1bits
extern _UEP2bits
extern _UEP3bits
extern _UEP4bits
extern _UEP5bits
extern _UEP6bits
extern _UEP7bits
extern _UEP8bits
extern _UEP9bits
extern _UEP10bits
extern _UEP11bits
extern _UEP12bits
extern _UEP13bits
extern _UEP14bits
extern _UEP15bits
extern _PORTAbits
extern _PORTBbits
extern _PORTCbits
extern _PORTDbits
extern _PORTEbits
extern _LATAbits
extern _LATBbits
extern _LATCbits
extern _LATDbits
extern _LATEbits
extern _DDRAbits
extern _TRISAbits
extern _DDRBbits
extern _TRISBbits
extern _DDRCbits
extern _TRISCbits
extern _DDRDbits
extern _TRISDbits
extern _DDREbits
extern _TRISEbits
extern _OSCTUNEbits
extern _PIE1bits
extern _PIR1bits
extern _IPR1bits
extern _PIE2bits
extern _PIR2bits
extern _IPR2bits
extern _EECON1bits
extern _RCSTAbits
extern _TXSTAbits
extern _T3CONbits
extern _CMCONbits
extern _CVRCONbits
extern _CCP1ASbits
extern _ECCP1ASbits
extern _CCP1DELbits
extern _ECCP1DELbits
extern _BAUDCONbits
extern _BAUDCTLbits
extern _CCP2CONbits
extern _CCP1CONbits
extern _ECCP1CONbits
extern _ADCON2bits
extern _ADCON1bits
extern _ADCON0bits
extern _SSPCON2bits
extern _SSPCON1bits
extern _SSPSTATbits
extern _T2CONbits
extern _T1CONbits
extern _RCONbits
extern _WDTCONbits
extern _HLVDCONbits
extern _LVDCONbits
extern _OSCCONbits
extern _T0CONbits
extern _STATUSbits
extern _INTCON3bits
extern _INTCON2bits
extern _INTCONbits
extern _STKPTRbits
extern _SPPDATA
extern _SPPCFG
extern _SPPEPS
extern _SPPCON
extern _UFRM
extern _UFRML
extern _UFRMH
extern _UIR
extern _UIE
extern _UEIR
extern _UEIE
extern _USTAT
extern _UCON
extern _UADDR
extern _UCFG
extern _UEP0
extern _UEP1
extern _UEP2
extern _UEP3
extern _UEP4
extern _UEP5
extern _UEP6
extern _UEP7
extern _UEP8
extern _UEP9
extern _UEP10
extern _UEP11
extern _UEP12
extern _UEP13
extern _UEP14
extern _UEP15
extern _PORTA
extern _PORTB
extern _PORTC
extern _PORTD
extern _PORTE
extern _LATA
extern _LATB
extern _LATC
extern _LATD
extern _LATE
extern _DDRA
extern _TRISA
extern _DDRB
extern _TRISB
extern _DDRC
extern _TRISC
extern _DDRD
extern _TRISD
extern _DDRE
extern _TRISE
extern _OSCTUNE
extern _PIE1
extern _PIR1
extern _IPR1
extern _PIE2
extern _PIR2
extern _IPR2
extern _EECON1
extern _EECON2
extern _EEDATA
extern _EEADR
extern _RCSTA
extern _TXSTA
extern _TXREG
extern _RCREG
extern _SPBRG
extern _SPBRGH
extern _T3CON
extern _TMR3
extern _TMR3L
extern _TMR3H
extern _CMCON
extern _CVRCON
extern _CCP1AS
extern _ECCP1AS
extern _CCP1DEL
extern _ECCP1DEL
extern _BAUDCON
extern _BAUDCTL
extern _CCP2CON
extern _CCPR2
extern _CCPR2L
extern _CCPR2H
extern _CCP1CON
extern _ECCP1CON
extern _CCPR1
extern _CCPR1L
extern _CCPR1H
extern _ADCON2
extern _ADCON1
extern _ADCON0
extern _ADRES
extern _ADRESL
extern _ADRESH
extern _SSPCON2
extern _SSPCON1
extern _SSPSTAT
extern _SSPADD
extern _SSPBUF
extern _T2CON
extern _PR2
extern _TMR2
extern _T1CON
extern _TMR1
extern _TMR1L
extern _TMR1H
extern _RCON
extern _WDTCON
extern _HLVDCON
extern _LVDCON
extern _OSCCON
extern _T0CON
extern _TMR0
extern _TMR0L
extern _TMR0H
extern _STATUS
extern _FSR2L
extern _FSR2H
extern _PLUSW2
extern _PREINC2
extern _POSTDEC2
extern _POSTINC2
extern _INDF2
extern _BSR
extern _FSR1L
extern _FSR1H
extern _PLUSW1
extern _PREINC1
extern _POSTDEC1
extern _POSTINC1
extern _INDF1
extern _WREG
extern _FSR0L
extern _FSR0H
extern _PLUSW0
extern _PREINC0
extern _POSTDEC0
extern _POSTINC0
extern _INDF0
extern _INTCON3
extern _INTCON2
extern _INTCON
extern _PROD
extern _PRODL
extern _PRODH
extern _TABLAT
extern _TBLPTR
extern _TBLPTRL
extern _TBLPTRH
extern _TBLPTRU
extern _PC
extern _PCL
extern _PCLATH
extern _PCLATU
extern _STKPTR
extern _TOS
extern _TOSL
extern _TOSH
extern _TOSU
extern _delay1ktcy
;--------------------------------------------------------
; Equates to used internal registers
;--------------------------------------------------------
STATUS equ 0xfd8
PCLATH equ 0xffa
PCLATU equ 0xffb
BSR equ 0xfe0
FSR0L equ 0xfe9
FSR0H equ 0xfea
FSR1L equ 0xfe1
FSR2L equ 0xfd9
POSTDEC1 equ 0xfe5
PREINC1 equ 0xfe4
PRODL equ 0xff3
PRODH equ 0xff4
; Internal registers
.registers udata_ovr 0x0000
r0x00 res 1
ustat_main_00 udata 0X07FF
_sram_end res 0
;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
; ; Starting pCode block for absolute section
; ;-----------------------------------------
S_main_ivec_0x1_isr code 0X000008
ivec_0x1_isr:
GOTO _isr
; I code from now on!
; ; Starting pCode block
S_main__main code
_main:
; .line 45; main.c setup();
CALL _setup
_00121_DS_:
; .line 48; main.c PORTDbits.RD0 = PORTBbits.RB0;
CLRF r0x00
BTFSC _PORTBbits, 0
INCF r0x00, F
MOVF r0x00, W
ANDLW 0x01
MOVWF PRODH
MOVF _PORTDbits, W
ANDLW 0xfe
IORWF PRODH, W
MOVWF _PORTDbits
; .line 49; main.c if (PORTDbits.RD0){
BTFSS _PORTDbits, 0
BRA _00118_DS_
; .line 50; main.c PORTDbits.RD1 = 1;
BSF _PORTDbits, 1
BRA _00121_DS_
_00118_DS_:
; .line 51; main.c } else PORTDbits.RD1 = 0;
BCF _PORTDbits, 1
BRA _00121_DS_
; .line 56; main.c }
RETURN
; ; Starting pCode block
S_main__isr code
_isr:
; .line 33; main.c void isr(void) __interrupt (1) {
MOVFF STATUS, POSTDEC1
MOVFF BSR, POSTDEC1
MOVWF POSTDEC1
MOVFF PRODL, POSTDEC1
MOVFF PRODH, POSTDEC1
MOVFF FSR0L, POSTDEC1
MOVFF FSR0H, POSTDEC1
MOVFF PCLATH, POSTDEC1
MOVFF PCLATU, POSTDEC1
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 34; main.c if (INTCONbits.RBIF) {
BTFSS _INTCONbits, 0
BRA _00111_DS_
; .line 36; main.c WREG = PORTB; /* Read portb to elimitate mismatch condition */
MOVF _PORTB, W
; .line 37; main.c LATD = ~LATD;
COMF _LATD, F
; .line 38; main.c delay1ktcy(250);
MOVLW 0xfa
CALL _delay1ktcy
_00111_DS_:
; .line 41; main.c INTCONbits.RBIF = 0;
BCF _INTCONbits, 0
; .line 42; main.c }
MOVFF PREINC1, FSR2L
MOVFF PREINC1, PCLATU
MOVFF PREINC1, PCLATH
MOVFF PREINC1, FSR0H
MOVFF PREINC1, FSR0L
MOVFF PREINC1, PRODH
MOVFF PREINC1, PRODL
MOVF PREINC1, W
MOVFF PREINC1, BSR
MOVFF PREINC1, STATUS
RETFIE
; ; Starting pCode block
S_main__setup code
_setup:
; .line 15; main.c void setup(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 16; main.c LATD = 0;
CLRF _LATD
; .line 17; main.c TRISD = 0;
CLRF _TRISD
; .line 19; main.c TRISB = 0xff;
MOVLW 0xff
MOVWF _TRISB
; .line 20; main.c LATB = 0x00;
CLRF _LATB
; .line 21; main.c ADCON1 = 0xf;
MOVLW 0x0f
MOVWF _ADCON1
; .line 23; main.c INTCONbits.GIE = 1;
BSF _INTCONbits, 7
; .line 24; main.c INTCONbits.PEIE = 1;
BSF _INTCONbits, 6
; .line 25; main.c INTCONbits.RBIE = 0;
BCF _INTCONbits, 3
; .line 26; main.c INTCON2bits.RBPU = 0;
BCF _INTCON2bits, 7
; .line 27; main.c INTCON2bits.RBIP = 1;
BSF _INTCON2bits, 0
; .line 28; main.c RCONbits.IPEN = 1;
BSF _RCONbits, 7
; .line 31; main.c }
MOVFF PREINC1, FSR2L
RETURN
; Statistics:
; code size: 178 (0x00b2) bytes ( 0.14%)
; 89 (0x0059) words
; udata size: 0 (0x0000) bytes ( 0.00%)
; access size: 1 (0x0001) bytes
end

56
c/btest/main.c Executable file
View File

@ -0,0 +1,56 @@
#include <delay.h>
#include <pic18fregs.h>
// FUSES START
#pragma config XINST = OFF
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF
void setup(void);
void isr(void) __interrupt (1);
int main(void);
void setup(void){
LATD = 0;
TRISD = 0;
TRISB = 0xff;
LATB = 0x00;
ADCON1 = 0xf;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.RBIE = 0;
INTCON2bits.RBPU = 0;
INTCON2bits.RBIP = 1;
RCONbits.IPEN = 1;
//NTCONbits.INT0IE = 1;
}
void isr(void) __interrupt (1) {
if (INTCONbits.RBIF) {
//if (INTCONbits.INT0IF) {
WREG = PORTB; /* Read portb to elimitate mismatch condition */
LATD = ~LATD;
delay1ktcy(250);
}
//INTCONbits.INT0IF = 0;
INTCONbits.RBIF = 0;
}
int main(void) {
setup();
for (;;) {
//PORTD = PORTB /* LATB does not work for reading */
PORTDbits.RD0 = PORTBbits.RB0;
if (PORTDbits.RD0){
PORTDbits.RD1 = 1;
} else PORTDbits.RD1 = 0;
}
return 0;
}

35
c/btest/main.hex Executable file
View File

@ -0,0 +1,35 @@
:020000040000FA
:0600000006EF00F0000015
:080008005BEF00F011EEFFF0C8
:1000100021EEFFF0F86AA68EA69C07EEFFF00068BE
:10002000ED6A0050FDE1A40EF66E010EF76E000EB3
:10003000F86E0900F5CF05F00900F5CF06F034D0D1
:100040000900F5CF00F00900F5CF01F00900F5CF68
:1000500002F009000900F5CFE9FF0900F5CFEAFF3A
:10006000090009000900F5CF03F00900F5CF04F0FD
:1000700009000900F6CF07F0F7CF08F0F8CF09F034
:1000800000C0F6FF01C0F7FF02C0F8FF03D009006F
:10009000F5CFEEFF0306FBE20406F9E207C0F6FF28
:1000A00008C0F7FF09C0F8FF0506CAE20606C8E265
:1000B000BFEC00F0FFD7D8CFE5FFE0CFE5FFE56E5E
:1000C000F3CFE5FFF4CFE5FFE9CFE5FFEACFE5FFAA
:1000D000FACFE5FFFBCFE5FFD9CFE5FFE1CFD9FFB1
:1000E000F2A005D081508C1EFA0E8CEC00F0F2903C
:1000F000E4CFD9FFE4CFFBFFE4CFFAFFE4CFEAFF80
:10010000E4CFE9FFE4CFF4FFE4CFF3FFE450E4CF22
:10011000E0FFE4CFD8FF1000E806E56E630E9FEC29
:1001200000F0E4500BE000D0E56E630E9FEC00F0B1
:1001300000D000D00000E450E82EF6D71200E80608
:100140000000E85007E000D000D000D000D0000050
:10015000E82EFAD71200D9CFE5FFE1CFD9FF8C6A9C
:10016000956AFF0E936E8A6A0F0EC16EF28EF28C44
:10017000F296F19EF180D08EE4CFD9FF1200ABEC65
:1001800000F0006A81B0002A0050010BF46E835029
:10019000FE0BF410836E83A002D08382F2D7839289
:1001A000F0D7120001000400000060000000010010
:0201B00000004D
:020000040030CA
:010001000CF2
:010003001EDE
:02000500038175
:00000001FF

BIN
c/btest/test/a.out Executable file

Binary file not shown.

29
c/btest/test/main.c Executable file
View File

@ -0,0 +1,29 @@
#include <stdio.h>
#include <stdint.h>
uint8_t digit[4] = { 0 };
void splitdigit(uint16_t);
void splitdigit(uint16_t num) {
uint8_t i = 0;
while (num) {
digit[i] = num%10;
num = num/10;
i++;
}
}
int main(void) {
uint8_t i;
uint8_t y = 2;
uint8_t x = 3;
splitdigit(24);
for (i = 0; i < 4; i++) {
printf("%d\n", digit[i]);
}
y = x = 2;
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}

994
c/keypad/main.asm Executable file
View File

@ -0,0 +1,994 @@
;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.5.0 #15242 (Linux)
;--------------------------------------------------------
; PIC16 port for the Microchip 16-bit core micros
;--------------------------------------------------------
list p=18f4550
radix dec
CONFIG XINST=OFF
CONFIG FOSC=HS
CONFIG WDT=OFF
CONFIG LVP=OFF
CONFIG MCLRE=OFF
;--------------------------------------------------------
; public variables in this module
;--------------------------------------------------------
global _isr
global _tmr_isr
global _numpad_isr
global _number_to_7seg
global _display
global _shift_left
global _start_display
global _setup
global _main
global _sram_end
global _digit
global _dsp_en
;--------------------------------------------------------
; extern variables in this module
;--------------------------------------------------------
extern _SPPCFGbits
extern _SPPEPSbits
extern _SPPCONbits
extern _UFRMLbits
extern _UFRMHbits
extern _UIRbits
extern _UIEbits
extern _UEIRbits
extern _UEIEbits
extern _USTATbits
extern _UCONbits
extern _UADDRbits
extern _UCFGbits
extern _UEP0bits
extern _UEP1bits
extern _UEP2bits
extern _UEP3bits
extern _UEP4bits
extern _UEP5bits
extern _UEP6bits
extern _UEP7bits
extern _UEP8bits
extern _UEP9bits
extern _UEP10bits
extern _UEP11bits
extern _UEP12bits
extern _UEP13bits
extern _UEP14bits
extern _UEP15bits
extern _PORTAbits
extern _PORTBbits
extern _PORTCbits
extern _PORTDbits
extern _PORTEbits
extern _LATAbits
extern _LATBbits
extern _LATCbits
extern _LATDbits
extern _LATEbits
extern _DDRAbits
extern _TRISAbits
extern _DDRBbits
extern _TRISBbits
extern _DDRCbits
extern _TRISCbits
extern _DDRDbits
extern _TRISDbits
extern _DDREbits
extern _TRISEbits
extern _OSCTUNEbits
extern _PIE1bits
extern _PIR1bits
extern _IPR1bits
extern _PIE2bits
extern _PIR2bits
extern _IPR2bits
extern _EECON1bits
extern _RCSTAbits
extern _TXSTAbits
extern _T3CONbits
extern _CMCONbits
extern _CVRCONbits
extern _CCP1ASbits
extern _ECCP1ASbits
extern _CCP1DELbits
extern _ECCP1DELbits
extern _BAUDCONbits
extern _BAUDCTLbits
extern _CCP2CONbits
extern _CCP1CONbits
extern _ECCP1CONbits
extern _ADCON2bits
extern _ADCON1bits
extern _ADCON0bits
extern _SSPCON2bits
extern _SSPCON1bits
extern _SSPSTATbits
extern _T2CONbits
extern _T1CONbits
extern _RCONbits
extern _WDTCONbits
extern _HLVDCONbits
extern _LVDCONbits
extern _OSCCONbits
extern _T0CONbits
extern _STATUSbits
extern _INTCON3bits
extern _INTCON2bits
extern _INTCONbits
extern _STKPTRbits
extern _SPPDATA
extern _SPPCFG
extern _SPPEPS
extern _SPPCON
extern _UFRM
extern _UFRML
extern _UFRMH
extern _UIR
extern _UIE
extern _UEIR
extern _UEIE
extern _USTAT
extern _UCON
extern _UADDR
extern _UCFG
extern _UEP0
extern _UEP1
extern _UEP2
extern _UEP3
extern _UEP4
extern _UEP5
extern _UEP6
extern _UEP7
extern _UEP8
extern _UEP9
extern _UEP10
extern _UEP11
extern _UEP12
extern _UEP13
extern _UEP14
extern _UEP15
extern _PORTA
extern _PORTB
extern _PORTC
extern _PORTD
extern _PORTE
extern _LATA
extern _LATB
extern _LATC
extern _LATD
extern _LATE
extern _DDRA
extern _TRISA
extern _DDRB
extern _TRISB
extern _DDRC
extern _TRISC
extern _DDRD
extern _TRISD
extern _DDRE
extern _TRISE
extern _OSCTUNE
extern _PIE1
extern _PIR1
extern _IPR1
extern _PIE2
extern _PIR2
extern _IPR2
extern _EECON1
extern _EECON2
extern _EEDATA
extern _EEADR
extern _RCSTA
extern _TXSTA
extern _TXREG
extern _RCREG
extern _SPBRG
extern _SPBRGH
extern _T3CON
extern _TMR3
extern _TMR3L
extern _TMR3H
extern _CMCON
extern _CVRCON
extern _CCP1AS
extern _ECCP1AS
extern _CCP1DEL
extern _ECCP1DEL
extern _BAUDCON
extern _BAUDCTL
extern _CCP2CON
extern _CCPR2
extern _CCPR2L
extern _CCPR2H
extern _CCP1CON
extern _ECCP1CON
extern _CCPR1
extern _CCPR1L
extern _CCPR1H
extern _ADCON2
extern _ADCON1
extern _ADCON0
extern _ADRES
extern _ADRESL
extern _ADRESH
extern _SSPCON2
extern _SSPCON1
extern _SSPSTAT
extern _SSPADD
extern _SSPBUF
extern _T2CON
extern _PR2
extern _TMR2
extern _T1CON
extern _TMR1
extern _TMR1L
extern _TMR1H
extern _RCON
extern _WDTCON
extern _HLVDCON
extern _LVDCON
extern _OSCCON
extern _T0CON
extern _TMR0
extern _TMR0L
extern _TMR0H
extern _STATUS
extern _FSR2L
extern _FSR2H
extern _PLUSW2
extern _PREINC2
extern _POSTDEC2
extern _POSTINC2
extern _INDF2
extern _BSR
extern _FSR1L
extern _FSR1H
extern _PLUSW1
extern _PREINC1
extern _POSTDEC1
extern _POSTINC1
extern _INDF1
extern _WREG
extern _FSR0L
extern _FSR0H
extern _PLUSW0
extern _PREINC0
extern _POSTDEC0
extern _POSTINC0
extern _INDF0
extern _INTCON3
extern _INTCON2
extern _INTCON
extern _PROD
extern _PRODL
extern _PRODH
extern _TABLAT
extern _TBLPTR
extern _TBLPTRL
extern _TBLPTRH
extern _TBLPTRU
extern _PC
extern _PCL
extern _PCLATH
extern _PCLATU
extern _STKPTR
extern _TOS
extern _TOSL
extern _TOSH
extern _TOSU
extern _delay1ktcy
extern __moduint
extern __divuint
;--------------------------------------------------------
; Equates to used internal registers
;--------------------------------------------------------
STATUS equ 0xfd8
PCL equ 0xff9
PCLATH equ 0xffa
PCLATU equ 0xffb
WREG equ 0xfe8
BSR equ 0xfe0
FSR0L equ 0xfe9
FSR0H equ 0xfea
FSR1L equ 0xfe1
FSR2L equ 0xfd9
INDF0 equ 0xfef
POSTINC1 equ 0xfe6
POSTDEC1 equ 0xfe5
PREINC1 equ 0xfe4
PLUSW2 equ 0xfdb
PRODL equ 0xff3
PRODH equ 0xff4
idata
_digit db 0x00, 0x00, 0x00, 0x00
_dsp_en db 0x00
; Internal registers
.registers udata_ovr 0x0000
r0x00 res 1
r0x01 res 1
r0x02 res 1
r0x03 res 1
r0x04 res 1
r0x05 res 1
r0x06 res 1
r0x07 res 1
r0x08 res 1
ustat_main_00 udata 0X07FF
_sram_end res 0
;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
; ; Starting pCode block for absolute section
; ;-----------------------------------------
S_main_ivec_0x1_isr code 0X000008
ivec_0x1_isr:
GOTO _isr
; I code from now on!
; ; Starting pCode block
S_main__main code
_main:
; .line 186; main.c setup();
CALL _setup
; .line 187; main.c start_display();
CALL _start_display
_00393_DS_:
; .line 189; main.c PORTB = 0xe;
MOVLW 0x0e
MOVWF _PORTB
; .line 190; main.c delay1ktcy(POLLINGRATE);
MOVLW 0x64
CALL _delay1ktcy
; .line 191; main.c PORTB = 0xD;
MOVLW 0x0d
MOVWF _PORTB
; .line 192; main.c delay1ktcy(POLLINGRATE);
MOVLW 0x64
CALL _delay1ktcy
; .line 193; main.c PORTB = 0xB;
MOVLW 0x0b
MOVWF _PORTB
; .line 194; main.c delay1ktcy(POLLINGRATE);
MOVLW 0x64
CALL _delay1ktcy
; .line 195; main.c PORTB = 0x7;
MOVLW 0x07
MOVWF _PORTB
; .line 196; main.c delay1ktcy(POLLINGRATE);
MOVLW 0x64
CALL _delay1ktcy
BRA _00393_DS_
; .line 199; main.c }
RETURN
; ; Starting pCode block
S_main__setup code
_setup:
; .line 160; main.c void setup(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 162; main.c LATD = 0;
CLRF _LATD
; .line 163; main.c TRISD = 0;
CLRF _TRISD
; .line 165; main.c TRISB = 0xf0;
MOVLW 0xf0
MOVWF _TRISB
; .line 166; main.c LATB = 0x00;
CLRF _LATB
; .line 167; main.c ADCON1 = 0xf;
MOVLW 0x0f
MOVWF _ADCON1
; .line 168; main.c INTCON2bits.RBPU = 0;
BCF _INTCON2bits, 7
; .line 170; main.c TRISE = 0;
CLRF _TRISE
; .line 171; main.c LATE = 0;
CLRF _LATE
; .line 173; main.c TRISA = 0;
CLRF _TRISA
; .line 174; main.c LATA = 0;
CLRF _LATA
; .line 177; main.c INTCONbits.GIE = 1;
BSF _INTCONbits, 7
; .line 178; main.c INTCONbits.PEIE = 1;
BSF _INTCONbits, 6
; .line 179; main.c INTCONbits.RBIE = 1;
BSF _INTCONbits, 3
; .line 180; main.c INTCON2bits.RBIP = 1;
BSF _INTCON2bits, 0
; .line 181; main.c RCONbits.IPEN = 1;
BSF _RCONbits, 7
; .line 183; main.c }
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__start_display code
_start_display:
; .line 149; main.c void start_display(void) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 151; main.c INTCONbits.TMR0IE = 1;
BSF _INTCONbits, 5
; .line 152; main.c INTCON2bits.TMR0IP = 1;
BSF _INTCON2bits, 2
; .line 154; main.c T0CONbits.T08BIT = 1;
BSF _T0CONbits, 6
; .line 155; main.c T0CONbits.T0CS = 0; // Source internal oscilator
BCF _T0CONbits, 5
; .line 156; main.c T0CONbits.PSA = 0;
BCF _T0CONbits, 3
; .line 157; main.c T0CONbits.T0PS = 0x7;
MOVF _T0CONbits, W
ANDLW 0xf8
IORLW 0x07
MOVWF _T0CONbits
; .line 158; main.c T0CONbits.TMR0ON = 1;
BSF _T0CONbits, 7
; .line 159; main.c }
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__shift_left code
_shift_left:
; .line 144; main.c void shift_left(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
; .line 145; main.c digit[3] = digit[2];
MOVFF (_digit + 2), r0x00
MOVF r0x00, W
BANKSEL (_digit + 3)
MOVWF (_digit + 3), B
; .line 146; main.c digit[2] = digit[1];
MOVFF (_digit + 1), r0x00
MOVF r0x00, W
BANKSEL (_digit + 2)
MOVWF (_digit + 2), B
; .line 147; main.c digit[1] = digit[0];
MOVFF _digit, r0x00
MOVF r0x00, W
BANKSEL (_digit + 1)
MOVWF (_digit + 1), B
; .line 148; main.c }
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__display code
_display:
; .line 135; main.c void display(uint16_t num){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVFF r0x05, POSTDEC1
MOVFF r0x06, POSTDEC1
MOVFF r0x07, POSTDEC1
MOVFF r0x08, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
MOVLW 0x03
MOVFF PLUSW2, r0x01
; .line 137; main.c if (num > 9999) return;
MOVF r0x00, W
MOVWF r0x02
MOVF r0x01, W
MOVWF r0x03
MOVLW 0x27
SUBWF r0x03, W
BNZ _00372_DS_
MOVLW 0x10
SUBWF r0x02, W
_00372_DS_:
BC _00351_DS_
; .line 138; main.c while(num) {
CLRF r0x02
_00348_DS_:
MOVF r0x01, W
IORWF r0x00, W
BZ _00351_DS_
; .line 139; main.c digit[i] = num%10;
MOVLW LOW(_digit)
ADDWF r0x02, W
MOVWF r0x03
CLRF r0x04
MOVLW HIGH(_digit)
ADDWFC r0x04, F
MOVF r0x00, W
MOVWF r0x05
MOVF r0x01, W
MOVWF r0x06
MOVLW 0x00
MOVWF POSTDEC1
MOVLW 0x0a
MOVWF POSTDEC1
MOVF r0x06, W
MOVWF POSTDEC1
MOVF r0x05, W
MOVWF POSTDEC1
CALL __moduint
MOVWF r0x07
MOVFF PRODL, r0x08
MOVLW 0x04
ADDWF FSR1L, F
MOVFF r0x03, FSR0L
MOVFF r0x04, FSR0H
MOVFF r0x07, INDF0
; .line 140; main.c num = num/10;
MOVLW 0x00
MOVWF POSTDEC1
MOVLW 0x0a
MOVWF POSTDEC1
MOVF r0x06, W
MOVWF POSTDEC1
MOVF r0x05, W
MOVWF POSTDEC1
CALL __divuint
MOVWF r0x03
MOVFF PRODL, r0x04
MOVLW 0x04
ADDWF FSR1L, F
MOVF r0x03, W
MOVWF r0x00
MOVF r0x04, W
MOVWF r0x01
; .line 141; main.c i++;
INCF r0x02, F
BRA _00348_DS_
_00351_DS_:
; .line 143; main.c }
MOVFF PREINC1, r0x08
MOVFF PREINC1, r0x07
MOVFF PREINC1, r0x06
MOVFF PREINC1, r0x05
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__number_to_7seg code
_number_to_7seg:
; .line 97; main.c uint8_t number_to_7seg(uint8_t number) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
; .line 98; main.c switch (number) {
MOVLW 0x10
SUBWF r0x00, W
BTFSC STATUS, 0
BRA _00330_DS_
CLRF PCLATH
CLRF PCLATU
RLCF r0x00, W
RLCF PCLATH, F
RLCF WREG, W
RLCF PCLATH, F
ANDLW 0xfc
ADDLW LOW(_00341_DS_)
MOVWF POSTDEC1
MOVLW HIGH(_00341_DS_)
ADDWFC PCLATH, F
MOVLW UPPER(_00341_DS_)
ADDWFC PCLATU, F
MOVF PREINC1, W
MOVWF PCL
_00341_DS_:
GOTO _00314_DS_
GOTO _00315_DS_
GOTO _00316_DS_
GOTO _00317_DS_
GOTO _00318_DS_
GOTO _00319_DS_
GOTO _00320_DS_
GOTO _00321_DS_
GOTO _00322_DS_
GOTO _00323_DS_
GOTO _00324_DS_
GOTO _00325_DS_
GOTO _00326_DS_
GOTO _00327_DS_
GOTO _00328_DS_
GOTO _00329_DS_
_00314_DS_:
; .line 100; main.c return 0x3F;
MOVLW 0x3f
BRA _00332_DS_
_00315_DS_:
; .line 102; main.c return 0x06;
MOVLW 0x06
BRA _00332_DS_
_00316_DS_:
; .line 104; main.c return 0x5B;
MOVLW 0x5b
BRA _00332_DS_
_00317_DS_:
; .line 106; main.c return 0x4F;
MOVLW 0x4f
BRA _00332_DS_
_00318_DS_:
; .line 108; main.c return 0x66;
MOVLW 0x66
BRA _00332_DS_
_00319_DS_:
; .line 110; main.c return 0x6D;
MOVLW 0x6d
BRA _00332_DS_
_00320_DS_:
; .line 112; main.c return 0x7D;
MOVLW 0x7d
BRA _00332_DS_
_00321_DS_:
; .line 114; main.c return 0x07;
MOVLW 0x07
BRA _00332_DS_
_00322_DS_:
; .line 116; main.c return 0x7F;
MOVLW 0x7f
BRA _00332_DS_
_00323_DS_:
; .line 118; main.c return 0x6F;
MOVLW 0x6f
BRA _00332_DS_
_00324_DS_:
; .line 120; main.c return 0x77;
MOVLW 0x77
BRA _00332_DS_
_00325_DS_:
; .line 122; main.c return 0x7c;
MOVLW 0x7c
BRA _00332_DS_
_00326_DS_:
; .line 124; main.c return 0x39;
MOVLW 0x39
BRA _00332_DS_
_00327_DS_:
; .line 126; main.c return 0x5e;
MOVLW 0x5e
BRA _00332_DS_
_00328_DS_:
; .line 128; main.c return 0x79;
MOVLW 0x79
BRA _00332_DS_
_00329_DS_:
; .line 130; main.c return 0x71;
MOVLW 0x71
BRA _00332_DS_
_00330_DS_:
; .line 132; main.c return 0;
CLRF WREG
_00332_DS_:
; .line 134; main.c }
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__numpad_isr code
_numpad_isr:
; .line 65; main.c void numpad_isr(void) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
; .line 67; main.c uint8_t number = 0;
CLRF r0x00
; .line 68; main.c if ((PORTB & 0xf0) == 0xf0) return;
MOVFF _PORTB, r0x01
CLRF r0x02
MOVLW 0xf0
ANDWF r0x01, F
CLRF r0x02
MOVF r0x01, W
XORLW 0xf0
BNZ _00308_DS_
MOVF r0x02, W
BZ _00309_DS_
_00308_DS_:
BRA _00143_DS_
_00309_DS_:
BRA _00185_DS_
_00143_DS_:
; .line 69; main.c if (!PORTBbits.RB0) {
BTFSC _PORTBbits, 0
BRA _00183_DS_
; .line 70; main.c if (!PORTBbits.RB4) number = 1;
BTFSC _PORTBbits, 4
BRA _00145_DS_
MOVLW 0x01
MOVWF r0x00
_00145_DS_:
; .line 71; main.c if (!PORTBbits.RB5) number = 2;
BTFSC _PORTBbits, 5
BRA _00147_DS_
MOVLW 0x02
MOVWF r0x00
_00147_DS_:
; .line 72; main.c if (!PORTBbits.RB6) number = 3;
BTFSC _PORTBbits, 6
BRA _00149_DS_
MOVLW 0x03
MOVWF r0x00
_00149_DS_:
; .line 73; main.c if (!PORTBbits.RB7) number = 0xA;
BTFSC _PORTBbits, 7
BRA _00184_DS_
MOVLW 0x0a
MOVWF r0x00
BRA _00184_DS_
_00183_DS_:
; .line 75; main.c else if (!PORTBbits.RB1) {
BTFSC _PORTBbits, 1
BRA _00180_DS_
; .line 76; main.c if (!PORTBbits.RB4) number = 4;
BTFSC _PORTBbits, 4
BRA _00153_DS_
MOVLW 0x04
MOVWF r0x00
_00153_DS_:
; .line 77; main.c if (!PORTBbits.RB5) number = 5;
BTFSC _PORTBbits, 5
BRA _00155_DS_
MOVLW 0x05
MOVWF r0x00
_00155_DS_:
; .line 78; main.c if (!PORTBbits.RB6) number = 6;
BTFSC _PORTBbits, 6
BRA _00157_DS_
MOVLW 0x06
MOVWF r0x00
_00157_DS_:
; .line 79; main.c if (!PORTBbits.RB7) number = 0xB;
BTFSC _PORTBbits, 7
BRA _00184_DS_
MOVLW 0x0b
MOVWF r0x00
BRA _00184_DS_
_00180_DS_:
; .line 81; main.c else if (!PORTBbits.RB2) {
BTFSC _PORTBbits, 2
BRA _00177_DS_
; .line 82; main.c if (!PORTBbits.RB4) number = 7;
BTFSC _PORTBbits, 4
BRA _00161_DS_
MOVLW 0x07
MOVWF r0x00
_00161_DS_:
; .line 83; main.c if (!PORTBbits.RB5) number = 8;
BTFSC _PORTBbits, 5
BRA _00163_DS_
MOVLW 0x08
MOVWF r0x00
_00163_DS_:
; .line 84; main.c if (!PORTBbits.RB6) number = 9;
BTFSC _PORTBbits, 6
BRA _00165_DS_
MOVLW 0x09
MOVWF r0x00
_00165_DS_:
; .line 85; main.c if (!PORTBbits.RB7) number = 0xC;
BTFSC _PORTBbits, 7
BRA _00184_DS_
MOVLW 0x0c
MOVWF r0x00
BRA _00184_DS_
_00177_DS_:
; .line 87; main.c else if (!PORTBbits.RB3) {
BTFSC _PORTBbits, 3
BRA _00184_DS_
; .line 89; main.c if (!PORTBbits.RB5) number = 0;
BTFSC _PORTBbits, 5
BRA _00169_DS_
CLRF r0x00
_00169_DS_:
; .line 90; main.c if (!PORTBbits.RB6) number = 0xF;
BTFSC _PORTBbits, 6
BRA _00171_DS_
MOVLW 0x0f
MOVWF r0x00
_00171_DS_:
; .line 91; main.c if (!PORTBbits.RB7) number = 0xD;
BTFSC _PORTBbits, 7
BRA _00184_DS_
MOVLW 0x0d
MOVWF r0x00
_00184_DS_:
; .line 93; main.c shift_left();
CALL _shift_left
; .line 94; main.c digit[0] = number;
MOVF r0x00, W
BANKSEL _digit
MOVWF _digit, B
_00185_DS_:
; .line 95; main.c }
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__tmr_isr code
_tmr_isr:
; .line 43; main.c void tmr_isr(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
; .line 44; main.c LATA = LATE = 0;
CLRF _LATE
CLRF _LATA
; .line 45; main.c LATD = number_to_7seg(digit[dsp_en]);
MOVLW LOW(_digit)
BANKSEL _dsp_en
ADDWF _dsp_en, W, B
MOVWF r0x00
CLRF r0x01
MOVLW HIGH(_digit)
ADDWFC r0x01, F
MOVFF r0x00, FSR0L
MOVFF r0x01, FSR0H
MOVFF INDF0, r0x00
MOVF r0x00, W
MOVWF POSTDEC1
CALL _number_to_7seg
MOVWF _LATD
MOVF POSTINC1, F
; .line 46; main.c switch (dsp_en) {
MOVLW 0x04
BANKSEL _dsp_en
SUBWF _dsp_en, W, B
BC _00118_DS_
CLRF PCLATH
CLRF PCLATU
BANKSEL _dsp_en
RLCF _dsp_en, W, B
RLCF PCLATH, F
RLCF WREG, W
RLCF PCLATH, F
ANDLW 0xfc
ADDLW LOW(_00136_DS_)
MOVWF POSTDEC1
MOVLW HIGH(_00136_DS_)
ADDWFC PCLATH, F
MOVLW UPPER(_00136_DS_)
ADDWFC PCLATU, F
MOVF PREINC1, W
MOVWF PCL
_00136_DS_:
GOTO _00114_DS_
GOTO _00115_DS_
GOTO _00116_DS_
GOTO _00117_DS_
_00114_DS_:
; .line 48; main.c LATA = 0;
CLRF _LATA
; .line 49; main.c LATE = 0x4;
MOVLW 0x04
MOVWF _LATE
; .line 50; main.c break;
BRA _00118_DS_
_00115_DS_:
; .line 52; main.c LATE = 0x2;
MOVLW 0x02
MOVWF _LATE
; .line 53; main.c break;
BRA _00118_DS_
_00116_DS_:
; .line 55; main.c LATE = 0x1;
MOVLW 0x01
MOVWF _LATE
; .line 56; main.c break;
BRA _00118_DS_
_00117_DS_:
; .line 58; main.c LATE = 0;
CLRF _LATE
; .line 59; main.c LATA = 0x10;
MOVLW 0x10
MOVWF _LATA
_00118_DS_:
BANKSEL _dsp_en
; .line 62; main.c dsp_en++;
INCF _dsp_en, F, B
; .line 63; main.c if (dsp_en > 3) dsp_en = 0;
MOVLW 0x04
BANKSEL _dsp_en
SUBWF _dsp_en, W, B
BNC _00121_DS_
BANKSEL _dsp_en
CLRF _dsp_en, B
_00121_DS_:
; .line 64; main.c }
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__isr code
_isr:
; .line 31; main.c void isr(void) __interrupt (1) {
MOVFF STATUS, POSTDEC1
MOVFF BSR, POSTDEC1
MOVWF POSTDEC1
MOVFF PRODL, POSTDEC1
MOVFF PRODH, POSTDEC1
MOVFF FSR0L, POSTDEC1
MOVFF FSR0H, POSTDEC1
MOVFF PCLATH, POSTDEC1
MOVFF PCLATU, POSTDEC1
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 32; main.c if (INTCONbits.TMR0IF){
BTFSS _INTCONbits, 2
BRA _00106_DS_
; .line 33; main.c tmr_isr();
CALL _tmr_isr
; .line 34; main.c TMR0 = RATE;
MOVLW 0xfa
MOVWF _TMR0
_00106_DS_:
; .line 36; main.c INTCONbits.TMR0IF = 0;
BCF _INTCONbits, 2
; .line 37; main.c if (INTCONbits.RBIF){
BTFSS _INTCONbits, 0
BRA _00108_DS_
; .line 38; main.c numpad_isr();
CALL _numpad_isr
_00108_DS_:
; .line 40; main.c INTCONbits.RBIF = 0;
BCF _INTCONbits, 0
; .line 41; main.c }
MOVFF PREINC1, FSR2L
MOVFF PREINC1, PCLATU
MOVFF PREINC1, PCLATH
MOVFF PREINC1, FSR0H
MOVFF PREINC1, FSR0L
MOVFF PREINC1, PRODH
MOVFF PREINC1, PRODL
MOVF PREINC1, W
MOVFF PREINC1, BSR
MOVFF PREINC1, STATUS
RETFIE
; Statistics:
; code size: 1106 (0x0452) bytes ( 0.84%)
; 553 (0x0229) words
; udata size: 0 (0x0000) bytes ( 0.00%)
; access size: 9 (0x0009) bytes
end

199
c/keypad/main.c Executable file
View File

@ -0,0 +1,199 @@
#include <pic18fregs.h>
#include <delay.h>
#include <stdint.h>
// FUSES START
#pragma config XINST = OFF
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF
#define NDIGITS 4
#define RATE 250
#define POLLINGRATE 100
uint8_t digit[NDIGITS] = { 0 };
uint8_t dsp_en = 0;
void isr(void) __interrupt (1);
void tmr_isr(void);
void numpad_isr(void);
uint8_t number_to_7seg(uint8_t);
void start_display(void);
void display(uint16_t);
void shift_left(void);
void setup(void);
int main(void);
void isr(void) __interrupt (1) {
if (INTCONbits.TMR0IF){
tmr_isr();
TMR0 = RATE;
}
INTCONbits.TMR0IF = 0;
if (INTCONbits.RBIF){
numpad_isr();
}
INTCONbits.RBIF = 0;
}
void tmr_isr(void){
LATA = LATE = 0;
LATD = number_to_7seg(digit[dsp_en]);
switch (dsp_en) {
case 0:
LATA = 0;
LATE = 0x4;
break;
case 1:
LATE = 0x2;
break;
case 2:
LATE = 0x1;
break;
case 3:
LATE = 0;
LATA = 0x10;
break;
}
dsp_en++;
if (dsp_en > 3) dsp_en = 0;
}
void numpad_isr(void) {
uint8_t n = 0;
uint8_t number = 0;
if ((PORTB & 0xf0) == 0xf0) return;
if (!PORTBbits.RB0) {
if (!PORTBbits.RB4) number = 1;
if (!PORTBbits.RB5) number = 2;
if (!PORTBbits.RB6) number = 3;
if (!PORTBbits.RB7) number = 0xA;
}
else if (!PORTBbits.RB1) {
if (!PORTBbits.RB4) number = 4;
if (!PORTBbits.RB5) number = 5;
if (!PORTBbits.RB6) number = 6;
if (!PORTBbits.RB7) number = 0xB;
}
else if (!PORTBbits.RB2) {
if (!PORTBbits.RB4) number = 7;
if (!PORTBbits.RB5) number = 8;
if (!PORTBbits.RB6) number = 9;
if (!PORTBbits.RB7) number = 0xC;
}
else if (!PORTBbits.RB3) {
//if (!PORTBbits.RB4) number = 1;
if (!PORTBbits.RB5) number = 0;
if (!PORTBbits.RB6) number = 0xF;
if (!PORTBbits.RB7) number = 0xD;
}
shift_left();
digit[0] = number;
}
uint8_t number_to_7seg(uint8_t number) {
switch (number) {
case 0:
return 0x3F;
case 1:
return 0x06;
case 2:
return 0x5B;
case 3:
return 0x4F;
case 4:
return 0x66;
case 5:
return 0x6D;
case 6:
return 0x7D;
case 7:
return 0x07;
case 8:
return 0x7F;
case 9:
return 0x6F;
case 0xa:
return 0x77;
case 0xb:
return 0x7c;
case 0xC:
return 0x39;
case 0xd:
return 0x5e;
case 0xe:
return 0x79;
case 0xf:
return 0x71;
default:
return 0;
}
}
void display(uint16_t num){
uint8_t i = 0;
if (num > 9999) return;
while(num) {
digit[i] = num%10;
num = num/10;
i++;
}
}
void shift_left(void){
digit[3] = digit[2];
digit[2] = digit[1];
digit[1] = digit[0];
}
void start_display(void) {
/* timer interrupt setup */
INTCONbits.TMR0IE = 1;
INTCON2bits.TMR0IP = 1;
T0CONbits.T08BIT = 1;
T0CONbits.T0CS = 0; // Source internal oscilator
T0CONbits.PSA = 0;
T0CONbits.T0PS = 0x7;
T0CONbits.TMR0ON = 1;
}
void setup(void){
/* Port setup */
LATD = 0;
TRISD = 0;
TRISB = 0xf0;
LATB = 0x00;
ADCON1 = 0xf;
INTCON2bits.RBPU = 0;
TRISE = 0;
LATE = 0;
TRISA = 0;
LATA = 0;
/* Interrupt setup */
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.RBIE = 1;
INTCON2bits.RBIP = 1;
RCONbits.IPEN = 1;
}
int main(void) {
uint16_t cuenta = 0;
setup();
start_display();
for (;;) {
PORTB = 0xe;
delay1ktcy(POLLINGRATE);
PORTB = 0xD;
delay1ktcy(POLLINGRATE);
PORTB = 0xB;
delay1ktcy(POLLINGRATE);
PORTB = 0x7;
delay1ktcy(POLLINGRATE);
}
return 0;
}

115
c/keypad/main.hex Normal file
View File

@ -0,0 +1,115 @@
:020000040000FA
:04000000F9EF01F023
:08000800A3EF02F0D9CFE5FFE0
:10001000E1CFD9FF00C0E5FF01C0E5FF02C0E5FF69
:1000200003C0E5FF04C0E5FF05C0E5FF06C0E5FF2E
:1000300007C0E5FF08C0E5FF020EDBCF00F0030EAE
:10004000DBCF01F00050026E0150036E270E035CFF
:1000500002E1100E025C38E2026A0150001034E046
:10006000600E0224036E046A000E04220050056E26
:100070000150066E000EE56E0A0EE56E0650E56E46
:100080000550E56E47EC01F0076EF3CF08F0040E63
:10009000E12603C0E9FF04C0EAFF07C0EFFF000E3E
:1000A000E56E0A0EE56E0650E56E0550E56E4EEC07
:1000B00002F0036EF3CF04F0040EE1260350006E4D
:1000C0000450016E022AC9D7E4CF08F0E4CF07F04C
:1000D000E4CF06F0E4CF05F0E4CF04F0E4CF03F082
:1000E000E4CF02F0E4CF01F0E4CF00F0E4CFD9FF99
:1000F0001200D9CFE5FFE1CFD9FF00C0E5FF01C075
:10010000E5FF02C0E5FF006A81CF01F0026AF00E50
:100110000116026A0150F00A02E1025001E001D02A
:100120004BD081B011D081B802D0010E006E81BADF
:1001300002D0020E006E81BC02D0030E006E81BEA2
:1001400036D00A0E006E33D081B211D081B802D001
:10015000040E006E81BA02D0050E006E81BC02D082
:10016000060E006E81BE23D00B0E006E20D081B42F
:1001700011D081B802D0070E006E81BA02D0080EED
:10018000006E81BC02D0090E006E81BE10D00C0E34
:10019000006E0DD081B60BD081BA01D0006A81BC4F
:1001A00002D00F0E006E81BE02D00D0E006E11EC5B
:1001B00003F000500001606FE4CF02F0E4CF01F0E3
:1001C000E4CF00F0E4CFD9FF1200D9CFE5FFE1CFB3
:1001D000D9FF00C0E5FF020EDBCF00F0100E005C7F
:1001E000D8B04FD0FA6AFB6A0034FA36E834FA36EF
:1001F000FC0B020FE56E020EFA22000EFB22E45009
:10020000F96E21EF01F023EF01F025EF01F027EF68
:1002100001F029EF01F02BEF01F02DEF01F02FEFAE
:1002200001F031EF01F033EF01F035EF01F037EF7E
:1002300001F039EF01F03BEF01F03DEF01F03FEF4E
:1002400001F03F0E1FD0060E1DD05B0E1BD04F0ECF
:1002500019D0660E17D06D0E15D07D0E13D0070E77
:1002600011D07F0E0FD06F0E0DD0770E0BD07C0EFD
:1002700009D0390E07D05E0E05D0790E03D0710E6D
:1002800001D0E86AE4CF00F0E4CFD9FF1200D9CF63
:10029000E5FFE1CFD9FF00C0E5FF01C0E5FF02C0E7
:1002A000E5FF03C0E5FF04C0E5FF05C0E5FF06C0AC
:1002B000E5FF020EDBCF00F0030EDBCF01F0040EF2
:1002C000DBCF02F0050EDBCF03F0046A056A0350B2
:1002D000800BE844066E065011E1025002260336F8
:1002E0000350015C02E10250005C04E2D89003324A
:1002F000023204D0052A05C004F0E9D70350015C9E
:1003000002E10250005C04E30250005E0350015A17
:10031000D8900332023204C005F004060550EEE125
:1003200001C0F3FF0050E4CF06F0E4CF05F0E4CFC6
:1003300004F0E4CF03F0E4CF02F0E4CF01F0E4CF27
:1003400000F0E4CFD9FF1200D9CFE5FFE1CFD9FF0C
:1003500000C0E5FF01C0E5FF8D6A896A600E0001FB
:100360006425006E016A000E012200C0E9FF01C091
:10037000EAFFEFCF00F00050E56EE5EC00F08C6E88
:10038000E652040E0001645D25E2FA6AFB6A000190
:100390006435FA36E834FA36FC0BAA0FE56E030E24
:1003A000FA22000EFB22E450F96EDDEF01F0E1EFDE
:1003B00001F0E4EF01F0E7EF01F0896A040E8D6EC1
:1003C00009D0020E8D6E06D0010E8D6E03D08D6A9F
:1003D000100E896E0001642B040E0001645D02E3BF
:1003E0000001646BE4CF01F0E4CF00F0E4CFD9FF6B
:1003F000120011EEFFF021EEFFF0F86AA68EA69C27
:1004000007EEFFF00068ED6A0050FDE1A80EF66E01
:10041000060EF76E000EF86E0900F5CF05F0090024
:10042000F5CF06F034D00900F5CF00F00900F5CF84
:1004300001F00900F5CF02F009000900F5CFE9FF4E
:100440000900F5CFEAFF090009000900F5CF03F024
:100450000900F5CF04F009000900F6CF07F0F7CF47
:1004600008F0F8CF09F000C0F6FF01C0F7FF02C0A6
:10047000F8FF03D00900F5CFEEFF0306FBE2040608
:10048000F9E207C0F6FF08C0F7FF09C0F8FF05064C
:10049000CAE20606C8E2F7EC02F0FFD7D9CFE5FFC3
:1004A000E1CFD9FF00C0E5FF01C0E5FF02C0E5FFD5
:1004B00003C0E5FF04C0E5FF05C0E5FF06C0E5FF9A
:1004C00007C0E5FF020EDBCF00F0030EDBCF01F02B
:1004D000040EDBCF02F0050EDBCF03F0046A056AE1
:1004E000100E066E0150800BE844076E0050002687
:1004F00001360450042605360750D8A40480035062
:10050000055C02E10250045C05E30250045E035006
:10051000055A008006060650E5E101C0F3FF0050D1
:10052000E4CF07F0E4CF06F0E4CF05F0E4CF04F029
:10053000E4CF03F0E4CF02F0E4CF01F0E4CF00F029
:10054000E4CFD9FF1200D8CFE5FFE0CFE5FFE56E9D
:10055000F3CFE5FFF4CFE5FFE9CFE5FFEACFE5FF15
:10056000FACFE5FFFBCFE5FFD9CFE5FFE1CFD9FF1C
:10057000F2A404D0A4EC01F0FA0ED66EF294F2A02C
:1005800002D079EC00F0F290E4CFD9FFE4CFFBFF8A
:10059000E4CFFAFFE4CFEAFFE4CFE9FFE4CFF4FFD2
:1005A000E4CFF3FFE450E4CFE0FFE4CFD8FF100046
:1005B000E806E56E630EEBEC02F0E4500BE000D0D1
:1005C000E56E630EEBEC02F000D000D00000E450CA
:1005D000E82EF6D71200E8060000E85007E000D049
:1005E00000D000D000D00000E82EFAD712002BEC8B
:1005F00003F043EC03F00E0E816E640ED8EC02F0B3
:100600000D0E816E640ED8EC02F00B0E816E640E3E
:10061000D8EC02F0070E816E640ED8EC02F0EBD736
:100620001200D9CFE5FFE1CFD9FF00C0E5FF62C0DE
:1006300000F000500001636F61C000F00050000145
:10064000626F60C000F000500001616FE4CF00F005
:10065000E4CFD9FF1200D9CFE5FFE1CFD9FF8C6AF3
:10066000956AF00E936E8A6A0F0EC16EF19E966ABD
:100670008D6A926A896AF28EF28CF286F180D08E4F
:10068000E4CFD9FF1200D9CFE5FFE1CFD9FFF28A3D
:10069000F184D58CD59AD596D550F80B0709D56E2F
:1006A000D58EE4CFD9FF12000100B606000060002D
:0C06B00000000600000000000000000038
:020000040030CA
:010001000CF2
:010003001EDE
:02000500038175
:00000001FF

32
c/keypad/makefile Executable file
View File

@ -0,0 +1,32 @@
# My pic workflow makefile by Fernando R Jacobo
# Dependencies
# SDCC Small Device C Compiler
# pk2cmd for pickit pic programmers
# C compiler variables
SRC=*.c
CC=sdcc
FAMILY=pic16
PROC=18f4550
# ASM and program variables
PPROC=PIC18F4550
ASMPROC=18F4550
all: $(SRC:.c=.hex)
comp: $(SRC)
$(CC) --use-non-free -m$(FAMILY) -p$(PROC) $^
clean:
rm -f $(SRC:.c=.asm) $(SRC:.c=.cod) $(SRC:.c=.hex) $(SRC:.c=.lst) $(SRC:.c=.o)
program:
pk2cmd -M -P${PPROC} -Fmain.hex
asm: *.asm
gpasm -p ${ASMPROC} -o main.hex $^
asmp: asm program
.PHONY: all clean

878
c/menu_cuentas/main.asm Executable file
View File

@ -0,0 +1,878 @@
;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.5.0 #15242 (Linux)
;--------------------------------------------------------
; PIC16 port for the Microchip 16-bit core micros
;--------------------------------------------------------
list p=18f4550
radix dec
CONFIG XINST=OFF
CONFIG FOSC=HS
CONFIG WDT=OFF
CONFIG LVP=OFF
CONFIG MCLRE=OFF
;--------------------------------------------------------
; public variables in this module
;--------------------------------------------------------
global _isr
global _tmr_isr
global _number_to_7seg
global _display
global _count1k
global _count1kbak
global _setup
global _main
global _sram_end
global _digit
global _dsp_en
;--------------------------------------------------------
; extern variables in this module
;--------------------------------------------------------
extern _SPPCFGbits
extern _SPPEPSbits
extern _SPPCONbits
extern _UFRMLbits
extern _UFRMHbits
extern _UIRbits
extern _UIEbits
extern _UEIRbits
extern _UEIEbits
extern _USTATbits
extern _UCONbits
extern _UADDRbits
extern _UCFGbits
extern _UEP0bits
extern _UEP1bits
extern _UEP2bits
extern _UEP3bits
extern _UEP4bits
extern _UEP5bits
extern _UEP6bits
extern _UEP7bits
extern _UEP8bits
extern _UEP9bits
extern _UEP10bits
extern _UEP11bits
extern _UEP12bits
extern _UEP13bits
extern _UEP14bits
extern _UEP15bits
extern _PORTAbits
extern _PORTBbits
extern _PORTCbits
extern _PORTDbits
extern _PORTEbits
extern _LATAbits
extern _LATBbits
extern _LATCbits
extern _LATDbits
extern _LATEbits
extern _DDRAbits
extern _TRISAbits
extern _DDRBbits
extern _TRISBbits
extern _DDRCbits
extern _TRISCbits
extern _DDRDbits
extern _TRISDbits
extern _DDREbits
extern _TRISEbits
extern _OSCTUNEbits
extern _PIE1bits
extern _PIR1bits
extern _IPR1bits
extern _PIE2bits
extern _PIR2bits
extern _IPR2bits
extern _EECON1bits
extern _RCSTAbits
extern _TXSTAbits
extern _T3CONbits
extern _CMCONbits
extern _CVRCONbits
extern _CCP1ASbits
extern _ECCP1ASbits
extern _CCP1DELbits
extern _ECCP1DELbits
extern _BAUDCONbits
extern _BAUDCTLbits
extern _CCP2CONbits
extern _CCP1CONbits
extern _ECCP1CONbits
extern _ADCON2bits
extern _ADCON1bits
extern _ADCON0bits
extern _SSPCON2bits
extern _SSPCON1bits
extern _SSPSTATbits
extern _T2CONbits
extern _T1CONbits
extern _RCONbits
extern _WDTCONbits
extern _HLVDCONbits
extern _LVDCONbits
extern _OSCCONbits
extern _T0CONbits
extern _STATUSbits
extern _INTCON3bits
extern _INTCON2bits
extern _INTCONbits
extern _STKPTRbits
extern _SPPDATA
extern _SPPCFG
extern _SPPEPS
extern _SPPCON
extern _UFRM
extern _UFRML
extern _UFRMH
extern _UIR
extern _UIE
extern _UEIR
extern _UEIE
extern _USTAT
extern _UCON
extern _UADDR
extern _UCFG
extern _UEP0
extern _UEP1
extern _UEP2
extern _UEP3
extern _UEP4
extern _UEP5
extern _UEP6
extern _UEP7
extern _UEP8
extern _UEP9
extern _UEP10
extern _UEP11
extern _UEP12
extern _UEP13
extern _UEP14
extern _UEP15
extern _PORTA
extern _PORTB
extern _PORTC
extern _PORTD
extern _PORTE
extern _LATA
extern _LATB
extern _LATC
extern _LATD
extern _LATE
extern _DDRA
extern _TRISA
extern _DDRB
extern _TRISB
extern _DDRC
extern _TRISC
extern _DDRD
extern _TRISD
extern _DDRE
extern _TRISE
extern _OSCTUNE
extern _PIE1
extern _PIR1
extern _IPR1
extern _PIE2
extern _PIR2
extern _IPR2
extern _EECON1
extern _EECON2
extern _EEDATA
extern _EEADR
extern _RCSTA
extern _TXSTA
extern _TXREG
extern _RCREG
extern _SPBRG
extern _SPBRGH
extern _T3CON
extern _TMR3
extern _TMR3L
extern _TMR3H
extern _CMCON
extern _CVRCON
extern _CCP1AS
extern _ECCP1AS
extern _CCP1DEL
extern _ECCP1DEL
extern _BAUDCON
extern _BAUDCTL
extern _CCP2CON
extern _CCPR2
extern _CCPR2L
extern _CCPR2H
extern _CCP1CON
extern _ECCP1CON
extern _CCPR1
extern _CCPR1L
extern _CCPR1H
extern _ADCON2
extern _ADCON1
extern _ADCON0
extern _ADRES
extern _ADRESL
extern _ADRESH
extern _SSPCON2
extern _SSPCON1
extern _SSPSTAT
extern _SSPADD
extern _SSPBUF
extern _T2CON
extern _PR2
extern _TMR2
extern _T1CON
extern _TMR1
extern _TMR1L
extern _TMR1H
extern _RCON
extern _WDTCON
extern _HLVDCON
extern _LVDCON
extern _OSCCON
extern _T0CON
extern _TMR0
extern _TMR0L
extern _TMR0H
extern _STATUS
extern _FSR2L
extern _FSR2H
extern _PLUSW2
extern _PREINC2
extern _POSTDEC2
extern _POSTINC2
extern _INDF2
extern _BSR
extern _FSR1L
extern _FSR1H
extern _PLUSW1
extern _PREINC1
extern _POSTDEC1
extern _POSTINC1
extern _INDF1
extern _WREG
extern _FSR0L
extern _FSR0H
extern _PLUSW0
extern _PREINC0
extern _POSTDEC0
extern _POSTINC0
extern _INDF0
extern _INTCON3
extern _INTCON2
extern _INTCON
extern _PROD
extern _PRODL
extern _PRODH
extern _TABLAT
extern _TBLPTR
extern _TBLPTRL
extern _TBLPTRH
extern _TBLPTRU
extern _PC
extern _PCL
extern _PCLATH
extern _PCLATU
extern _STKPTR
extern _TOS
extern _TOSL
extern _TOSH
extern _TOSU
extern _delay100ktcy
extern __moduint
extern __divuint
;--------------------------------------------------------
; Equates to used internal registers
;--------------------------------------------------------
STATUS equ 0xfd8
PCL equ 0xff9
PCLATH equ 0xffa
PCLATU equ 0xffb
WREG equ 0xfe8
BSR equ 0xfe0
FSR0L equ 0xfe9
FSR0H equ 0xfea
FSR1L equ 0xfe1
FSR2L equ 0xfd9
INDF0 equ 0xfef
POSTINC1 equ 0xfe6
POSTDEC1 equ 0xfe5
PREINC1 equ 0xfe4
PLUSW2 equ 0xfdb
PRODL equ 0xff3
PRODH equ 0xff4
idata
_digit db 0x00, 0x00, 0x00, 0x00
_dsp_en db 0x00
; Internal registers
.registers udata_ovr 0x0000
r0x00 res 1
r0x01 res 1
r0x02 res 1
r0x03 res 1
r0x04 res 1
r0x05 res 1
r0x06 res 1
r0x07 res 1
r0x08 res 1
ustat_main_00 udata 0X07FF
_sram_end res 0
;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
; ; Starting pCode block for absolute section
; ;-----------------------------------------
S_main_ivec_0x1_isr code 0X000008
ivec_0x1_isr:
GOTO _isr
; I code from now on!
; ; Starting pCode block
S_main__main code
_main:
; .line 160; main.c setup();
CALL _setup
_00242_DS_:
; .line 162; main.c count1kbak();
CALL _count1kbak
BRA _00242_DS_
; .line 165; main.c }
RETURN
; ; Starting pCode block
S_main__setup code
_setup:
; .line 121; main.c void setup(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 123; main.c LATD = 0;
CLRF _LATD
; .line 124; main.c TRISD = 0;
CLRF _TRISD
; .line 126; main.c TRISB = 0xff;
MOVLW 0xff
MOVWF _TRISB
; .line 127; main.c LATB = 0x00;
CLRF _LATB
; .line 128; main.c ADCON1 = 0xf;
MOVLW 0x0f
MOVWF _ADCON1
; .line 130; main.c TRISE = 0;
CLRF _TRISE
; .line 131; main.c LATE = 0;
CLRF _LATE
; .line 133; main.c TRISA = 0;
CLRF _TRISA
; .line 134; main.c LATA = 0;
CLRF _LATA
; .line 137; main.c INTCONbits.GIE = 1;
BSF _INTCONbits, 7
; .line 138; main.c INTCONbits.PEIE = 1;
BSF _INTCONbits, 6
; .line 139; main.c INTCONbits.RBIE = 0;
BCF _INTCONbits, 3
; .line 140; main.c INTCON2bits.RBPU = 0;
BCF _INTCON2bits, 7
; .line 141; main.c INTCON2bits.RBIP = 1;
BSF _INTCON2bits, 0
; .line 142; main.c RCONbits.IPEN = 1;
BSF _RCONbits, 7
; .line 145; main.c INTCONbits.TMR0IE = 1;
BSF _INTCONbits, 5
; .line 146; main.c INTCON2bits.TMR0IP = 1;
BSF _INTCON2bits, 2
; .line 148; main.c T0CONbits.T08BIT = 1;
BSF _T0CONbits, 6
; .line 149; main.c T0CONbits.T0CS = 0; // Source internal oscilator
BCF _T0CONbits, 5
; .line 150; main.c T0CONbits.PSA = 0;
BCF _T0CONbits, 3
; .line 154; main.c T0CONbits.T0PS = 0x7;
MOVF _T0CONbits, W
ANDLW 0xf8
IORLW 0x07
MOVWF _T0CONbits
; .line 155; main.c T0CONbits.TMR0ON = 1;
BSF _T0CONbits, 7
; .line 156; main.c }
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__count1kbak code
_count1kbak:
; .line 114; main.c void count1kbak(void) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
; .line 115; main.c for(int i = 9999; i >= 0; i--) {
MOVLW 0x0f
MOVWF r0x00
MOVLW 0x27
MOVWF r0x01
_00229_DS_:
BSF STATUS, 0
BTFSS r0x01, 7
BCF STATUS, 0
BC _00231_DS_
; .line 116; main.c display(i);
MOVF r0x00, W
MOVWF r0x02
MOVF r0x01, W
MOVWF r0x03
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
MOVWF POSTDEC1
CALL _display
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 117; main.c delay100ktcy(5);
MOVLW 0x05
CALL _delay100ktcy
; .line 115; main.c for(int i = 9999; i >= 0; i--) {
MOVLW 0xff
ADDWF r0x00, F
ADDWFC r0x01, F
BRA _00229_DS_
_00231_DS_:
; .line 119; main.c }
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__count1k code
_count1k:
; .line 108; main.c void count1k(void) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
; .line 109; main.c for(int i = 0; i < 9999; i++) {
CLRF r0x00
CLRF r0x01
_00205_DS_:
MOVF r0x01, W
ADDLW 0x80
ADDLW 0x59
BNZ _00222_DS_
MOVLW 0x0f
SUBWF r0x00, W
_00222_DS_:
BC _00207_DS_
; .line 110; main.c display(i);
MOVF r0x00, W
MOVWF r0x02
MOVF r0x01, W
MOVWF r0x03
MOVF r0x03, W
MOVWF POSTDEC1
MOVF r0x02, W
MOVWF POSTDEC1
CALL _display
MOVF POSTINC1, F
MOVF POSTINC1, F
; .line 111; main.c delay100ktcy(5);
MOVLW 0x05
CALL _delay100ktcy
; .line 109; main.c for(int i = 0; i < 9999; i++) {
INFSNZ r0x00, F
INCF r0x01, F
BRA _00205_DS_
_00207_DS_:
; .line 113; main.c }
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__display code
_display:
; .line 98; main.c void display(uint16_t num){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
MOVFF r0x02, POSTDEC1
MOVFF r0x03, POSTDEC1
MOVFF r0x04, POSTDEC1
MOVFF r0x05, POSTDEC1
MOVFF r0x06, POSTDEC1
MOVFF r0x07, POSTDEC1
MOVFF r0x08, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
MOVLW 0x03
MOVFF PLUSW2, r0x01
; .line 100; main.c if (num > 9999) return;
MOVF r0x00, W
MOVWF r0x02
MOVF r0x01, W
MOVWF r0x03
MOVLW 0x27
SUBWF r0x03, W
BNZ _00198_DS_
MOVLW 0x10
SUBWF r0x02, W
_00198_DS_:
BC _00177_DS_
; .line 101; main.c while(num) {
CLRF r0x02
_00174_DS_:
MOVF r0x01, W
IORWF r0x00, W
BZ _00177_DS_
; .line 102; main.c digit[i] = num%10;
MOVLW LOW(_digit)
ADDWF r0x02, W
MOVWF r0x03
CLRF r0x04
MOVLW HIGH(_digit)
ADDWFC r0x04, F
MOVF r0x00, W
MOVWF r0x05
MOVF r0x01, W
MOVWF r0x06
MOVLW 0x00
MOVWF POSTDEC1
MOVLW 0x0a
MOVWF POSTDEC1
MOVF r0x06, W
MOVWF POSTDEC1
MOVF r0x05, W
MOVWF POSTDEC1
CALL __moduint
MOVWF r0x07
MOVFF PRODL, r0x08
MOVLW 0x04
ADDWF FSR1L, F
MOVFF r0x03, FSR0L
MOVFF r0x04, FSR0H
MOVFF r0x07, INDF0
; .line 103; main.c num = num/10;
MOVLW 0x00
MOVWF POSTDEC1
MOVLW 0x0a
MOVWF POSTDEC1
MOVF r0x06, W
MOVWF POSTDEC1
MOVF r0x05, W
MOVWF POSTDEC1
CALL __divuint
MOVWF r0x03
MOVFF PRODL, r0x04
MOVLW 0x04
ADDWF FSR1L, F
MOVF r0x03, W
MOVWF r0x00
MOVF r0x04, W
MOVWF r0x01
; .line 104; main.c i++;
INCF r0x02, F
BRA _00174_DS_
_00177_DS_:
; .line 106; main.c }
MOVFF PREINC1, r0x08
MOVFF PREINC1, r0x07
MOVFF PREINC1, r0x06
MOVFF PREINC1, r0x05
MOVFF PREINC1, r0x04
MOVFF PREINC1, r0x03
MOVFF PREINC1, r0x02
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__number_to_7seg code
_number_to_7seg:
; .line 60; main.c uint8_t number_to_7seg(uint8_t number) {
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVLW 0x02
MOVFF PLUSW2, r0x00
; .line 61; main.c switch (number) {
MOVLW 0x10
SUBWF r0x00, W
BTFSC STATUS, 0
BRA _00156_DS_
CLRF PCLATH
CLRF PCLATU
RLCF r0x00, W
RLCF PCLATH, F
RLCF WREG, W
RLCF PCLATH, F
ANDLW 0xfc
ADDLW LOW(_00167_DS_)
MOVWF POSTDEC1
MOVLW HIGH(_00167_DS_)
ADDWFC PCLATH, F
MOVLW UPPER(_00167_DS_)
ADDWFC PCLATU, F
MOVF PREINC1, W
MOVWF PCL
_00167_DS_:
GOTO _00140_DS_
GOTO _00141_DS_
GOTO _00142_DS_
GOTO _00143_DS_
GOTO _00144_DS_
GOTO _00145_DS_
GOTO _00146_DS_
GOTO _00147_DS_
GOTO _00148_DS_
GOTO _00149_DS_
GOTO _00150_DS_
GOTO _00151_DS_
GOTO _00152_DS_
GOTO _00153_DS_
GOTO _00154_DS_
GOTO _00155_DS_
_00140_DS_:
; .line 63; main.c return 0x3F;
MOVLW 0x3f
BRA _00158_DS_
_00141_DS_:
; .line 65; main.c return 0x06;
MOVLW 0x06
BRA _00158_DS_
_00142_DS_:
; .line 67; main.c return 0x5B;
MOVLW 0x5b
BRA _00158_DS_
_00143_DS_:
; .line 69; main.c return 0x4F;
MOVLW 0x4f
BRA _00158_DS_
_00144_DS_:
; .line 71; main.c return 0x66;
MOVLW 0x66
BRA _00158_DS_
_00145_DS_:
; .line 73; main.c return 0x6D;
MOVLW 0x6d
BRA _00158_DS_
_00146_DS_:
; .line 75; main.c return 0x7D;
MOVLW 0x7d
BRA _00158_DS_
_00147_DS_:
; .line 77; main.c return 0x07;
MOVLW 0x07
BRA _00158_DS_
_00148_DS_:
; .line 79; main.c return 0x7F;
MOVLW 0x7f
BRA _00158_DS_
_00149_DS_:
; .line 81; main.c return 0x6F;
MOVLW 0x6f
BRA _00158_DS_
_00150_DS_:
; .line 83; main.c return 0x77;
MOVLW 0x77
BRA _00158_DS_
_00151_DS_:
; .line 85; main.c return 0x7c;
MOVLW 0x7c
BRA _00158_DS_
_00152_DS_:
; .line 87; main.c return 0x39;
MOVLW 0x39
BRA _00158_DS_
_00153_DS_:
; .line 89; main.c return 0x5e;
MOVLW 0x5e
BRA _00158_DS_
_00154_DS_:
; .line 91; main.c return 0x79;
MOVLW 0x79
BRA _00158_DS_
_00155_DS_:
; .line 93; main.c return 0x71;
MOVLW 0x71
BRA _00158_DS_
_00156_DS_:
; .line 95; main.c return 0;
CLRF WREG
_00158_DS_:
; .line 97; main.c }
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__tmr_isr code
_tmr_isr:
; .line 37; main.c void tmr_isr(void){
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
MOVFF r0x00, POSTDEC1
MOVFF r0x01, POSTDEC1
; .line 38; main.c LATA = LATE = 0;
CLRF _LATE
CLRF _LATA
; .line 39; main.c LATD = number_to_7seg(digit[dsp_en]);
MOVLW LOW(_digit)
BANKSEL _dsp_en
ADDWF _dsp_en, W, B
MOVWF r0x00
CLRF r0x01
MOVLW HIGH(_digit)
ADDWFC r0x01, F
MOVFF r0x00, FSR0L
MOVFF r0x01, FSR0H
MOVFF INDF0, r0x00
MOVF r0x00, W
MOVWF POSTDEC1
CALL _number_to_7seg
MOVWF _LATD
MOVF POSTINC1, F
; .line 40; main.c switch (dsp_en) {
MOVLW 0x04
BANKSEL _dsp_en
SUBWF _dsp_en, W, B
BC _00116_DS_
CLRF PCLATH
CLRF PCLATU
BANKSEL _dsp_en
RLCF _dsp_en, W, B
RLCF PCLATH, F
RLCF WREG, W
RLCF PCLATH, F
ANDLW 0xfc
ADDLW LOW(_00134_DS_)
MOVWF POSTDEC1
MOVLW HIGH(_00134_DS_)
ADDWFC PCLATH, F
MOVLW UPPER(_00134_DS_)
ADDWFC PCLATU, F
MOVF PREINC1, W
MOVWF PCL
_00134_DS_:
GOTO _00112_DS_
GOTO _00113_DS_
GOTO _00114_DS_
GOTO _00115_DS_
_00112_DS_:
; .line 42; main.c LATA = 0;
CLRF _LATA
; .line 43; main.c LATE = 0x4;
MOVLW 0x04
MOVWF _LATE
; .line 44; main.c break;
BRA _00116_DS_
_00113_DS_:
; .line 46; main.c LATE = 0x2;
MOVLW 0x02
MOVWF _LATE
; .line 47; main.c break;
BRA _00116_DS_
_00114_DS_:
; .line 49; main.c LATE = 0x1;
MOVLW 0x01
MOVWF _LATE
; .line 50; main.c break;
BRA _00116_DS_
_00115_DS_:
; .line 52; main.c LATE = 0;
CLRF _LATE
; .line 53; main.c LATA = 0x10;
MOVLW 0x10
MOVWF _LATA
_00116_DS_:
BANKSEL _dsp_en
; .line 56; main.c dsp_en++;
INCF _dsp_en, F, B
; .line 57; main.c if (dsp_en > 3) dsp_en = 0;
MOVLW 0x04
BANKSEL _dsp_en
SUBWF _dsp_en, W, B
BNC _00119_DS_
BANKSEL _dsp_en
CLRF _dsp_en, B
_00119_DS_:
; .line 58; main.c }
MOVFF PREINC1, r0x01
MOVFF PREINC1, r0x00
MOVFF PREINC1, FSR2L
RETURN
; ; Starting pCode block
S_main__isr code
_isr:
; .line 29; main.c void isr(void) __interrupt (1) {
MOVFF STATUS, POSTDEC1
MOVFF BSR, POSTDEC1
MOVWF POSTDEC1
MOVFF PRODL, POSTDEC1
MOVFF PRODH, POSTDEC1
MOVFF FSR0L, POSTDEC1
MOVFF FSR0H, POSTDEC1
MOVFF PCLATH, POSTDEC1
MOVFF PCLATU, POSTDEC1
MOVFF FSR2L, POSTDEC1
MOVFF FSR1L, FSR2L
; .line 30; main.c if (INTCONbits.TMR0IF){
BTFSS _INTCONbits, 2
BRA _00106_DS_
; .line 31; main.c tmr_isr();
CALL _tmr_isr
; .line 32; main.c TMR0 = RATE;
MOVLW 0xe6
MOVWF _TMR0
_00106_DS_:
; .line 34; main.c INTCONbits.TMR0IF = 0;
BCF _INTCONbits, 2
; .line 35; main.c }
MOVFF PREINC1, FSR2L
MOVFF PREINC1, PCLATU
MOVFF PREINC1, PCLATH
MOVFF PREINC1, FSR0H
MOVFF PREINC1, FSR0L
MOVFF PREINC1, PRODH
MOVFF PREINC1, PRODL
MOVF PREINC1, W
MOVFF PREINC1, BSR
MOVFF PREINC1, STATUS
RETFIE
; Statistics:
; code size: 974 (0x03ce) bytes ( 0.74%)
; 487 (0x01e7) words
; udata size: 0 (0x0000) bytes ( 0.00%)
; access size: 9 (0x0009) bytes
end

165
c/menu_cuentas/main.c Executable file
View File

@ -0,0 +1,165 @@
#include <delay.h>
#include <pic18fregs.h>
#include <stdint.h>
// FUSES START
#pragma config XINST = OFF
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF
#define NDIGITS 4
#define RATE 230
uint8_t digit[NDIGITS] = { 0 };
uint8_t dsp_en = 0;
void isr(void) __interrupt (1);
void tmr_isr(void);
uint8_t number_to_7seg(uint8_t);
void display(uint16_t);
void count1k(void);
void count1kbak(void);
void setup(void);
int main(void);
void isr(void) __interrupt (1) {
if (INTCONbits.TMR0IF){
tmr_isr();
TMR0 = RATE;
}
INTCONbits.TMR0IF = 0;
}
void tmr_isr(void){
LATA = LATE = 0;
LATD = number_to_7seg(digit[dsp_en]);
switch (dsp_en) {
case 0:
LATA = 0;
LATE = 0x4;
break;
case 1:
LATE = 0x2;
break;
case 2:
LATE = 0x1;
break;
case 3:
LATE = 0;
LATA = 0x10;
break;
}
dsp_en++;
if (dsp_en > 3) dsp_en = 0;
}
uint8_t number_to_7seg(uint8_t number) {
switch (number) {
case 0:
return 0x3F;
case 1:
return 0x06;
case 2:
return 0x5B;
case 3:
return 0x4F;
case 4:
return 0x66;
case 5:
return 0x6D;
case 6:
return 0x7D;
case 7:
return 0x07;
case 8:
return 0x7F;
case 9:
return 0x6F;
case 0xa:
return 0x77;
case 0xb:
return 0x7c;
case 0xC:
return 0x39;
case 0xd:
return 0x5e;
case 0xe:
return 0x79;
case 0xf:
return 0x71;
default:
return 0;
}
}
void display(uint16_t num){
uint8_t i = 0;
if (num > 9999) return;
while(num) {
digit[i] = num%10;
num = num/10;
i++;
}
}
void count1k(void) {
for(int i = 0; i < 9999; i++) {
display(i);
delay100ktcy(5);
}
}
void count1kbak(void) {
for(int i = 9999; i >= 0; i--) {
display(i);
delay100ktcy(5);
}
}
void setup(void){
/* Port setup */
LATD = 0;
TRISD = 0;
TRISB = 0xff;
LATB = 0x00;
ADCON1 = 0xf;
TRISE = 0;
LATE = 0;
TRISA = 0;
LATA = 0;
/* Interrupt setup */
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.RBIE = 0;
INTCON2bits.RBPU = 0;
INTCON2bits.RBIP = 1;
RCONbits.IPEN = 1;
/* timer interrupt setup */
INTCONbits.TMR0IE = 1;
INTCON2bits.TMR0IP = 1;
T0CONbits.T08BIT = 1;
T0CONbits.T0CS = 0; // Source internal oscilator
T0CONbits.PSA = 0;
//T0CONbits.T0PS0 = 1;
//T0CONbits.T0PS1 = 1;
//T0CONbits.T0PS2 = 1;
T0CONbits.T0PS = 0x7;
T0CONbits.TMR0ON = 1;
}
int main(void) {
uint16_t cuenta = 0;
setup();
for (;;) {
count1kbak();
}
return 0;
}

110
c/menu_cuentas/main.hex Executable file
View File

@ -0,0 +1,110 @@
:020000040000FA
:040000008DEF01F08F
:08000800D3EF02F0D9CFE5FFB0
:10001000E1CFD9FF00C0E5FF01C0E5FF02C0E5FF69
:1000200003C0E5FF04C0E5FF05C0E5FF06C0E5FF2E
:1000300007C0E5FF08C0E5FF020EDBCF00F0030EAE
:10004000DBCF01F00050026E0150036E270E035CFF
:1000500002E1100E025C38E2026A0150001034E046
:10006000600E0224036E046A000E04220050056E26
:100070000150066E000EE56E0A0EE56E0650E56E46
:100080000550E56EDBEC00F0076EF3CF08F0040ED0
:10009000E12603C0E9FF04C0EAFF07C0EFFF000E3E
:1000A000E56E0A0EE56E0650E56E0550E56EE2EC73
:1000B00001F0036EF3CF04F0040EE1260350006E4E
:1000C0000450016E022AC9D7E4CF08F0E4CF07F04C
:1000D000E4CF06F0E4CF05F0E4CF04F0E4CF03F082
:1000E000E4CF02F0E4CF01F0E4CF00F0E4CFD9FF99
:1000F0001200D9CFE5FFE1CFD9FF00C0E5FF020E26
:10010000DBCF00F0100E005CD8B04FD0FA6AFB6A6B
:100110000034FA36E834FA36FC0B2A0FE56E010E8D
:10012000FA22000EFB22E450F96EB5EF00F0B7EFB3
:1001300000F0B9EF00F0BBEF00F0BDEF00F0BFEF53
:1001400000F0C1EF00F0C3EF00F0C5EF00F0C7EF23
:1001500000F0C9EF00F0CBEF00F0CDEF00F0CFEFF3
:1001600000F0D1EF00F0D3EF00F03F0E1FD0060EED
:100170001DD05B0E1BD04F0E19D0660E17D06D0E22
:1001800015D07D0E13D0070E11D07F0E0FD06F0E3D
:100190000DD0770E0BD07C0E09D0390E07D05E0E35
:1001A00005D0790E03D0710E01D0E86AE4CF00F0DB
:1001B000E4CFD9FF1200D9CFE5FFE1CFD9FF00C0CE
:1001C000E5FF01C0E5FF02C0E5FF03C0E5FF04C095
:1001D000E5FF05C0E5FF06C0E5FF020EDBCF00F03E
:1001E000030EDBCF01F0040EDBCF02F0050EDBCFF8
:1001F00003F0046A056A0350800BE844066E06505B
:1002000011E10250022603360350015C02E1025064
:10021000005C04E2D8900332023204D0052A05C003
:1002200004F0E9D70350015C02E10250005C04E3F2
:100230000250005E0350015AD8900332023204C0CB
:1002400005F004060550EEE101C0F3FF0050E4CFD5
:1002500006F0E4CF05F0E4CF04F0E4CF03F0E4CF00
:1002600002F0E4CF01F0E4CF00F0E4CFD9FF1200B8
:10027000D9CFE5FFE1CFD9FF00C0E5FF01C0E5FF21
:100280008D6A896A600E00016425006E016A000EA5
:10029000012200C0E9FF01C0EAFFEFCF00F00050EB
:1002A000E56E79EC00F08C6EE652040E0001645DA0
:1002B00025E2FA6AFB6A00016435FA36E834FA3658
:1002C000FC0BD20FE56E020EFA22000EFB22E45068
:1002D000F96E71EF01F075EF01F078EF01F07BEF4F
:1002E00001F0896A040E8D6E09D0020E8D6E06D063
:1002F000010E8D6E03D08D6A100E896E0001642B85
:10030000040E0001645D02E30001646BE4CF01F0C0
:10031000E4CF00F0E4CFD9FF120011EEFFF021EEA0
:10032000FFF0F86AA68EA69C07EEFFF00068ED6A63
:100330000050FDE14A0EF66E060EF76E000EF86EE6
:100340000900F5CF05F00900F5CF06F034D009001B
:10035000F5CF00F00900F5CF01F00900F5CF02F06C
:1003600009000900F5CFE9FF0900F5CFEAFF090010
:1003700009000900F5CF03F00900F5CF04F00900EA
:100380000900F6CF07F0F7CF08F0F8CF09F000C06A
:10039000F6FF01C0F7FF02C0F8FF03D00900F5CF58
:1003A000EEFF0306FBE20406F9E207C0F6FF08C011
:1003B000F7FF09C0F8FF0506CAE20606C8E22CEC02
:1003C00003F0FFD7D9CFE5FFE1CFD9FF00C0E5FFAC
:1003D00001C0E5FF02C0E5FF03C0E5FF04C0E5FF83
:1003E00005C0E5FF06C0E5FF07C0E5FF020EDBCF55
:1003F00000F0030EDBCF01F0040EDBCF02F0050EA0
:10040000DBCF03F0046A056A100E066E0150800B04
:10041000E844076E005000260136045004260536D5
:100420000750D8A404800350055C02E10250045C2C
:1004300005E30250045E0350055A0080060606508C
:10044000E5E101C0F3FF0050E4CF07F0E4CF06F090
:10045000E4CF05F0E4CF04F0E4CF03F0E4CF02F002
:10046000E4CF01F0E4CF00F0E4CFD9FF1200E806BA
:10047000E56E630E50EC02F0630E63EC02F0E450A4
:100480000EE000D0E56E630E50EC02F0630E63ECFC
:1004900002F000D000D00000E450E82EF3D71200A4
:1004A000E806E56E630E63EC02F0E4500BE000D06A
:1004B000E56E630E63EC02F000D000D00000E45063
:1004C000E82EF6D71200E8060000E85007E000D05A
:1004D00000D000D000D00000E82EFAD71200D9CF0B
:1004E000E5FFE1CFD9FF00C0E5FF01C0E5FF02C095
:1004F000E5FF03C0E5FF0F0E006E270E016ED880EA
:1005000001AED89013E20050026E0150036E03500A
:10051000E56E0250E56E06EC00F0E652E652050E7E
:1005200037EC02F0FF0E00260122E9D7E4CF03F0FA
:10053000E4CF02F0E4CF01F0E4CF00F0E4CFD9FF44
:100540001200D9CFE5FFE1CFD9FF00C0E5FF01C020
:10055000E5FF02C0E5FF03C0E5FF006A016A015044
:10056000800F590F02E10F0E005C12E20050026E84
:100570000150036E0350E56E0250E56E06EC00F08C
:10058000E652E652050E37EC02F0004A012AE7D7A0
:10059000E4CF03F0E4CF02F0E4CF01F0E4CF00F0C9
:1005A000E4CFD9FF1200D8CFE5FFE0CFE5FFE56E3D
:1005B000F3CFE5FFF4CFE5FFE9CFE5FFEACFE5FFB5
:1005C000FACFE5FFFBCFE5FFD9CFE5FFE1CFD9FFBC
:1005D000F2A404D038EC01F0E60ED66EF294E4CF2B
:1005E000D9FFE4CFFBFFE4CFFAFFE4CFEAFFE4CF8B
:1005F000E9FFE4CFF4FFE4CFF3FFE450E4CFE0FF02
:10060000E4CFD8FF1000D9CFE5FFE1CFD9FF8C6A46
:10061000956AFF0E936E8A6A0F0EC16E966A8D6A96
:10062000926A896AF28EF28CF296F19EF180D08EF7
:10063000F28AF184D58CD59AD596D550F80B070956
:10064000D56ED58EE4CFD9FF1200010064060000FC
:10065000600000000600000003EC03F06FEC02F005
:0A066000FDD71200000000000000AA
:020000040030CA
:010001000CF2
:010003001EDE
:02000500038175
:00000001FF

32
c/menu_cuentas/makefile Executable file
View File

@ -0,0 +1,32 @@
# My pic workflow makefile by Fernando R Jacobo
# Dependencies
# SDCC Small Device C Compiler
# pk2cmd for pickit pic programmers
# C compiler variables
SRC=*.c
CC=sdcc
FAMILY=pic16
PROC=18f4550
# ASM and program variables
PPROC=PIC18F4550
ASMPROC=18F4550
all: $(SRC:.c=.hex)
comp: $(SRC)
$(CC) --use-non-free -m$(FAMILY) -p$(PROC) $^
clean:
rm -f $(SRC:.c=.asm) $(SRC:.c=.cod) $(SRC:.c=.hex) $(SRC:.c=.lst) $(SRC:.c=.o)
program:
pk2cmd -M -P${PPROC} -Fmain.hex
asm: *.asm
gpasm -p ${ASMPROC} -o main.hex $^
asmp: asm program
.PHONY: all clean

View File

@ -1,31 +0,0 @@
#include <pic18f4550.h>
#include <stdint.h>
// Use this to define the interrupt vector for high-priority interrupts
void interrupt high_priority isr(void) {
// Check if it's a PORTB change interrupt
if (INTCON.RBIF) {
// Handle the change here
// Example: toggle a pin, read input, etc.
// Clear the interrupt flag
INTCON.RBIF = 0;
}
}
void main(void) {
// Set PORTB pins RB4-RB7 as input
TRISB |= 0xF0; // Set RB4-RB7 as input (1)
// Enable PORTB change interrupt
INTCON.RBIE = 1; // Enable PORTB change interrupt
INTCON.RBIF = 0; // Clear PORTB interrupt flag
INTCON.GIE = 1; // Enable global interrupts
INTCON.PEIE = 1; // Enable peripheral interrupts (recommended)
// Main loop
while (1) {
// Your main code here (e.g., sleep, check flags, etc.)
}
}