实验一: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。
实验示例程序流程框图如下:开设置8255工作状态PB口读入八位开关量PC口输出至八位二极管程序代码:;FOR EAT598;---------------------------------------------------------D8255 EQU 0F22BH ;8255命令口地址D8255A EQU 0F228H ;8255 PA口地址D8255B EQU 0F229H ;8255 PB口地址D8255C EQU 0F22AH ;8255 PC口地址;---------------------------------------------------------ORG 0000HLJMP STARTORG 0100HSTART:LCALL DELAY ;延时MOV DPTR,#D8255MOV A,#82H ;置8255状态;方式0,PA,PC口输出,PB口输入MOVX @DPTR,AROTATE:MOV DPTR,#D8255BMOVX A,@DPTR ;读开关状态MOV DPTR,#D8255CMOVX @DPTR,A ;点亮对应的LEDSJMP ROTATEDELAY: MOV R0,#0H ;延时子程序DELAY1: MOV R1,#0HDJNZ R1,$DJNZ R0,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 主程序框图 读键显示部分框图程序代码:;FOR EAT598-HD-V3.0;---------------------------------------------------------C8255 EQU 0F22BH ;8255命令口地址 P8255A EQU 0F228H ;8255 PA 口地址 P8255B EQU 0F229H ;8255 PB 口地址 P8255C EQU 0F22AH ;8255 PC 口地址 KEYVAL EQU 30H ;读到的键码 FLAG EQU 40H ;有键标志 ;--------------------------------------------------------- ORG 0000H SJMP START ORG 0060H START:MOV SP,#60HMOV FLAG,#00H ;按键标志初始值:00无键,FF 有键MOV R2,#0FEH ;位码初始值 LCALL DELAYMOV KEYVAL,#00H ;置显示初始值 MOV DPTR,#C8255; MOV A,#82H ;PB 口输入,PA,PC 口输出 MOV A,#90H ;PC 口输出,PA 输入,PB 口输出入口扫描第一行有键按下扫描第二行有键按下返回计算键值换算显示码返回N无键标志YNYMOVX @DPTR,AMOV DPTR,#P8255CMOV A,#00HMOVX @DPTR,AKB_DIS:LCALL RD_KB ;读键子程序LCALL DISP ;显示子程序SJMP KB_DIS ;循环扫描;---------------------------------------------------------DISP:MOV A,FLAGJZ DISP_END ;无键转DISP_END;有键显示MOV DPTR,#C8255MOV A,#89H ;PC口输入,PA,PB口输出MOVX @DPTR,A; MOV DPTR,#P8255A ;显示键值MOV DPTR,#P8255A ;写位码MOV A,R2MOVX @DPTR,AMOV DPTR,#P8255B ;显示键值MOV A,KEYVALMOVX @DPTR,ALCALL DELAY1 ;显示延时LCALL DELAY1MOV A,R2 ;下一位SETB CRLC AMOV R2,ACJNE A,#0FFH,DISP_END;八位轮回MOV R2,#0FEH ;重置位码初值DISP_END:RET;---------------------------------------------------------;读取键盘子程序RD_KB:MOV DPTR,#C8255MOV A,#90H ;PC口输出,PA输入,PB口输出MOVX @DPTR,AMOV A,#02H ;键盘扫描第一行MOV DPTR,#P8255CMOVX @DPTR,A; MOV DPTR,#P8255BMOV DPTR,#P8255AMOVX A,@DPTRCJNE A,#0FFH,KEY_L0 ;判键是否按下,有键转KEY_L0SJMP KEY_L1 ;无键转第二行KEY_L0:LCALL DELAY22 ;延时消抖; MOV DPTR,#P8255B ;读键值MOV DPTR,#P8255AMOVX A,@DPTRMOV R1,#00HCJNE A,#0FFH,KEYCAL ;计算键值KEY_L1:MOV A,#01H ;扫描第二行MOV DPTR,#P8255CMOVX @DPTR,A; MOV DPTR,#P8255B ;读键值MOV DPTR,#P8255AMOVX A,@DPTRCJNE A,#0FFH,J_KEY_L1;判键是否按下,有键转J_KEY_L1SJMP NOKEY ;无键转结束J_KEY_L1:LCALL DELAY22 ;延时消抖; MOV DPTR,#P8255B ;读键值MOV DPTR,#P8255AMOVX A,@DPTRMOV R1,#08HCJNE A,#0FFH,KEYCAL ;计算键值SJMP NOKEY ;无键按下KEYCAL: ;计算键码MOV R0,#08HSHIFT:RRC AJNC CALCINC R1DJNZ R0,SHIFTCALC: ;换算显示码MOV DPTR,#LEDSEGMOV A,R1MOVC A,@A+DPTRMOV KEYVAL,ASJMP KEYWAITNOKEY:MOV FLAG,#00HSJMP KEYEXITKEYWAIT:; MOV DPTR,#P8255B ;等待键释放MOV FLAG,#0FFHMOV DPTR,#P8255AMOVX A,@DPTRCJNE A,#0FFH,KEYWAITKEYEXIT:RET;---------------------------------------------------------DELAY: MOV R0,#0H ;延时20MS子程序DELAY0:MOV R1,#27HDJNZ R1,$DJNZ R0,DELAY1RET;---------------------------------------------------------DELAY1: MOV R0,#0H ;延时DELAY11:MOV R1,#00HDJNZ R1,$DJNZ R0,DELAY11RET;---------------------------------------------------------DELAY2: MOV R0,#0H ;延时DELAY22:MOV R1,#10HDJNZ R1,$DJNZ R0,DELAY22RET;---------------------------------------------------------;LED显示常数表LEDSEG: DB 3FH,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。