lab2000p程序h12.asm

 

;定时器实验

T100us equ 256-50       ;100us时间常数(6M)

C100us equ 30h          ;100us计数单元

LEDBuf equ 0

LED    equ P1.0

 

ljmp Start

 

org 000bh

T0Int:                  ;中断子函数

      push PSW

 

      mov a,C100us+1

      jnz Goon

      dec  C100us        

Goon:                    

      dec C100us+1       

 

      mov a,C100us

      orl a,C100us+1

      jnz Exit

      mov C100us,#27h   ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。

      mov C100us+1,#10h

      cpl LEDBuf

 

Exit:

      pop PSW

      reti

 

Start:                  ;主函数

      mov TMOD,#02h     ;方式2,定时器

      mov TH0,#T100us

      mov TL0,#T100us

 

      mov IE,#10000010b ;EA=1,IT0=1

      setb TR0           ;开始定时

 

      clr LEDBuf

      clr LED

      mov C100us,#27h   ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。

      mov C100us+1,#10h

 

Loop:

     mov c,LEDBuf

     mov LED,c

     ljmp Loop

 

     end

 

 

1,reti

概念

 

  RETI是中断返回指令

  这条指令的功能和RET指令相似,2条指令的不同之处,是本指令除了中断响应时,被置1的MCS-51内部中断优先级寄存器的优先级状态。

 

  中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。中断指令“RETI”作为中断跳出指令,除了将堆栈中保存着的地址取出,送回PC,使程序从主程序的中断处继续往下执行的作用外,还有将“优先级生效”触发器清零的功能。

2,注意点

 

 mov C100us,#27h   ;要定时10000次才能达到一秒,10000的十六进制位2710h,存储时先放高字节。

      mov C100us+1,#10h

笔者开始没有写#号,导致了奇怪错误

3,orl a,C100us

把a累加器和C100us中得值进行或运算。

4,一段经典写法:

 

mov a,C100us+1

      jnz Goon

      dec  C100us        

Goon:                    

      dec C100us+1 

经典的用两个变量做减法,控制每次减一的算法!好!

 

<!--EndFragment-->

 

你可能感兴趣的:(ASM)