1234下一页
返回列表 发新帖我要提问本帖赏金: 22.00元(功能说明)

[PIC®/AVR®/dsPIC®产品] 自学PIC汇编笔记

[复制链接]
 楼主| GeekyGeek 发表于 2015-10-17 15:47 | 显示全部楼层 |阅读模式
本帖最后由 GeekyGeek 于 2015-10-25 15:43 编辑

    从今天开始,决定学习PIC汇编。并且期望每一天或每两天更新一次学习成果上来。我会贴上代码和Proteus的仿真结果。   不对的地方,还请指教。今天写的是最简单的--点亮一盏灯。
    代码如下:

;/******************************************/
;/* Main Program */

;/******************************************/   
;/* OSC:          8 MHz (external crystal)*/
;/* Feature: RA0 output "1" to flash a LED*/
;/******************************************/
LIST P=16F877A
#include "p16F877A.inc"
; /*CONFIG BITS*/
; /*__config 0x3F32*/
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF  
REST      CODE    0x0000                ; /*processor reset vector*/      
              GOTO    START                ; /*go to beginning of program*/
MAIN      CODE                               ; /*let linker place main program*/
START      
              banksel TRISA      
              bcf TRISA, TRISA0         
              banksel PORTA      
              bsf PORTA, RA0      
              GOTO $                      ; /*loop forever*/      
              END
    Proteus 仿真结果如下:
      

      使用到PIC汇编指令bcf, bsf, 和goto,PIC 汇编指令只有35个,今天就用到了3个。加油,呵呵!
      在一些例程里面,我看到有些代码中通过清除或设置RP0,RP1来选择bank, 不知道和banksel有什么区别。
E:\MyBlogs\FlashLED.png











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21ic小喇叭 打赏了 5.00 元 2015-11-23

zhoujunfeng 发表于 2015-10-17 21:28 | 显示全部楼层
BANKSEL 好用些,后面直接用变量名称就行.
例如: Num   EQU    H'20'
        BANKSEL    Num
系统直自动到Num所在的Bank
yklstudent 发表于 2015-10-18 09:18 | 显示全部楼层
楼主够非主流的
 楼主| GeekyGeek 发表于 2015-10-18 11:16 | 显示全部楼层
zhoujunfeng 发表于 2015-10-17 21:28
BANKSEL 好用些,后面直接用变量名称就行.
例如: Num   EQU    H'20'
        BANKSEL    Num

谢谢
 楼主| GeekyGeek 发表于 2015-10-18 11:18 | 显示全部楼层

其实我一直也用C的. :handshake
 楼主| GeekyGeek 发表于 2015-10-18 16:57 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-18 17:50 编辑

       今天写的是驱动LED灯1秒亮1秒灭
       代码如下:
;/******************************************/;/* Main Program */
;/*-----------------------------------------------*/  
;/* OSC:      8 MHz (external crystal)      */
;/* Feature:   RA0 output "1"                 */
;/*                 Delay 1 second                 */
;/*                 RA0 output "0"                */
;/*                 Delay 1 second                 */
;/*                 Repeat                             */
;/*******************************************/
LIST P=16F877A
#include "p16F877A.inc"
; /*CONFIG BITS*/
; /*__config 0x3F32*/
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF  
CBLOCK 0x20      
             TICKS_100US      
             TICKS_10MS      
             TICKS_1S
ENDC
REST  CODE          0x0000                ; /*processor reset vector*/      
          goto          START                 ; /*go to beginning of program*/
MAIN  CODE                                ; /*let linker place main program*/
START      banksel      TRISA      
                bcf              TRISA, TRISA0   
LOOP       banksel      PORTA      
                bsf              PORTA, RA0      
                call              Delay1s            
               banksel      PORTA      
               bcf              PORTA, RA0      
               call             Delay1s            
               goto         LOOP      
;/***************************************************************************/
Delay100us      
      banksel        TICKS_100US
      movlw          42H
      movwf          TICKS_100US
Tick100us
      decfsz        TICKS_100US
      goto          Tick100us
      return
Delay10ms
      banksel        TICKS_10MS
      movlw          64H
      movwf          TICKS_10MS
Tick10ms
      call          Delay100us
      decfsz        TICKS_10MS
      goto          Tick10ms
      return
Delay1s
      banksel        TICKS_1S
      movlw          64H
      movwf          TICKS_1STick1s
      call          Delay10ms
      decfsz        TICKS_1S
      goto          Tick1s
      return
      END


今天又学习到5条PIC 汇编指令--call, return, movlw, movwf 和 decfsz, 进步神速哦
Proteus 仿真结果如下:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-11-23

416775364TP 发表于 2015-10-18 23:02 | 显示全部楼层
banksel最后生成的代码还是设置PRO和PR1,只是给编译器识别的。
zhoujunfeng 发表于 2015-10-19 19:49 | 显示全部楼层
端口取反一般用XORWF
例如
    BANKSEL    PORTB
    MOVLW  B'00000001'
    XORWF  PORTB,F
