刚接触义隆单片机,听说eUIDE的C编译系统不好使,所以选择了用汇编写程序,刚写了个小测试程序,结果没能实现预期功能,在此诚心求教啦。
想实现的功能:
1.外部中断产生---->开启TCC溢出中断---->2.
2.TCC溢出中断满10次---->取反P50引脚电平---->TCC溢出中断满10次---->取反P50引脚电平---->……---->外部中断产生---->3.
3.取反TCC溢出中断使能位---->若是关闭TCC溢出中断则P50置为'1'---->等待再次产生外部中断---->1.
---->若是开启TCC溢出中断---->2.
编译能通过,下载到片子里得不到预期结果,给出外部中断后P50引脚一直为高电平。
程序如下:
INCLUDE "EM78P163N.INC"
X_INT == R10
X_TCC == R3F
_DELAY_X1 == R18
_DELAY_X2 == R28
ORG 0X000
JMP MAIN
ORG 0X003
JMP EXT_INT
ORG 0X009
JMP TCC_INT
EXT_INT:
CALL DELAY_10MS ;延迟10ms消抖
JBC PORT6,0
JMP EXT_INT_RETI ;抖动则跳不产生操作,直接跳至结束位置。
COM X_INT
EXT_INT_RETI:
MOV A,@11111011B
AND RF,A
RETI
TCC_INT:
DEC X_TCC
MOV A,@11111110B
AND RF,A
RETI
ORG 0X030
MAIN:
DISI ;关闭全局中断
MOV A,@0X00 ;P5置为输出
IOW IOC5
BS PORT5,0 ;P50置1
MOV A,@01000000B ;P61设置为INT引脚
IOW WDTCR
MOV A,@0XFF ;P6设置为输入
IOW IOC6
MOV A,@10001111B ;INT设置为下降沿触发,TCC时钟为256分频
CONTW
CLR X_INT ;X_INT初值为0
MOV A,@0X0B ;X_TCC初值为11
MOV X_TCC,A
CLR RF ;清零中断标志位
MOV A,@00000100B ;开启外部INT中断
IOW IOCF
ENI ;使能全局中断
LOOP:
JBS X_INT,0
JMP LOOP
CLR RF ;清楚中断标志位
MOV A,@00000001B ;开启TCC溢出中断
OR IOCF,A
LOOP1:
DJZA X_TCC
JMP LOOP1
MOV A,@00000001B
XOR PORT5,A ;P50输出取反
MOV A,@0X0B ;重置X_TCC初值
MOV X_TCC,A
JBC X_INT,0
JMP LOOP1
MOV A,@11111110B
AND IOCF,A ;关闭TCC溢出中断
AND PORT5,A ;关灯
JMP LOOP
DELAY_10MS:
MOV A,@0X50 ;延时变量初值设置
MOV _DELAY_X2,A
DELAY_LOOP2:
MOV A,@0XFA
MOV _DELAY_X1,A
DELAY_LOOP1:
DJZ _DELAY_X1
JMP DELAY_LOOP1
DJZ _DELAY_X2
JMP DELAY_LOOP2
RET
一周热门 更多>