Assembly 如何将大于8位的数据发送到I/O端口

Assembly 如何将大于8位的数据发送到I/O端口,assembly,8051,Assembly,8051,我是汇编语言编程新手。我正在尝试使用at89c52 MC制作四个常见的annode 7段led显示屏,其计数可达9999。但我无法将255(FFH)以上的数据发送到i/O端口。 那么,我是否可以将255位或8位以上的数据发送到i/o端口和led显示屏 ORG 000H MOV DPTR,#LUT MOV P1,#00000000B MOV P0,#00000000B MAIN: MOV R6,#14D SETB P3.5

我是汇编语言编程新手。我正在尝试使用at89c52 MC制作四个常见的annode 7段led显示屏,其计数可达9999。但我无法将255(FFH)以上的数据发送到i/O端口。 那么,我是否可以将255位或8位以上的数据发送到i/o端口和led显示屏

ORG 000H
MOV DPTR,#LUT              
MOV P1,#00000000B          
MOV P0,#00000000B          
MAIN: MOV R6,#14D
  SETB P3.5
  MOV TMOD,#01100001B  
  MOV TL1,#00000000B   
  MOV TH1,#00000000B   
  SETB TR1             
BACK: MOV TH0,#00000000B   
  MOV TL0,#00000000B   
  SETB TR0             
HERE: JNB TF0,HERE         
  CLR TR0              
  CLR TF0              
  DJNZ R6,BACK
  CLR TR1              
  CLR TF0              
  CLR TF1              
  ACALL DLOOP          
  SJMP MAIN            
DLOOP: MOV R5,#100D
BACK1: MOV A,TL1           
   MOV B,#100D
   DIV AB              
   SETB P1.0
   ACALL DISPLAY       
   MOV P0,A            
   ACALL DELAY         
   ACALL DELAY
   MOV A,B
   MOV B,#10D
   DIV AB              
   CLR P1.0
   SETB P1.1
   ACALL DISPLAY       
   MOV P0,A
   ACALL DELAY
   ACALL DELAY
   MOV A,B             
   CLR P1.1
   SETB P1.2
   ACALL DISPLAY       
   MOV P0,A
   ACALL DELAY
   ACALL DELAY
   CLR P1.2
   DJNZ R5,BACK1       
   RET

DELAY: MOV R7,#250D        
 DEL1: DJNZ R7,DEL1
   RET

DISPLAY: MOVC A,@A+DPTR    
     CPL A             
     RET
LUT: DB 3FH                
 DB 06H
 DB 5BH
 DB 4FH
 DB 66H
 DB 6DH
 DB 7DH
 DB 07H
 DB 7FH
 DB 6FH
END
有什么解决办法吗

发送数据。。。至i/o端口和led显示屏

ORG 000H
MOV DPTR,#LUT              
MOV P1,#00000000B          
MOV P0,#00000000B          
MAIN: MOV R6,#14D
  SETB P3.5
  MOV TMOD,#01100001B  
  MOV TL1,#00000000B   
  MOV TH1,#00000000B   
  SETB TR1             
BACK: MOV TH0,#00000000B   
  MOV TL0,#00000000B   
  SETB TR0             
HERE: JNB TF0,HERE         
  CLR TR0              
  CLR TF0              
  DJNZ R6,BACK
  CLR TR1              
  CLR TF0              
  CLR TF1              
  ACALL DLOOP          
  SJMP MAIN            
DLOOP: MOV R5,#100D
BACK1: MOV A,TL1           
   MOV B,#100D
   DIV AB              
   SETB P1.0
   ACALL DISPLAY       
   MOV P0,A            
   ACALL DELAY         
   ACALL DELAY
   MOV A,B
   MOV B,#10D
   DIV AB              
   CLR P1.0
   SETB P1.1
   ACALL DISPLAY       
   MOV P0,A
   ACALL DELAY
   ACALL DELAY
   MOV A,B             
   CLR P1.1
   SETB P1.2
   ACALL DISPLAY       
   MOV P0,A
   ACALL DELAY
   ACALL DELAY
   CLR P1.2
   DJNZ R5,BACK1       
   RET

