|
之前无论学习51,STM8还是MSP430,一直都很依赖C,虽然也算是用了几年MCU了,但从没用过汇编程序.
现在头脑发抽,突然想学松翰,这芯片虽有C studio,但是为了摆脱C的粘性,决定学习汇编,就从这颗芯片开始.
写的第一个程序,单个LED闪烁,用C非常简单,但汇编还要查各种指令的使用方式,所以也捣鼓了一下午.
单片机仿真型号是2711.
献丑了.
- /**********************************************************
- ;程序名称:LED闪烁程序
- ;日 期: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 ;程序结束
复制代码 |
|