这学期选修了单片机原理与应用,老师非让用汇编来写入程序。
没办法,记录一下一些知识吧,因为不太熟悉,也不熟练,很容易学过就忘。
org 0000h
jmp Start
ORG 0003H
JMP INT00
ORG 0100H
Start:
MOV SP,#60H
SETB EA
SETB EX0
Clr IT0
CLR A
Loop:
CPL A
MOV P0,A
LCALL DELAY
JMP Loop
DELAY:
MOV R6,#200
D1:
MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
;----中断子程序程序示例------
INT00:
MOV R1,#9
MOV A,#00H
LOOP1:
MOV P0,A
LCALL DELAY
SETB C
RRC A
DJNZ R1,LOOP1
RETI
程序效果:
Start部分使8个灯不断闪灭
通过按键引起中断后,执行中断子程序INT00
8个灯流水熄灭,执行完毕,继续不断闪灭。
代码段注释:
;---’;’代表注释
org 0000h
;org指令?
;org 0000h代表什么含义呢?
;org 0000h是一条汇编伪指令,它指定下一条语句将在哪里开始
;在汇编时不产生相应的机器语言指令,只是指导程序该从哪里开始
jmp Start
;跳到Start处
ORG 0003H
;0003H是外部中断INT0的入口地址
;加这条伪指令是为了方便系统找到中断指令
;ps:依然不太懂
JMP INT00
;跳转到中断INT0函数位置
ORG 0100H
Start:
MOV SP,#60H
;避免堆栈区与工作寄存器区发生冲突
SETB EA
;SETB:对位置1
;EA:中断允许总开关控制位,EA=0,所有中断请求被屏蔽,EA=1,所有的中断请求被开放
;开中断
SETB EX0
;允许外部中断0
;EX0:外部中断0的溢出中断允许位,为0禁止外部中断0中断。
ClR IT0 ;外部中断0为电平触发
;IT0=1,外部中断0为跳沿触发
CLR A ;累加器清0
Loop:
;累加器是一个8位寄存器
CPL A ;累加器求反
MOV P0,A
;这里的效果是8个灯不断闪灭
;把p0的一个位 置为0,对应的灯会亮。
LCALL DELAY ;调用延时函数
JMP Loop
;--------延时子程序--------
DELAY:
MOV R6,#200 ;外循环次数
D1:
MOV R7,#248
DJNZ R7,$
;相当于here: DJNZ R7,here
;$指本条指令的地址
;寄存器减1,不为0则转移
;也就是循环执行这条语句248次
DJNZ R6,D1
;如果循环够了200次,就跳出去
RET
;子程序返回
;----中断子程序程序示例------
INT00:
MOV R1,#9
MOV A,#00H
LOOP1:
MOV P0,A ;最开始全亮
LCALL DELAY ;延时1s
SETB C ;进位标志位C设为1
RRC A ;经过进位标志位的累加器循环右移
DJNZ R1,LOOP1
;R1减一,不为0则转移
RETI ;中断返回
;0000 0000
;C, P7,P6,P5,P4,P3,P2,P1,P0
;1--->
;1000 0000
;1100 0000
;1110 0000
;1111 0000
;1111 1000
;1111 1100
;1111 1110
;1111 1111
跳沿触发和电平触发有什么不同???
跳沿触发:即便CPU暂时不能响应,中断请求标志也不会丢失。(依然没明白)。
电平触发:外部中断申请触发器的状态随着CPU在每个机器周期采样到的外部中断
输入引脚的电平变化而变化,这能提高CPU对外部中断请求的响应速度。
当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效
(即外部中断请求输入已由低电平变为高电平),否则CPU返回主程序后会再次响应中断。
(不太懂,就这吧)