实验一:8255输入、输出实验一.实验要求编写程序,使用8255可编程并行口芯片,来检测八位拨动开关的状态,并控制八位发光二极管。使得八位发光二极管的亮灭变化与八位拨动开关的状态相一致。实验中用8255PB口作输入,PC口做输出。二.实验目的了解8255芯片结构及编程方法。三.实验电路及连线8255的PB0~PB7(PB口)接至八位拨动开关K0~K7。将PC0~PC7(PC口)接至八位发光二极管L0–L7。CS8255接F228。四.实验说明可编程通用接口芯片8255A有三个八位的并行I/O口,请用户仔细阅读有关书籍掌握其特点和各种用法。由于8255的A1、A2脚分别接至地址线的A0、A1。所以相对应8255各口/寄存器的地址分配如下:PA口:F228H;PB口:F229H;PC口:F22AH;控制寄存器地址:F22BH。本示例程序中使用PB口作输入,检测八位拨动开关的状态;使用PC口作输出,控制八个发光二极管的亮灭。五.实验程序及框图实验示例程序见8255.ASM。实验示例程序流程框图如下:程序代码:;FOREAT598;---------------------------------------------------------D8255EQU0F22BH;8255命令口地址D8255AEQU0F228H;8255PA口地址D8255BEQU0F229H;8255PB口地址D8255CEQU0F22AH;8255PC口地址;---------------------------------------------------------ORG0000HLJMPSTARTORG0100HSTART:LCALLDELAY;延时MOVDPTR,#D8255MOVA,#82H;置8255状态;方式0,PA,PC口输出,PB口输入MOVX@DPTR,AROTATE:MOVDPTR,#D8255BMOVXA,@DPTR;读开关状态MOVDPTR,#D8255CMOVX@DPTR,A;点亮对应的LEDSJMPROTATE开始设置8255工作状态PB口读入八位开关量PC口输出至八位二极管DELAY:MOVR0,#0H;延时子程序DELAY1:MOVR1,#0HDJNZR1,$DJNZR0,DELAY1RETEND实验二:扫描键盘、显示实验一.实验要求利用8255可编程并行口做一个扫描键盘实验,把按键输入的键码,显示在由PA口控制的七段数码管上。8255PB口做键盘输入线,PC口作扫描线。二.实验目的1.掌握8255编程方法。2.掌握扫描键盘和显示的编程方法。三.实验电路及连线CS8255接F228H,则命令字地址为F22BH,PA口地址为F228H,PB口地址为F229H,PC口地址为F22AH。○30模块中的十个短路套都套在8155/8255侧。四.实验说明在PB口与PC口组成的64点阵列上,把按键接在不同的点上,将得到不同的键码,本实验采用8×2的阵列,共可按16个键。显示部分由PA控制,由7407驱动8位数码管显示。五.实验框图实验示例程序见8255_key.ASM。实验示例程序流程框图如下:8255_KEY.ASM主程序框图读键显示部分框图程序代码:;FOREAT598-HD-V3.0;---------------------------------------------------------C8255EQU0F22BH;8255命令口地址P8255AEQU0F228H;8255PA口地址P8255BEQU0F229H;8255PB口地址P8255CEQU0F22AH;8255PC口地址KEYVALEQU30H;读到的键码FLAGEQU40H;有键标志;---------------------------------------------------------ORG0000HSJMPSTARTORG0060HSTART:MOVSP,#60HMOVFLAG,#00H;按键标志初始值:00无键,FF有键MOVR2,#0FEH;位码初始值LCALLDELAYMOVKEYVAL,#00H;置显示初始值MOVDPTR,#C8255;MOVA,#82H;PB口输入,PA,PC口输出MOVA,#90H;PC口输出,PA输入,PB口输出MOVX@DPTR,A入口扫描第一行有键按下扫描第二行有键按下返回计算键值换算显示码返回N无键标志YNYMOVDPTR,#P8255CMOVA,#00HMOVX@DPTR,AKB_DIS:LCALLRD_KB;读键子程序LCALLDISP;显示子程序SJMPKB_DIS;循环扫描;---------------------------------------------------------DISP:MOVA,FLAGJZDISP_END;无键转DISP_END;有键显示MOVDPTR,#C8255MOVA,#89H;PC口输入,PA,PB口输出MOVX@DPTR,A;MOVDPTR,#P8255A;显示键值MOVDPTR,#P8255A;写位码MOVA,R2MOVX@DPTR,AMOVDPTR,#P8255B;显示键值MOVA,KEYVALMOVX@DPTR,ALCALLDELAY1;显示延时LCALLDELAY1MOVA,R2;下一位SETBCRLCAMOVR2,ACJNEA,#0FFH,DISP_END;八位轮回MOVR2,#0FEH;重置位码初值DISP_END:RET;---------------------------------------------------------;读取键盘子程序RD_KB:MOVDPTR,#C8255MOVA,#90H;PC口输出,PA输入,PB口输出MOVX@DPTR,AMOVA,#02H;键盘扫描第一行MOVDPTR,#P8255CMOVX@DPTR,A;MOVDPTR,#P8255BMOVDPTR,#P8255AMOVXA,@DPTRCJNEA,#0FFH,KEY_L0;判键是否按下,有键转KEY_L0SJMPKEY_L1;无键转第二行KEY_L0:LCALLDELAY22;延时消抖;MOVDPTR,#P8255B;读键值MOVDPTR,#P8255AMOVXA,@DPTRMOVR1,#00HCJNEA,#0FFH,KEYCAL;计算键值KEY_L1:MOVA,#01H;扫描第二行MOVDPTR,#P8255CMOVX@DPTR,A;MOVDPTR,#P8255B;读键值MOVDPTR,#P8255AMOVXA,@DPTRCJNEA,#0FFH,J_KEY_L1;判键是否按下,有键转J_KEY_L1SJMPNOKEY;无键转结束J_KEY_L1:LCALLDELAY22;延时消抖;MOVDPTR,#P8255B;读键值MOVDPTR,#P8255AMOVXA,@DPTRMOVR1,#08HCJNEA,#0FFH,KEYCAL;计算键值SJMPNOKEY;无键按下KEYCAL:;计算键码MOVR0,#08HSHIFT:RRCAJNCCALCINCR1DJNZR0,SHIFTCALC:;换算显示码MOVDPTR,#LEDSEGMOVA,R1MOVCA,@A+DPTRMOVKEYVAL,ASJMPKEYWAITNOKEY:MOVFLAG,#00HSJMPKEYEXITKEYWAIT:;MOVDPTR,#P8255B;等待键释放MOVFLAG,#0FFHMOVDPTR,#P8255AMOVXA,@DPTRCJNEA,#0FFH,KEYWAITKEYEXIT:RET;---------------------------------------------------------DELAY:MOVR0,#0H;延时20MS子程序DELAY0:MOVR1,#27HDJNZR1,$DJNZR0,DELAY1RET;---------------------------------------------------------DELAY1:MOVR0,#0H;延时DELAY11:MOVR1,#00HDJNZR1,$DJNZR0,DELAY11RET;---------------------------------------------------------DELAY2:MOVR0,#0H;延时DELAY22:MOVR1,#10HDJNZR1,$DJNZR0,DELAY22RET;---------------------------------------------------------;LED显示常数表LEDSEG:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;0,1,2,3,4,5,6,7DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;8,9,A,B,C,D,E,F;---------------------------------------------------------END