标题:
C51单片机按键秒表程序求助
[打印本页]
作者:
铭铭比比
时间:
2020-1-4 10:32
标题:
C51单片机按键秒表程序求助
我用中断按键加中断计时器的方法去运行,但是加上按键就不好用,按键只能按一次,寄存器R7会赋值1,但是按第二次就不能外部中断了,如果把按键全部去掉的话,秒表是能正常用的,但是加上按键秒表就一直显示00,新手真的不会了,求求大佬!下面是程序:
ORG 0000H
LJMP START
ORG 0003H
LJMP KEY
ORG 000BH
LJMP T0_INT
//----------------------------------
//主程序:
ORG 0030H
START: MOV IE,#83H ;CPU开中断,T0开中断,外部中断0打开
CLR IT0 ;设置电平触发
MOV R0,#00H ;个位数字
MOV R1,#00H ;十位数字
MOV R2,#00H ;判断是否溢出标志
MOV P0,#0C0H ;初始
MOV P2,#03H
MOV TMOD,#02H ;T0方式2
MOV TH0,#6 ;计时器赋值
MOV TL0,#6
MOV R5,#39 ;设置循环次数
MOV R6,#100
MOV R7,#00H ;按键次数
MOV DPTR,#TAB_LED ;指针指向段码
CJNE R7,#01H,$ ;等待键盘
RUN: SETB TR0 ;启动T0
LOOP: MOV A,R0 ;显示个位
MOVC A,@A+DPTR ;
MOV P2,#02H ;
MOV P0,A ;送段码显示
LCALL DELAY_10MS ;动态延时10ms
MOV A,R1 ;送十位
MOVC A,@A+DPTR ;显示十位
MOV P2,#01H ;
MOV P0,A ;送段码显示
LCALL DELAY_10MS ;动态延时10ms
CJNE R2,#00H,OVER ;判断是否溢出
CJNE R7,#01H,NEXT2 ;判断按键次数
NEXT: LJMP LOOP ;循环
NEXT2: CJNE R7,#02H,START ;判断按键次数
LJMP LOOP
OVER: MOV P2,#00H ;关断
LJMP $
//----------------------------------
//共阳极段码表:
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
//----------------------------------
//T0中断:
T0_INT: DJNZ R5,INT_END
MOV R5,#39
DJNZ R6,T0_INT
MOV R6,#100
INC R0 ;
CJNE R0,#10,INT_END ;判断个位是否满10
CLEAN1: MOV R0,#00H ;个位归零
CLEAN2: INC R1 ;十位进一
CJNE R1,#10,INT_END ;判断十位是否满10
MOV R1,#00H ;十位归零
MOV R2,#01H ;标志位置1
INT_END: RETI
//----------------------------------
//键盘输入:
KEY: INC R7 ;R7加一
CJNE R7,#02H,PAUSE
LJMP KEY_END
PAUSE: CLR TR0
KEY_END: RETI
//----------------------------------
//延时10ms:
DELAY_10MS: MOV R3,#20
L1: MOV R4,#250
DJNZ R4,$
DJNZ R3,L1
RET
END
下边是protues:
批注 2020-01-04 103111.png
(25.88 KB, 下载次数: 22)
下载附件
2020-1-4 10:31 上传
作者:
铭铭比比
时间:
2020-1-4 10:32
求助大佬们啦,谢谢!
作者:
铭铭比比
时间:
2020-1-4 10:41
R7我在SETB TR0那里设置中断,显示是1,但是如果再在下边一行设置直接就跑飞了,R7=71H
作者:
295915359
时间:
2020-1-4 11:28
我这边只有c语音程序资料
作者:
295915359
时间:
2020-1-4 11:29
我这边只有c语音程序,汇编语言的没有,想要的话回复我,给你
作者:
笑看天下
时间:
2020-1-4 12:40
问题关键大家都在用C敲代码,你整个汇编的代码上来有多少人能看的懂,有几个玩汇编的又在线?
作者:
铭铭比比
时间:
2020-1-4 14:20
大佬们救救我呀!!
作者:
铭铭比比
时间:
2020-1-4 15:49
已解决
ORG 0000H
LJMP START
ORG 0003H
LJMP KEY
ORG 000BH
LJMP T0_INT
//----------------------------------
//主程序:
ORG 0030H
START: MOV IE,#83H ;CPU开中断,T0开中断,外部中断0打开
CLR IT0 ;设置电平触发
MOV R0,#00H ;个位数字
MOV R1,#00H ;十位数字
MOV R2,#00H ;判断是否溢出标志
MOV B,#00H
MOV P0,#0C0H ;初始
MOV P2,#03H
MOV TMOD,#02H ;T0方式2
MOV TH0,#6 ;计时器赋值
MOV TL0,#6
MOV R5,#39 ;设置循环次数
MOV R6,#100
MOV R7,#00H ;按键次数
MOV DPTR,#TAB_LED ;指针指向段码
CJNE R7,#01H,$ ;等待键盘
RUN: SETB TR0 ;启动T0
LOOP: MOV A,R0 ;显示个位
MOVC A,@A+DPTR ;
MOV P2,#02H ;
MOV P0,A ;送段码显示
LCALL DELAY_10MS ;动态延时10ms
MOV A,R1 ;送十位
MOVC A,@A+DPTR ;显示十位
MOV P2,#01H ;
MOV P0,A ;送段码显示
LCALL DELAY_10MS ;动态延时10ms
CJNE R2,#00H,OVER ;判断是否溢出
MOV A,B
CJNE A,#00H,START
NEXT: LJMP LOOP ;循环
OVER: MOV P2,#00H ;关断
LJMP $
//----------------------------------
//共阳极段码表:
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
//----------------------------------
//T0中断:
T0_INT: DJNZ R5,INT_END
MOV R5,#39
DJNZ R6,T0_INT
MOV R6,#100
INC R0 ;
CJNE R0,#10,INT_END ;判断个位是否满10
CLEAN1: MOV R0,#00H ;个位归零
CLEAN2: INC R1 ;十位进一
CJNE R1,#10,INT_END ;判断十位是否满10
MOV R1,#00H ;十位归零
MOV R2,#01H ;标志位置1
INT_END: RETI
//----------------------------------
//键盘输入:
KEY: JNB P3.2,$
INC R7 ;R7加一
CJNE R7,#02H,CLEAN_R7
CLR TR0
LJMP KEY_END
CLEAN_R7: CJNE R7,#03H,KEY_END
MOV B,#01H
KEY_END: RETI
//----------------------------------
//延时10ms:
DELAY_10MS: MOV R3,#20
L1: MOV R4,#250
DJNZ R4,$
DJNZ R3,L1
RET
END
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1