发新帖本帖赏金 22.00元(功能说明)我要提问
1234下一页
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

自学PIC汇编笔记

[复制链接]
11865|61
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

谢谢

使用特权

评论回复
5
GeekyGeek|  楼主 | 2015-10-18 11:18 | 只看该作者

其实我一直也用C的. :handshake

使用特权

评论回复
6
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 仿真结果如下:




BlinkLED.png (119.26 KB )

BlinkLED.png

使用特权

评论回复

打赏榜单

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

7
416775364TP| | 2015-10-18 23:02 | 只看该作者
banksel最后生成的代码还是设置PRO和PR1,只是给编译器识别的。

使用特权

评论回复
8
zhoujunfeng| | 2015-10-19 19:49 | 只看该作者
端口取反一般用XORWF
例如
    BANKSEL    PORTB
    MOVLW  B'00000001'
    XORWF  PORTB,F

使用特权

评论回复
9
zhoujunfeng| | 2015-10-19 19:49 | 只看该作者
BCF BSF 有时候不能输出,不知道为什么

使用特权

评论回复
10
GeekyGeek|  楼主 | 2015-10-19 20:41 | 只看该作者
zhoujunfeng 发表于 2015-10-19 19:49
端口取反一般用XORWF
例如
    BANKSEL    PORTB

谢谢, 目前还没学到“xorwf"这条指令

使用特权

评论回复
11
GeekyGeek|  楼主 | 2015-10-19 20:49 | 只看该作者
416775364TP 发表于 2015-10-18 23:02
banksel最后生成的代码还是设置PRO和PR1,只是给编译器识别的。

谢谢,刚刚才知道banksel是伪指令,不属于35条指令。应该是像你所说的那样。

使用特权

评论回复
12
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 仿真结果如下:

     



FlowLED.png (75.72 KB )

FlowLED.png

使用特权

评论回复

打赏榜单

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

13
416775364TP| | 2015-10-21 22:45 | 只看该作者
GeekyGeek 发表于 2015-10-20 21:20
今天写的是流水灯,四个灯轮替亮。
     代码如下:

将PROTEUS上面的AC到DC,波形就不会像现在一样了,斜斜的

使用特权

评论回复
14
mcumail| | 2015-10-22 08:24 | 只看该作者
mark,学习一下

使用特权

评论回复
15
l0p0c| | 2015-10-22 15:21 | 只看该作者
好多年前了……呵呵……看着有点亲切,但是还是陌生了……

使用特权

评论回复
16
efen| | 2015-10-22 15:45 | 只看该作者
看着头大:L

使用特权

评论回复
17
松哥无敌| | 2015-10-22 17:05 | 只看该作者
钦佩楼主的非主流

使用特权

评论回复
18
linxiaotuzi| | 2015-10-23 10:56 | 只看该作者
以前也是用PIC汇编后来跟人协作他们用C 我也改用C了·· 其实汇编也挺好玩的,但适合自己玩··

使用特权

评论回复
19
mzb2012| | 2015-10-23 11:55 | 只看该作者
赞一个,一直用C,最近在看pic30f的bootloader,汇编写的,确实头大,

使用特权

评论回复
20
zhoujunfeng| | 2015-10-23 12:02 | 只看该作者
汇编一般一个模块写到一个bank中
这样不用来回倒bank了.
嗨!pic头疼的bank呀.

使用特权

评论回复
发新帖 本帖赏金 22.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

211

帖子

3

粉丝