
实验 并行IO口8255扩展.docx
8页实验 并行IO口8255扩展 实验三并行I/O口8255扩展 一、实验目的 1、了解8255A芯片的结构以及编程方法 2、掌握通过8255A并行口读取开关数据的方法 二、实验说明 本次实验用通过8255扩展接口,仅通过P0端口控制8只集成式7段数码管的显示控制8255A的PA、PB 端口分别连接8位数码管的段码和位码,程序控制数码管滚动显示一串数字 三、实验线路图 四、实验步骤 1、先建立文件夹“ex3”,然后建立“ex3”工程项目,最后建立源程序文件“ex3.c”,输入如下源程序;/******************************************* 实验3:用8255实现接口扩展 ******************************************/ #include #include #define uchar unsigned char #define uint unsigned int //PA,PB,PC端口及命令端口地址定义 #define PA XBYTE[0x0000] //定义8255A地址 #define PB XBYTE[0x0001] //定义8255B地址 #define PC XBYTE[0x0002] //定义8255B地址 #define COM XBYTE[0x0003] //定义8255B控制寄存器地址 //待显示字符队列编码 uchar code DSY_CODE_Queue[ ]= {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xA4,0xC0,0xC0,0x80,0xC0,0x80,0xF9,0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; //共阳极的7段集成式数码管对应编码 // 0:0xc0 // 1:0xcf // 2:0xa4 // 3:0xb0 // 4:0x99 // 5:0x92 // 6:0x82 // 7:0xf8 // 8:0x80 // 9:0x90 // A:0x88 // B:0x83 // C:0xc6 // D:0xa1 // E:0x86 // F:0x8e // DOT:0x7f //数码管选通 uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //延时 void DelayMS (uint ms) {uchar i; while(ms--) for (i=0;i<120;i++); } /********主程序********/ void main( ) { uchar i,j,k; //8255工作方式选择:PA,PB均输出,工作方式0 COM=0x80; while(1) { for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快 { for (k=0;k<8;k++) //在8只数码管上动态显示各字符 { PB= DSY_Index[k]; //位码 PA= DSY_CODE_Queue[k+i]; //段码 DelayMS (1); } } //刷新显示一段时间后递增1,形成滚动效果,最大索引为14 i= (i+1)%15; } } 2、用Proteus软件仿真 经过Keil软件编译通过后,可利用Proteus软件仿真。
在Proteus ISIS编辑环境中绘制仿真电路图打开配套实验3仿真原理图文件“ex3.DSN”,将编译好的“ex3.hex”文件载入A T89C51,启动仿真 五、思考题 本实验中仅使用了PA、PB端口,完成本次实验调试后,再加一组相同的8位数码管,用PA控制两组数码管,PB控制第一组数码管,PC控制第二组数码管,在两组数码管上同时显示出年月日和时分秒等信息/******************************************* 实验33:用8255实现接口扩展 ******************************************/ #include #include #define uchar unsigned char #define uint unsigned int //PA,PB,PC端口及命令端口地址定义 #define PA XBYTE[0x0000] //定义8255A地址 #define PB XBYTE[0x0001] //定义8255B地址 #define PC XBYTE[0x0002] //定义8255B地址 #define COM XBYTE[0x0003] //定义8255B控制寄存器地址 //待显示字符队列编码 uchar code DSY_CODE_Queue_DAY[ ]= //日期段码 {0xff, 0xff, 0xff, 0xA4, 0xC0, 0xcf, 0xa4, 0xbf, 0xcf, 0xcf, 0xbf, 0xc0, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; uchar code DSY_CODE_Queue_TIME[ ]= //时间段码 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff , 0xcf, 0x82, 0x7f, 0xa4, 0xb0, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; //共阳极的7段集成式数码管对应编码 // 0:0xc0 // 1:0xcf // 2:0xa4 // 3:0xb0 // 4:0x99 // 5:0x92 // 6:0x82 // 7:0xf8 // 8:0x80 // 9:0x90 // A:0x88 // B:0x83 // C:0xc6 // D:0xa1 // E:0x86 // F:0x8e // DOT:0x7f // -:0xaf //数码管选通 uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //延时 void DelayMS (uint ms) {uchar i; while(ms--) for (i=0;i<120;i++); } /********主程序********/ void main( ) { uchar i,j,k; //8255工作方式选择:PA,PB均输出,工作方式0 COM=0x80; while(1) { for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快{ for (k=0;k<8;k++) //在8只数码管上动态显示各字符{ PA= DSY_Index[k]; //位码 PC= DSY_CODE_Queue_DAY[k+i]; //日期段码 PB= DSY_CODE_Queue_TIME[k+i]; //时间段码 DelayMS (1); } } //刷新显示一段时间后递增1,形成滚动效果,最大索引为14 i= (i+1)%15; } } 。