zhoujunfeng 发表于 2015-10-19 19:49 | 显示全部楼层
BCF BSF 有时候不能输出,不知道为什么
 楼主| GeekyGeek 发表于 2015-10-19 20:41 | 显示全部楼层
zhoujunfeng 发表于 2015-10-19 19:49
端口取反一般用XORWF
例如
    BANKSEL    PORTB

谢谢, 目前还没学到“xorwf"这条指令
 楼主| GeekyGeek 发表于 2015-10-19 20:49 | 显示全部楼层
416775364TP 发表于 2015-10-18 23:02
banksel最后生成的代码还是设置PRO和PR1,只是给编译器识别的。

谢谢,刚刚才知道banksel是伪指令,不属于35条指令。应该是像你所说的那样。
 楼主| GeekyGeek 发表于 2015-10-20 21:20 | 显示全部楼层
本帖最后由 GeekyGeek 于 2015-10-20 21:34 编辑

     今天写的是流水灯,四个灯轮替亮。
     代码如下:

;/******************************************/
;/* Main Program */

;/*-------------------------------------------------*/
;/* OSC:      8 MHz (external crystal)          */
;/* Feature:      PORTB output 0x80          */
;/*                    Delay 400ms                     */
;/*                    PORTB output 0x40          */
;/*                    Delay 400ms                     */
;/*                    PORTB output 0x20          */
;/*                    Delay 400ms                     */
;/*                    PORTB output 0x10         */
;/*                    Delay 400ms                    */
;/*                    Repeat                             */
;/*******************************************/
LIST P=16F877A
#include "p16F877A.inc"
; /*CONFIG BITS*/
; /*__config 0x3F32*/
__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
  CBLOCK 0x20
      TICKS_100US
      TICKS_10MS
      TICKS_400MS
      TICKS_1S
ENDC
  UDATA      0x24
               FLOW_MAX    res            1
REST      CODE          0x0000      ; /*processor reset vector*/
              goto          START      ; /*go to beginning of program*/
MAIN      CODE                  ; /*let linker place main program*/
START
      banksel          TRISB
      clrf          TRISB
      banksel          PORTB
      clrf          PORTB
LOOP
      banksel          PORTB
      movlw          08H
      movwf          PORTB
      banksel          FLOW_MAX
      movlw          04H
      movwf          FLOW_MAXF
LOW
      call          Delay400ms
      rrf          PORTB
      decfsz          FLOW_MAX
      goto          FLOW
      goto          LOOP
;/***************************************************************************/
Delay100us
      banksel          TICKS_100US
      movlw          42H
      movwf          TICKS_100US
Tick100us
      decfsz          TICKS_100US
      goto          Tick100us
      return
Delay10ms
      banksel          TICKS_10MS
      movlw          64H
      movwf          TICKS_10MS
Tick10ms
      call          Delay100us
      decfsz          TICKS_10MS
      goto          Tick10ms
      return
Delay400ms
      banksel          TICKS_400MS
      movlw          28H
      movwf          TICKS_400MS
Tick400ms
      call          Delay10ms
      decfsz          TICKS_400MS
      goto          Tick400ms
      return
Delay1s
      banksel          TICKS_1S
      movlw          64H
      movwf          TICKS_1STick1s
      call          Delay10ms
      decfsz          TICKS_1S
      goto          Tick1s
      return
;/***************************************************************************/
     END




今天又学到两条PIC汇编指令 clrf 和 rrf, 革命尚未成功,继续努力。


      Proteus 仿真结果如下:

     



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-11-23

416775364TP 发表于 2015-10-21 22:45 | 显示全部楼层
GeekyGeek 发表于 2015-10-20 21:20
今天写的是流水灯,四个灯轮替亮。
     代码如下:

将PROTEUS上面的AC到DC,波形就不会像现在一样了,斜斜的
mcumail 发表于 2015-10-22 08:24 | 显示全部楼层
mark,学习一下
l0p0c 发表于 2015-10-22 15:21 | 显示全部楼层
好多年前了……呵呵……看着有点亲切,但是还是陌生了……
efen 发表于 2015-10-22 15:45 | 显示全部楼层
看着头大:L
松哥无敌 发表于 2015-10-22 17:05 | 显示全部楼层
钦佩楼主的非主流
linxiaotuzi 发表于 2015-10-23 10:56 | 显示全部楼层
以前也是用PIC汇编后来跟人协作他们用C 我也改用C了·· 其实汇编也挺好玩的,但适合自己玩··
mzb2012 发表于 2015-10-23 11:55 | 显示全部楼层
赞一个,一直用C,最近在看pic30f的bootloader,汇编写的,确实头大,
zhoujunfeng 发表于 2015-10-23 12:02 | 显示全部楼层
汇编一般一个模块写到一个bank中
这样不用来回倒bank了.
嗨!pic头疼的bank呀.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

212

帖子

3

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