[其它] 【Curiosity试用】3.PIC16F1619汇编实例二

[复制链接]
1756|2
 楼主| JLennon 发表于 2018-3-2 08:39 | 显示全部楼层 |阅读模式
本帖最后由 JLennon 于 2018-3-7 15:02 编辑

  【Curiosity试用】3.PIC16F1619汇编实例二
  闪灯实例
  1.功能说明
  利用timer0触发中断,实现跑马灯。
  2.硬件电路
  D4~D7阴极接地,阳极分别接至RA5、RA1、RA2、RC5。当对应的引脚输出高电平时,则该LED点亮。
  Curiosity开发板无外置晶振,所以系统时钟源选用内部时钟源。
  3.软件设计
  (1)程序关键点分析
  RA和RC端口需要被配置为输出方向,初始化端口输出全为低电平,即D4~D7处于全灭状态。当
  RA5输出高电平,其他引脚输出低电平,则D4亮;延时250ms后,RA1输出高电平,其他引脚输出低电
  平,则D5亮;如此循环,则实现了跑马灯效果。延时利用timer0定时触发中断。在进行程序设计时,
  主要涉及的内容如下:
  1)选择配置字,设置系统时钟为内部时钟源。
  2)初始化与内部时钟源相关的寄存器和I/O端口,见PIC16F1619的datasheet的5.6章节。
  2)主程序只有做一件事,无限循环。
  3)中断服务程序判断timer0是否溢出,然后调用子程序。
  4)其余子程序进行循环点灯,timer0重置等操作。
  (2)程序流程图
