找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3907|回复: 0
打印 上一主题 下一主题
收起左侧

写了个小程序遇到大问题,请帮忙

[复制链接]
跳转到指定楼层
楼主
ID:24748 发表于 2010-8-5 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

程序目的:按下K1 数字加一,按下K2,数字减一,按下K3连减.
 现在的问题是,上电后能正常显示数字,当按下任一键后数据会变化,但松手后数码管却不会亮了,按下开关不松手就会亮,手一松就灭了,按下开关时也能看到数据的加一或是减一.学生请老师们指点为谢.
org 0000h
jmp main
org 0013h
jmp int1_1
k0 bit p1.1;定义4个开关
k1 bit p1.0
k2 bit p1.2
k3 bit p1.3
main: setb ea
      setb ex1
      clr p1.5;关蜂鸣器
      mov 40h,#250;上电时要显示的数
ma_1: call divcx;调用除法子程序
       lcall display;调用显子程序
       ajmp ma_1;跳回
int1_1:clr ea;中断入口
      clr ex1
      jnb k1,  key1;判断哪个键按下,按下后转对应的键处理程序
      jnb k2 ,  key2
      jnb k3 ,  key3
      jnb k0 ,  key0
 fh:  setb ea  ;中断返回,开中断
      setb ex1
      reti
key1: call delay10ms;K1处理程序
      jb k1,fh ;不为0是干扰,返回
      mov a,40h  ;K1每按下一次对40H加一
      inc a
      mov 40h,a
    
  k_1:    jnb k1,xx1;按下没松开转,不断的显示,防止数码管不亮
      cjne a,#0ffh,fh;没加到255,中断返回
    
      jmp fh
key2:  call delay10ms;K2处理程序,减法
      jb k2,fh
      mov a,40h
      dec 40h
      call divcx
  k_2:    jnb k2,xx2
      cjne a,#0,fh
     
      jmp fh
key3: call delay10ms;这里是连减程序
      jb k3,fh
      dec 40h;40H减一
      mov a,40h
      cjne a,#0,zdj1; K3按下不松,转延时一秒继续减
     jmp fh  

 zdj1:call delay1s
      jmp key3
      jmp fh
xx0:  call display
      jmp key0
xx1:  call display
     jmp k_1
 xx2: call display
     jmp k_2  
divcx:mov a, 40h;除法子程序,把40H中的数转换为BCD数
     mov r0,#43
     mov b,#100
     div ab
     mov @r0,a;百位在43H
     dec r0
     mov 44h,b
     xch a,44h
     mov b,#10
     div ab
     mov @r0,a;十位在42H
     dec r0
     mov 44h,b
     xch a,44h
     mov @R0,A;个位在41H
     ret
 display:  MOV R0,#41      ;取显示数据的首地址
      MOV R3,#00000001     ;位扫描初值
play: MOV P2,#0H     ;关闭位扫描
      MOV A,R3          ;扫描初值入A
      MOV P2,A         ;扫描初值送到P2口
      MOV A,@R0        ;取要显示的数据
      MOV DPTR,#TAB
      MOVC A,@A+DPTR
      MOV P0,A
      CALL DELAY1MS
      INC R0           ;显示数据的地址加一
      MOV A,P2         ;读入P2口数据
      JB  ACC.2,ENDOUT ;判断P2口是否扫描到第3位,到了退出子程序
      RL A              ;没到把P2口数据左移一位
      MOV R3,A          ;把左移后的数据装入R3
      MOV P2,#0H      ;关位扫描数据,防止产生鬼影
      JMP PLAY           ;跳回PLAY继续显示
ENDOUT:MOV P0,#0FFH      ;子程序返回时关闭位显示与段显示
      MOV P2,#0H        ;
      RET
      DELAY1MS:mov r3,#2
   d1:   mov r4,#250
   d2:   djnz r4,$
         djnz r3,d1
         ret
delay10ms: call display   ;10ms子程序,调用一次显示子程序约3ms,调两次约10ms
           call display
            call display
         ret
 delay1s:mov r5,#20
      d3:call delay10ms
         djnz r5,d3
         ret
  bb:setb p1.5            ;蜂鸣器响的子程序
     call delay1s
     clr p1.5
     call delay1s
     ret

    
TAB:db   48h,0ebh,52h,62h,0e1h,64h,44h,0eah,40h,60h
end

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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