DELAY: MOV R7,#250D        
 DEL1: DJNZ R7,DEL1
   RET

DISPLAY: MOVC A,@A+DPTR    
     CPL A             
     RET
LUT: DB 3FH                
 DB 06H
 DB 5BH
 DB 4FH
 DB 66H
 DB 6DH
 DB 7DH
 DB 07H
 DB 7FH
 DB 6FH
END
您似乎还没有完全了解电路的工作原理:

引脚P1.0至P1.2指定哪个7段数字打开,引脚P0.0至P0.6指定哪个数字显示在相应的段上

例如:

如果端口P0的值为6,则显示数字“1”。如果P1.0和P1.2打开,P1.1关闭,则第一个和最后一个段处于活动状态,中间段处于非活动状态(因此显示
1_1
)。如果P1.0关闭,P1.1和P1.2打开(P0仍然具有值6),则显示
\u 11

您的程序所做的是:它向P0写入一些值(例如6以生成数字“1”),并打开P1.0,关闭P1.1和P1.2。所以第一个数字是“1”,另外两个数字是关闭的

然后它关闭第一个数字并打开第二个数字。所以实际上,同一时间只有一个数字处于活动状态(“可见”)!然而,这发生得如此之快,以至于你的眼睛没有注意到它,你认为这三个数字都是永久可见的

数到9999

4位十进制数需要第4个7段数字

255或8位以上的数据

有两种可能性:

  • 计数器的高8位存储在TH1寄存器中。
  • 您可以执行16位除法(将16位值除以100)。然而,在8位CPU上执行16位除法远不如
    DIV
    指令简单

    您必须在循环中执行换档操作

    您可以将除法的商除以100,然后使用
    DIV
    将其除以10;商和余数是第一位和第二位数字。(除法提示用100除以10得到第三位和最后一位数字。)

  • 使用两个计数均为100的计数器…
  • 您可以定义两个计数器变量(例如H和L),而不是直接将TL1的值传递给显示器:

    要将值X添加到计数器,请将X添加到变量L

    如果L达到值100,则增加H并从L中减去100

    现在,计数器的值可以表示为100*H+L:H包含4位十进制数的前两位,L包含最后两位十进制数字

    如果定义了两个附加变量N和O,则可以通过以下方式执行此操作:

    Initialize:
    L = 0
    H = 0
    O = TL1 (= 0)
    
    Before sending data to the display do:
    N = TL1
    L = L + N - O
    O = N
    divide L by 100
    H = H + quotient
    L = reminder
    (and optionally):
       divide H by 100
       H = remainder
    
    Now:
    L contains a number in the range 0-99 reflecting the low 2 digits
    H contains a number in the range 0-99 reflecting the high 2 digits
    

    “我无法将255(FFH)以上的数据发送到i/O端口”,您无法将255(FFH)以上的数据发送到单个端口。但是,您可以为4个不同的端口发送4个值。请访问StackOverflow!请通过以下步骤了解此网站的工作原理。-是的,多个端口,或者您可以使用时间多路复用。请进行一些研究。请向我们展示您如何将显示器连接到µC的电路。@thebusybee:从代码中可以明显看出:每个7段显示器的阳极连接到P1.0、P1.1和P1.2;如果他想数到9999,则需要第四个7段显示器;例如,阳极可以连接到P1.3。LED的7个阴极连接到反向引脚P0.0-P0.6(可能7个非栅极(NPN晶体管)用作放大器)。这些管脚中的每一个都连接到4个阴极(所有4个管段中都有相同的LED)。如果OP告诉我们“我不能…”,我不会查看代码;-)所以我试着激发更多的努力来帮助我们。