图像 11.png
  (3)汇编源程序
  1)Timer0初始值如何设置:
  由于timer0是一个8位递增定时计数器,最多256分频,要实现250ms延时,就必须选取MHZ以下
  的频率,这里我们选用500KHZ,同时预分频比选择1:256分频。
  PIC单片机1个指令周期占用4个时钟周期,对于500KHZ的时钟频率,时钟周期为2μs,指令周期为
  8μs。256倍分频后,时钟周期为512μs,指令周期为2048μs。250ms延时,约等于122个指令周期。
  TMR0寄存器从FFh上溢到00h时,将产生Timer0中断。那么timer0初始值就等于255(FFh)+1-122=
  134(0x86)。
  2)源程序
  1. #include "p16f1619.inc"

  2. ; CONFIG1
  3. ; __config 0xFFFC
  4. __CONFIG _CONFIG1, _FOSC_INTOSC & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  5. ; CONFIG2
  6. ; __config 0xFEFF
  7. __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCD_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_ON
  8. ; CONFIG3
  9. ; __config 0xFF9F
  10. __CONFIG _CONFIG3, _WDTCPS_WDTCPS1F & _WDTE_OFF & _WDTCWS_WDTCWSSW & _WDTCCS_SWC
  11. ;*******************************************************************************
  12. CBLOCK 0x20
  13.     SHIFTDAT
  14. ENDC
  15. RES_VECT  CODE    0x0000            ; processor reset vector
  16.     GOTO    START                   ; go to beginning of program

  17. ;*******************************************************************************
  18. ISR       CODE    0x0004           ; interrupt vector location
  19. BRA            ISR
  20. ;*******************************************************************************
  21. ; MAIN PROGRAM
  22. ;*******************************************************************************
  23. MAIN_PROG CODE                      ; let linker place main program

  24. START
  25.     ;***************************************************************************
  26.     ;初始化时钟
  27.     BANKSEL        OSCCON
  28.     MOVLW        0x38
  29.     MOVWF        OSCCON
  30.     ;***************************************************************************
  31.     ;初始化I/O
  32.     BANKSEL        PORTA
  33.     CLRF        PORTA
  34.     CLRF        PORTC
  35.     BANKSEL        ANSELA
  36.     CLRF        ANSELA
  37.     CLRF        ANSELC
  38.     BANKSEL        TRISA
  39.     CLRF        TRISA
  40.     CLRF        TRISC
  41.     ;***************************************************************************
  42.     ;初始化Timer0
  43.     MOVLW        0xD7                        ;禁止弱上拉,上升沿触发,timer0时钟FOSC/4
  44.     BANKSEL        OPTION_REG                ;在T0CKI引脚信号从高至低跳变时,递增计数
  45.     OPTION                                ;预分频器分配给Timer0模块,预分频比1:256
  46.     CLRF        BSR                        ;转到Bank0
  47.     MOVLW        0x86
  48.     MOVWF        TMR0
  49.     BCF                INTCON,            TMR0IF        ;清中断标识
  50.     BSF                INTCON,            TMR0IE        ;开中断
  51.     ;***************************************************************************
  52.     ;开中断
  53.     BSF                INTCON,            GIE   
  54.     BSF                INTCON,            TMR0IE
  55. MAIN
  56.     GOTO        $
  57. ;*******************************************************************************
  58. ;中断服务程序
  59. ISR
  60.     BTFSC        INTCON,            TMR0IF        ;TMR0中断标志为0,,则跳过下一条指令
  61.     CALL        BLINK   
  62.     RETFIE
  63. BLINK
  64.     BTFSC        SHIFTDAT,   4        
  65.     CALL        RELOAD               
  66.     MOVLW        0x01               
  67.     ANDWF        SHIFTDAT,   W        
  68.     BTFSC        WREG,            0        
  69.     CALL        D4ON               
  70.     MOVLW        0x02               
  71.     ANDWF        SHIFTDAT,   W        
  72.     BTFSC        WREG,            1        
  73.     CALL        D5ON                    
  74.     MOVLW        0x04
  75.     ANDWF        SHIFTDAT,   W
  76.     BTFSC        WREG,            2
  77.     CALL        D6ON   
  78.     MOVLW        0x08
  79.     ANDWF        SHIFTDAT,   W
  80.     BTFSC        WREG,            3
  81.     CALL        D7ON   
  82.     RLF                SHIFTDAT,   F
  83.     CALL        RELOADTMR0
  84.     RETURN
  85. ;*******************************************************************************
  86. ;点亮D4   
  87. D4ON
  88.     CLRF        PORTA
  89.     CLRF        PORTC
  90.     BSF                PORTA,            RA5   
  91.     BCF                PORTC,            RC5
  92.     RETURN
  93. ;*******************************************************************************
  94. ;点亮D5   
  95. D5ON   
  96.     CLRF        PORTA
  97.     BSF                PORTA,            RA1
  98.     BCF                PORTC,            RC5
  99.     RETURN
  100. ;*******************************************************************************
  101. ;点亮D6
  102. D6ON   
  103.     CLRF        PORTA
  104.     BSF                PORTA,            RA2
  105.     BCF                PORTC,            RC5
  106.     RETURN
  107. ;*******************************************************************************
  108. ;点亮D7   
  109. D7ON   
  110.     CLRF        PORTA
  111.     BSF                PORTC,            RC5   
  112.     RETURN
  113. ;*******************************************************************************
  114. ;重新赋值SHIFTDAT   
  115. RELOAD
  116.     ;CLRF        BSR                        ;此段可省略,因调用前BSR就是Bank0
  117.     MOVLW        0x01
  118.     MOVWF        SHIFTDAT
  119.     RETURN
  120. ;*******************************************************************************
  121. RELOADTMR0
  122.     MOVLW        0x86                        
  123.     MOVWF        TMR0                        ;timer0重新加载初始值
  124.     BCF                INTCON,            TMR0IF        ;清除中断标识
  125.     BSF                INTCON,            TMR0IE        ;重开中断
  126.     RETURN
  127.    
  128.     END





巧克力娃娃 发表于 2018-3-7 10:20 | 显示全部楼层
z_jzhao 发表于 2019-5-28 14:25 | 显示全部楼层
能把源码传上来学习一下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

695

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部