[其它] 【Curiosity试用】2.PIC16F1619汇编实例一

[复制链接]
1349|0
 楼主| JLennon 发表于 2018-3-1 10:47 | 显示全部楼层 |阅读模式
本帖最后由 JLennon 于 2018-3-1 14:18 编辑

  跑马灯实例
  1.功能说明
  利用Curiosity开发板上的D4~D7这四个LED,实现跑马灯效果。
  2.硬件电路
  查阅microchip官方文档DS40001804B可知,D4~D7阴极接地,阳极分别接至RA5、RA1、RA2、RC5。
  当对应的引脚输出高电平时,则该LED点亮。因为开发板没有外置晶振,所以系统时钟源选用内部时
  钟源,这里我们就用8MHZ。
  3.软件设计
  (1)程序关键点分析
  本例的RA和RC端口需要被配置为输出方向,初始化端口输出全为低电平,即D4~D7处于全灭状态。当
  RA5输出高电平,其他引脚输出低电平,则D4亮;延时250ms后,RA1输出高电平,其他引脚输出低电
  平,则D5亮;如此循环,则实现了跑马灯效果。在进行程序设计时,主要涉及的内容如下:
  1)选择配置字,设置系统时钟为内部时钟源。
  2)初始化与内部时钟源相关的寄存器和I/O端口,见PIC16F1619的datasheet的5.6章节。
  2)在主程序中实现循环输出跑马灯效果。
  (2)程序流程图
图像 1.png
  (3)汇编源程序
  1)延时程序如何计算:
  PIC单片机1个指令周期占用4个时钟周期,对于8MHZ的时钟频率,时钟周期为0.125μs,指令周期为
  0.5μs。要实现250ms延时,约等于5.0*10^6个指令周期。
  内循环指令周期(1+1+2)*250-1=999
  中循环指令周期(1+1+inner+1+2)*249-1=249,995
  外循环指令周期(1+1+middle+1+2)*2-1=499,999
  DELAY指令周期 1+1=2
  RETURN指令周期 =2
  总指令周期=外循环+DELAY+RETURN=500,003,约等于5.0*10^6个指令周期
  1. #include "p16f1619.inc"
  2. ; CONFIG1
  3. ; __config 0x3FFC
  4. __CONFIG _CONFIG1, _FOSC_INTOSC & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  5. ; CONFIG2
  6. ; __config 0x3EFF
  7. __CONFIG _CONFIG2, _WRT_OFF & _PPS1WAY_ON & _ZCD_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_ON
  8. ; CONFIG3
  9. ; __config 0x3F9F
  10. __CONFIG _CONFIG3, _WDTCPS_WDTCPS1F & _WDTE_OFF & _WDTCWS_WDTCWSSW & _WDTCCS_SWC
  11. ;*******************************************************************************
  12.     CBLOCK 0x20
  13.        SHIFTDAT                    ;作为跑马灯状态标识
  14.        DELAY_A
  15.        DELAY_B
  16.        DELAY_C
  17.     ENDC
  18. ;*******************************************************************************
  19. RES_VECT  CODE    0x0000            ; processor reset vector
  20.     GOTO    START                   ; go to beginning of program
  21. ; MAIN PROGRAM
  22. ;*******************************************************************************

  23. MAIN_PROG CODE                      ; let linker place main program
  24. START
  25.     ;***************************************************************************
  26.     ;初始化时钟
  27.     BANKSEL        OSCCON
  28.     MOVLW        0x70               
  29.     MOVWF        OSCCON                ;8MHZ内部时钟
  30.     CLRF        OSCTUNE
  31.     ;***************************************************************************
  32.     ;初始化PORTA
  33.     BANKSEL        PORTA
  34.     CLRF        PORTA   
  35.     BANKSEL        ANSELA
  36.     CLRF        ANSELA
  37.     BANKSEL        TRISA
  38.     MOVLW        0x00
  39.     MOVWF        TRISA
  40.     ;***************************************************************************
  41.     ;初始化PORTC
  42.     BANKSEL        PORTC
  43.     CLRF        PORTC   
  44.     BANKSEL        ANSELC
  45.     CLRF        ANSELC
  46.     BANKSEL        TRISC   
  47.     CLRF        TRISC
  48. ;*******************************************************************************   
  49. RELOAD
  50.     ;重置SHIFTDAT
  51.     CLRF        BSR                ;切换到bank0,否则第一次运行时立即数1会赋给120H地址
  52.     MOVLW        0x01
  53.     MOVWF        SHIFTDAT
  54. MAIN
  55. ;*******************************************************************************   
  56.     ;主程序
  57.     BTFSC        SHIFTDAT,   4           ;若SHIFTDAT第4位是0,则跳过下一条指令
  58.     GOTO        RELOAD                    ;若SHIFTDAT第4位是1,则无条件跳转到RELOAD重置
  59.     MOVLW        0x01                      ;WREG寄存器赋值B'0000,0001'
  60.     ANDWF        SHIFTDAT,   W        ;SHIFTDAT与WREG逻辑与后的结果存入WREG寄存器
  61.     BTFSC        WREG,            0        ;若WREG第0位是0,则跳过下一条指令
  62.     CALL        D4ON                         ;若WREG第0位是1,则执行本指令
  63.     MOVLW        0x02                      ;依次类推,判断D5是否处于点亮状态
  64.     ANDWF        SHIFTDAT,   W        ;
  65.     BTFSC        WREG,            1        ;
  66.     CALL        D5ON                ;   
  67.     MOVLW        0x04
  68.     ANDWF        SHIFTDAT,   W
  69.     BTFSC        WREG,            2
  70.     CALL        D6ON   
  71.     MOVLW        0x08
  72.     ANDWF        SHIFTDAT,   W
  73.     BTFSC        WREG,            3
  74.     CALL        D7ON   
  75.     RLF                SHIFTDAT,   F
  76.     CALL        DELAY
  77.     GOTO        MAIN
  78. ;*******************************************************************************
  79. ;点亮D4   
  80. D4ON
  81.     CLRF        PORTA
  82.     CLRF        PORTC
  83.     BSF                PORTA,            RA5   
  84.     BCF                PORTC,            RC5
  85.     RETURN
  86. ;*******************************************************************************
  87. ;点亮D5   
  88. D5ON   
  89.     CLRF        PORTA
  90.     BSF                PORTA,            RA1
  91.     BCF                PORTC,            RC5
  92.     RETURN
  93. ;*******************************************************************************
  94. ;点亮D6
  95. D6ON   
  96.     CLRF        PORTA
  97.     BSF                PORTA,            RA2
  98.     BCF                PORTC,            RC5
  99.     RETURN
  100. ;*******************************************************************************
  101. ;点亮D7   
  102. D7ON   
  103.     CLRF        PORTA
  104.     BSF                PORTC,            RC5   
  105.     RETURN   
  106. ;******** 延时子程序 ************************************************************
  107. DELAY
  108.     MOVLW        0x02
  109.     MOVWF        DELAY_A                    ;外循环2
  110. DLY_A
  111.     MOVLW        0xF9   
  112.     MOVWF        DELAY_B                    ;中循环249
  113. DLY_B
  114.     MOVLW        0xFA
  115.     MOVWF        DELAY_C                    ;内循环250
  116. DLY_C
  117.     NOP
  118.     DECFSZ        DELAY_C
  119.     GOTO        DLY_C
  120.     DECFSZ        DELAY_B
  121.     GOTO        DLY_B
  122.     DECFSZ        DELAY_A
  123.     GOTO        DLY_A
  124.     RETURN               

  125.     END        



您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

695

帖子

8

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