Advertisement
kekellner

Multiplexado de displays de 7 segmentos

Mar 31st, 2021
2,964
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 8.23 KB | None | 0 0
  1. ;-------------------------------------------------------------------------------
  2. ;
  3. ;  Archivo:   main.s
  4. ;  Fecha de creación/modificación: 22 Febrero 2021
  5. ;  Author original: Jose Morales
  6. ;  Modificado por: Kurt Kellner
  7. ;  Dispositivo: PIC16F887
  8. ;  Descripción: Ejemplo de multiplexado, macros y el simulador de MPLAB X
  9. ;  Hardware: (Explicar qué está conectado en dónde)
  10. ;
  11. ;-------------------------------------------------------------------------------
  12.  
  13. ;-------------------------------------------------------------------------------
  14. ; Librerías incluidas
  15. ;-------------------------------------------------------------------------------
  16.  
  17. PROCESSOR 16F887
  18. #include <xc.inc>
  19.  
  20. ;-------------------------------------------------------------------------------
  21. ; Palabras de configuración
  22. ;-------------------------------------------------------------------------------
  23.  
  24. ; CONFIG1
  25.   CONFIG  FOSC = XT             ; Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
  26.   CONFIG  WDTE = OFF            ; Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
  27.   CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)
  28.   CONFIG  MCLRE = OFF           ; RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
  29.   CONFIG  CP = OFF              ; Code Protection bit (Program memory code protection is disabled)
  30.   CONFIG  CPD = OFF             ; Data Code Protection bit (Data memory code protection is disabled)
  31.   CONFIG  BOREN = OFF           ; Brown Out Reset Selection bits (BOR disabled)
  32.   CONFIG  IESO = OFF            ; Internal External Switchover bit (Internal/External Switchover mode is disabled)
  33.   CONFIG  FCMEN = OFF           ; Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
  34.   CONFIG  LVP = OFF             ; Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
  35.  
  36. ; CONFIG2
  37.   CONFIG  BOR4V = BOR40V        ; Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
  38.   CONFIG  WRT = OFF             ; Flash Program Memory Self Write Enable bits (Write protection off)
  39.  
  40.  
  41. ;-------------------------------------------------------------------------------
  42. ; Macros
  43. ;-------------------------------------------------------------------------------
  44.  
  45. movlf macro arg1, arg2
  46.     movlw   arg1
  47.     movwf   arg2
  48.     endm
  49.  
  50. restartTMR0 macro
  51.     movlf   61, TMR0
  52.     bcf    T0IF
  53.     endm
  54.  
  55. ;pinMode(pin, INPUT/OUTPUT);
  56.  
  57. pinMode macro argPin, argPort, argIO
  58.     banksel TRISA
  59.     IF argIO
  60.     bsf     argPort, argPin
  61.     ELSE
  62.     bcf     argPort, argPin
  63.     ENDIF
  64.     ENDM
  65.  
  66. down MACRO count
  67.     LOCAL   more
  68.     more:   decfsz count
  69.         goto more
  70.     ENDM
  71.  
  72.  
  73. ;digitalWrite(pin, HIGH/LOW);
  74.  
  75. ; 2 + 1 + 2 + 1 = 6 líneas de código
  76. digitalWrite macro argPin, argPort, argHL
  77.     banksel TRISA
  78.     bsf     argPort, argPin
  79.     banksel PORTA
  80.     IF argIO
  81.     bsf     argPort, argPin
  82.     ELSE
  83.     bcf     argPort, argPin
  84.     ENDIF
  85.     ENDM
  86. ;-------------------------------------------------------------------------------
  87. ; Variables
  88. ;-------------------------------------------------------------------------------
  89.  
  90. ; Para hacer que todas las variables sean globales (se puedan usar en más
  91. ; módulos)
  92. GLOBAL W_TEMP, STATUS_TEMP, banderas, display, nibble, count, test
  93.  
  94. PSECT vars, space=1, class=udata
  95. count:      DS 1
  96. test:       DS 1
  97.  
  98.    
  99. PSECT udata_shr ;common memory, 16 espacios
  100. W_TEMP:     DS  1
  101. STATUS_TEMP:    DS  1
  102. banderas:   DS  1
  103. ; Los bits que representan nuestra variable "banderas"
  104. displayValue    EQU 0
  105. DP0     EQU 1
  106. display:    DS  2
  107. nibble:     DS  2
  108.  
  109. ;-------------------------------------------------------------------------------
  110. ; Vector de Reset
  111. ;-------------------------------------------------------------------------------
  112.  
  113. PSECT resetVector, delta=2
  114. ;linker: -PresetVector=0x0000
  115.     goto main
  116.  
  117. ;-------------------------------------------------------------------------------
  118. ; Vector de Interrupción
  119. ;-------------------------------------------------------------------------------
  120.  
  121. PSECT interruptVector, delta=2
  122. ;linker: -PinterruptVector=0x0004
  123. push:
  124.     movwf   W_TEMP
  125.     swapf   STATUS, W
  126.     movwf   STATUS_TEMP
  127. isr:
  128.     btfss   TMR0IF
  129.     goto    pop
  130.     restartTMR0
  131.     bsf     banderas, displayValue
  132.     ;call    display_var
  133.        
  134. pop:
  135.     swapf   STATUS_TEMP, W
  136.     movwf   STATUS
  137.     swapf   W_TEMP, F
  138.     swapf   W_TEMP, W
  139.     retfie
  140.  
  141. ;-------------------------------------------------------------------------------
  142. ; Loop principal
  143. ;-------------------------------------------------------------------------------
  144.  
  145. PSECT code, delta=2
  146. ;linker: -PloopPrincipal=0x0100
  147.  
  148. ;PSECT loopPrincipal, class=code, delta=2, abs
  149. ;ORG 0x0100
  150.  
  151. tabla_7seg:
  152.     andlw   00001111B   ; no saltar más del tamaño de la tabla
  153.     addwf   PCL
  154.     retlw   00111111B   ;0
  155.     retlw   00000110B   ;1
  156.     retlw   01011011B   ;2
  157.     retlw   01001111B   ;3
  158.     retlw   01100110B   ;4
  159.     retlw   01101101B   ;5
  160.     retlw   01111101B   ;6
  161.     retlw   00000111B   ;7
  162.     retlw   01111111B   ;8
  163.     retlw   01101111B   ;9
  164.     retlw   01110111B   ;A
  165.     retlw   01111100B   ;b
  166.     retlw   00111001B   ;C
  167.     retlw   01011110B   ;d
  168.     retlw   01111001B   ;E
  169.     retlw   01110001B   ;F
  170.     retlw   0
  171.  
  172. main:
  173. ;    movlw   0xAA
  174. ;    movwf   test
  175. ;    bsf     flags, displayValue
  176. ;    bsf     flags, flag2
  177. ;    bsf     flags, flag4
  178. ;    bsf     flags2, flag20
  179. ;    bsf        flags2, flag27
  180. ;    bsf        flags2, flag28
  181.     call    config_io
  182.     call    config_tmr0
  183.     call    config_interrupt
  184.     call    config_reloj
  185.     banksel PORTA
  186.  
  187. loop:
  188.     btfsc   PORTB, 0
  189.     call    inc_count
  190.      
  191.     btfsc   PORTB, 1
  192.     call    dec_count
  193.    
  194.     call    separar_nibbles
  195.     call    preparar_displays
  196.    
  197.     btfsc   banderas, displayValue
  198.     call    display_var
  199.  
  200.     goto    loop
  201.  
  202. ;-------------------------------------------------------------------------------
  203. ; Subrutinas de configuración
  204. ;-------------------------------------------------------------------------------
  205.  
  206. config_io:
  207.     banksel TRISC
  208.     clrf    TRISA
  209.     bsf     TRISB, 0
  210.     bsf     TRISB, 1
  211.     clrf    TRISC
  212.     bcf     TRISD, 0
  213.     bcf     TRISD, 1
  214.    
  215.     banksel ANSEL
  216.     clrf    ANSEL
  217.     clrf    ANSELH
  218.     banksel PORTC
  219.     clrf    PORTC
  220.     clrf    PORTD
  221.     return
  222.  
  223. config_reloj:
  224.     banksel OSCCON
  225.     bsf     IRCF2  
  226.     bsf     IRCF1
  227.     bcf     IRCF0   ; IRCF = 110 = 4MHz
  228.     bsf     SCS     ; Internal oscilator for system clock
  229.     return
  230.    
  231. config_tmr0:
  232.     banksel OPTION_REG
  233.     bcf     T0CS
  234.     bcf     PSA
  235.     bsf     PS2
  236.     bsf     PS1
  237.     bsf     PS0
  238.     banksel PORTA
  239.     restartTMR0
  240.     return
  241.    
  242. config_interrupt:
  243.     bsf     T0IE    ;INTCON, 101B
  244.     bcf     TMR0IF
  245.     bsf     GIE
  246.     return
  247.  
  248. /*
  249. restart_tmr0:
  250.     movlw  61
  251.     movwf  TMR0
  252.     bcf    T0IF
  253.     return  
  254. */
  255.  
  256. ;-------------------------------------------------------------------------------
  257. ; Subrutinas contador
  258. ;-------------------------------------------------------------------------------
  259.  
  260. inc_count:
  261.     btfsc   PORTB, 0
  262.     goto    $-1
  263.     incf    count, F
  264.     return
  265.  
  266. dec_count:
  267.     btfsc   PORTB, 1
  268.     goto    $-1
  269.     decf    count, F
  270.     return
  271.  
  272. ;-------------------------------------------------------------------------------
  273. ; Subrutinas display
  274. ;-------------------------------------------------------------------------------
  275.  
  276. separar_nibbles:
  277.     movf    count, W
  278.     andlw   00001111B
  279.     movwf   nibble
  280.     swapf   count, W
  281.     andlw   00001111B
  282.     movwf   nibble+1
  283.     return
  284.  
  285. preparar_displays:
  286.     movf    nibble, W
  287.     call    tabla_7seg
  288.     movwf   display
  289.    
  290.     movf    nibble+1, W
  291.     call    tabla_7seg
  292.     movwf   display+1
  293.     return
  294.  
  295. display_var:
  296.     clrf    PORTD
  297.     btfsc   banderas, DP0
  298.     goto    display_1
  299.     goto    display_0
  300. display_0:
  301.     movf    display, W
  302.     movwf   PORTC
  303.     bsf     PORTD, 0
  304.     goto    toggle_display
  305. display_1:
  306.     movf    display+1, W
  307.     movwf   PORTC
  308.     bsf     PORTD, 1
  309.     goto toggle_display  
  310. toggle_display:    
  311.     movlw   0x02
  312.     xorwf   banderas, f
  313.     bcf     banderas, displayValue
  314.     return
  315.  
  316. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement