微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机奇怪问题

51单片机奇怪问题

时间:10-02 整理:3721RD 点击:

单片机STC89C52RC,初学驱动数码管,按照思路是先显示一遍0-9,下来就不断循环显示1-9,proteus仿真一切正常,但是把程序烧写到芯片上之后只能显示0-9一次,然后就不显示了。但是删掉 jnb p1.3,Set3 这句,就一切OK了,真是奇怪,求助坛友怎么处理才好
完整程序如下:

ORG  0000H  ;ORG伪指令来规定程序的起始地址
     LJMP    MAIN
ORG 0060H                  ;数据表:
    DB 03FH,0FFH,   03FH,0FEH,   03FH,0FDH,   03FH,0FBH,   03FH,0F7H           ;显示设定圈数的数值,两个一组前一数字是字模,后一位数字是显示该字的选通码
    DB 03FH,0FFH,   03FH,0EFH,   03FH,0DFH,   03FH,0BFH,   03FH,07FH           ;显示实际圈数的数值,前一数字赋值给P0,后一数字赋值给P2,对应的数码管亮一下   
    DB 03FH, 006H, 05BH, 04FH, 066H, 06DH, 07DH, 007H, 07FH, 06FH               ;正置数码管显示0~9, 0-9字模的存储位置
ORG  0100H
MAIN:  
  
  mov p1,#0FFh        ;初始化P1口为高电平以关闭所有数码管
  call test           ;让各数码管从0显示到9以检测显示正常与否

start:   
    jnb p1.0,SET0        ;如果Bit不是1,跳转到start1
    jnb p1.1,Set1         ;如果Bit是1,跳转set2
    jnb p1.2,Set2
   
    jnb p1.3,Set3                ;这句删掉就能正常显示
    jnb p1.4,Set4
    jnb p1.5,Set5
    jnb p1.6,Set6
    jnb p1.7,Set7  
    call test
    JMP start
SET0:
    JMP start
SET1:
    JMP start
SET2:
    JMP start
SET3:
    JMP start
SET4:
    JMP start
SET5:
    JMP start
SET6:
    JMP start
SET7:
    JMP start
;=================== test:让所有数码管从0显示到9 =============
test:
   mov p0,#03Fh      ;把数字0的字模送入P0
   mov p2,#000h      ;设置p2口为低电平,此时所有数码管都显示
   mov r1,#074h          ; 0-9字模的存储位置,从这个数开始增加,寻找与当前显示的数字对应的数,然后找出下一个数存入显示的位置
different:  
   mov a,r1
   inc R1      
   MOVC   A, @A+DPTR    ;把 数据表中的第一个数据读到A里,A中的值就是调试时观察窗口里ACC的值
   mov r2,p0
   XRL A, r2            ; A与R2中的数据进行异或操作,结果放在A中。异或,相同为“0”,相异为“1”。
   jz   next                ;A中内容为0,说明找到了目前显示的数字的字模,就把下一个字模放到当前位置
   jmp  different
next:
   MOV A,R1                 ;否则可以增加数字,R1中的数字作为相对地址寻址找到下一个数字的代码送入P0
   MOVC   A, @A+DPTR  
   mov p0,a
   MOV R4,#0H
pause:
   INC R4
   mov A,R4
   XRL A, #0FFh        ;设置每个数字显示的时间
   JZ continue
   MOV A,R1
   CALL DELAY  
   MOV R1,A
   JMP pause
continue:
   mov A,R1
   XRL A,#07Eh  
   jz  testOK
   jmp  different
testOK:
   ret
;=================== DELAY: 延时子程序 ======
DELAY:
    MOV R6,#04H
DL0:
    MOV R5,#0F8H
    DJNZ R5,$
    DJNZ R6,DL0
    NOP
    RET
END

已解决,是芯片坏了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top