硬件连线图如下【注意最好按下面的连接,不然可能有bug存在】
其中74LS373是8位数据锁存器,让它的LE与89C51的ALE连接,实现并且,把它的输入与P0端一一连接,然后74LS373输出的Q0和Q1分别连接到A0和A1,其中A0和A1是控制选择位然后Q7连接到CS位,即位选位
端口地址是16位地址线,然后51单片机的P0是16位中的低8位,P2是16位中的高8位
所以端口地址的计算为:1111 1111 0111 1111 为0xff7f【CS必须为0】
然后PA的端口地址为:1111 1111 0111 1100为0xff7c【A1A0负责控制选择8255的那个输出端口,有四种可能 00 选PA口,01 选PB口,10 选PC口 ,11则为选择控制器,即确定8255整个端口地址的时候使用】
同理:得到PB的端口地址为:1111 1111 0111 1101 为0xff7d
同理:得到PC的端口地址为:1111 1111 0111 1110 为0xff7e
最终得到了4个端口地址:
0xff7f【8255控制】
0xff7c【8255的PA端口地址】
0xff7d【8255的PB端口地址】
0xff7e【8255的PC端口地址】
端口地址的使用【下面的是代码的一部分,端口地址的使用方法】
#include //在使用XBYTE的时候,一定要包含这个文件 #define com8255 XBYTE[0xff7f] //宏定义口地址 #define com8255_a XBYTE[0xff7c] #define com8255_b XBYTE[0xff7d] #define com8255_c XBYTE[0xff7e]
得到4个端口地址以后来确定8255控制字
下图为8255的8255控制字确定表
例1:想要确定PA、PB、PC都是输出模式,且都为方式0
注意:输出模式就是8255的端口往外输出,而输入模式就是外部往8255的输出端口里写数据
解:那么根据上面的图:就可以得到控制字应该为 1000 0000即0x80
那么现在就可以来写完整的流水灯代码了
#include#include #include sbit KEY = P0 ^ 0; #define com8255 XBYTE[0xff7f] //宏定义口地址 #define com8255_a XBYTE[0xff7c] #define com8255_b XBYTE[0xff7d] #define com8255_c XBYTE[0xff7e] void Delay1ms(unsigned int xms) //@12.000MHz { unsigned char i, j; while (xms) { i = 2; j = 239; do { while (--j) ; } while (--i); xms--; } } void main() { unsigned char i = 0; com8255 = 0x80; com8255_a=0x00; com8255_b=0x00; com8255_c=0x00; while (1) { Delay1ms(500); com8255_a = 0xFE; // 1111 1110 Delay1ms(500); com8255_a = 0xFD; // 1111 1101 Delay1ms(500); com8255_a = 0xFB; // 1111 1011 Delay1ms(500); com8255_a = 0xF7; // 1111 0111 Delay1ms(500); com8255_a = 0xEF; // 1110 1111 Delay1ms(500); com8255_a = 0xDF; // 1101 1111 Delay1ms(500); com8255_a = 0xBF; // 1011 1111 Delay1ms(500); com8255_a = 0x7F; // 0111 1111 Delay1ms(500); } }



