Assembly 如何将大于8位的数据发送到I/O端口
我是汇编语言编程新手。我正在尝试使用at89c52 MC制作四个常见的annode 7段led显示屏,其计数可达9999。但我无法将255(FFH)以上的数据发送到i/O端口。 那么,我是否可以将255位或8位以上的数据发送到i/o端口和led显示屏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
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位以上的数据
有两种可能性:
DIV
指令简单
您必须在循环中执行换档操作
您可以将除法的商除以100,然后使用DIV
将其除以10;商和余数是第一位和第二位数字。(除法提示用100除以10得到第三位和最后一位数字。)
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告诉我们“我不能…”,我不会查看代码;-)所以我试着激发更多的努力来帮助我们。