查看: 1252|回复: 0
打印 上一主题 下一主题

开始学习松翰单片机了,第一个汇编程序,献丑了.

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-27 18:23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前无论学习51,STM8还是MSP430,一直都很依赖C,虽然也算是用了几年MCU了,但从没用过汇编程序.
现在头脑发抽,突然想学松翰,这芯片虽有C studio,但是为了摆脱C的粘性,决定学习汇编,就从这颗芯片开始.
写的第一个程序,单个LED闪烁,用C非常简单,但汇编还要查各种指令的使用方式,所以也捣鼓了一下午.
单片机仿真型号是2711.
献丑了.

/**********************************************************
;程序名称ED闪烁程序
;日    期:2014.10.17
**********************************************************/
        CHIP        SN8P2711A
//{{SONIX_CODE_OPTION
        .Code_Option        LVD                LVD_H                ; 2.4V Reset Enable LVD36 bit of PFLAG for 3.6V Low Voltage Indicator
        .Code_Option        Reset_Pin        P04
        .Code_Option        Watch_Dog        Disable                ; Disable Watchdog
        .Code_Option        High_Clk        4M_X'tal        ; Crystal/Resonator: 2Mhz~10Mhz
        .Code_Option        Fcpu                #0     ; Fcpu = Fosc/1
        .Code_Option        Security        Enable
        .Code_Option        Noise_Filter        Disable
//}}SONIX_CODE_OPTION

;RAM变量定义
.DATA
ORG                0H        ;RAM变量定义起始地址
timera ds 1                ;1Byte变量
timerb ds 1                ;1Byte变量

;程序开始地址,ROM
.CODE
ORG                0H        ;ROM起始地址
jmp                main        ;跳转到10H地址处,因00H - 10H处有中断处理入口,所以需要跳过               
ORG                10H        ;MAIN函数地址
main:                        
        b0bset                p5m.3        ;设置p5.3为输出模式
@@:                        ;暂时性标号        
        b0bset                p5.3        ;置位P5.3
        mov                 a,#255         ;载入延时时间
        call                delay        ;延时
        b0bclr                p5.3        ;复位P5.3
        mov                a,#255        ;载入延时时间
        call                delay        ;延时
        jmp                @b        ;跳回向前最近的一个"@@"处

delay:                        ;延时子函数
        mov         timerb,a        ;将延时变量(形参)载入函数变量
        mov         a,#100               
        mov        timera,a        ;将立即数载入变量timera
        decms         timera                ;如果timera -- 等于0,则跳过下一条指令
        jmp        $-1                ;回到上一步,结合decms指令完成while(timera --)功能
        decms   timerb                ;双重延时
        jmp        $-3                   ;回到上面3步
        ret                        ;子程序返回
ENDP                        ;程序结束
复制代码转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表