题目:单片机与8255A的链接图如下,按键开关状态按下表控制PA口接8个发光二极管,PB口上接了两个按键开关,按键开关状态按下表控制PA口的发光二极管点亮,尝试编写不同状态控制二极管点亮程序。
8255A的A1,A2连接地址线的低两位P0.0和P0.1
分析:很好理解PB口输入,两个开关数据,一共形成四种状态,每种状态对8个LED的一种状态。所以此题的关键是要明白8255A的控制方式以及,汇编中SWITCH语句怎么写。
- 分析8255A的地址
我们开始写程序啦,首先先搞清楚8255A的控制字以及PA口,PB口,控制字地址在哪里怎么写
看图CS片选信号要为0,p2.7为0,8255A才工作,两位A1A0的四种组合分别对应 A1A0=00 PA口地址,A1A0=01 PB口地址,A1A0=10 PC口地址,A1A0=11控制字地址。其他的地址线默认给1。地址就出来啦。
分析得出PA口地址=0XXXXXXXXXXXXX00B=7FFCH
(X为无关1,0都可以一般习惯给1)
PB口地址=0XXXXXXXXXXXXX01B=7FFDH
PC口地址=0XXXXXXXXXXXXX10B=7FFEH
控制字地址=0XXXXXXXXXXXXX11B=7FFFH
地址找到了 下一步就是初始8255A,那么
PA口为输出点亮LED,PB口输入读入开关的状态,都工作在方式0故控制字8255A的控制字为10000010B=82H,这里 书上有详细的我就不废话了,或者百度8255A。
所以 第一句应该就是
MOV DPTR,#7FFFH
MOV A,#82H
MOVX @DPTR,A
所以 DPTR填写 控制字的地址,A放控制字的数据。ok 那么 写PA口和读PB口和这个 思路一样
- 汇编的SWITCH分支语句
这个时候我们知道c51单片机怎么和 8255A交互了以后。在搞清楚怎么用两个开关实现四种状态的控制呢。也就是汇编的SWTICH语句
怎么写
我们先给个标号
TAB:
AJMP STATE0
AJMP STATE1
AJMP STATE2
AJMP STATE3
每个跳转对应一种处理方式,是不是就完成了SWITCH语句嘿嘿。你只需要在STATE0标号下完成他的操作就行了。 这里要知道STATE0的相对地址是0(相对于TAB),STATE1相对地址是1x2=2。为什么 乘2?因为AJMP占2个字节。 那STATE2相对地址是多少 2x2=4。 举一反三如果用:LJMP代替AJMP 相对地址怎么算呢?LJMP是占三个字节的。所以你懂了吧。
所以 我们只需要从PB口读入开关的状态,然后 把这个值扩大两倍,在把TAB的地址加上这个值,是不是就完成了switch语句呢?代码就出来啦。
ORG 0000H
MOV DPTR,#7FFFH
MOV A,#82H//控制字 1 0000 010 A输出 B口输入
MOVX @DPTR,A
LOOP:MOV DPTR,#7FFDH //B口地址
MOVX A,@DPTR //读B口
ANL A,#03H //只取低两位
MOV DPTR,#TAB //查表
MOV B,A //就是把A*2 别问为什么不用MUL乘法指令,这个MUL乘法指令占四个指令周期,哥写的代码效率高你懂吧只需要三个指令周期
ADD A,B
JMP @A+DPTR //这段代码就是上面所讲的
AJMP LOOP //循环不停查询
TAB:AJMP STATE0 //标号
AJMP STATE1
AJMP STATE2
AJMP STATE3
STATE0:MOV DPTR,#7FFCH//数据给A口
MOV A,#00H //全灭
MOVX @DPTR,A
AJMP LOOP
STATE1:MOV DPTR,#7FFCH//数据给A口
MOV A,#55H //1357点亮
MOVX @DPTR,A
AJMP LOOP
STATE2:MOV DPTR,#7FFCH//数据给A口
MOV A,#0AAH //2468全灭
MOVX @DPTR,A
AJMP LOOP
STATE3:MOV DPTR,#7FFCH//数据给A口
MOV A,#0FFH //全亮
MOVX @DPTR,A
AJMP LOOP
END
源码给了哦 仿真效果如下。还是自己看了分析直接写一下吧!!
图一K1为0 K2为1
图二K1为1 K2为0
Proteus接线太丑了见谅!!
感谢阅读
有兴趣交流单片机复试或者想一起学习进步的
加我QQ:572378048(备注来意)
以及我建立的单片机交流群1045064419