找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2459|回复: 7
收起左侧

C51单片机按键秒表程序求助

[复制链接]
ID:678057 发表于 2020-1-4 10:32 | 显示全部楼层 |阅读模式
我用中断按键加中断计时器的方法去运行,但是加上按键就不好用,按键只能按一次,寄存器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
回复

使用道具 举报

ID:678057 发表于 2020-1-4 10:32 | 显示全部楼层
求助大佬们啦,谢谢!
回复

使用道具 举报

ID:678057 发表于 2020-1-4 10:41 | 显示全部楼层
R7我在SETB  TR0那里设置中断,显示是1,但是如果再在下边一行设置直接就跑飞了,R7=71H
回复

使用道具 举报

ID:675483 发表于 2020-1-4 11:28 | 显示全部楼层
我这边只有c语音程序资料
回复

使用道具 举报

ID:675483 发表于 2020-1-4 11:29 | 显示全部楼层
我这边只有c语音程序,汇编语言的没有,想要的话回复我,给你
回复

使用道具 举报

ID:680894 发表于 2020-1-4 12:40 | 显示全部楼层
问题关键大家都在用C敲代码,你整个汇编的代码上来有多少人能看的懂,有几个玩汇编的又在线?
回复

使用道具 举报

ID:678057 发表于 2020-1-4 14:20 | 显示全部楼层
大佬们救救我呀!!
回复

使用道具 举报

ID:678057 发表于 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










回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表