赞
踩
熟悉星研集成开发环境,掌握微机接口程序编写调试的基本方法。
掌握矩阵式键盘的工作原理及识别键盘按键的方法。
掌握8段数码管显示数字或字符的工作原理和它的使用方法。
掌握用8255扫描键盘及用8255刷新数码管显示的方法。
在(2行*8列)小键盘上任意按下某个按键,该键的键值将同时显示在8个数码管上。按键松开时显示上一次的按键值。
实验箱上2行*8列小键盘上当某个按键被按下时,该键所在行的行线值为0、所在列的列线值也为0。根据这个特点结合上述原理图采用“列扫描法”可以识别出当前被按下的按键。
实验箱上8个8段数码管。每个数码管有8个笔段,按逆时针方向依次称为a段、b段、c段、d段、e段、f段、g段、dp段,8个段接收来自外部的一个8位二进制数(D7—D0),并且笔段a 对应数据位D0……..笔段dp 对应数据位D7 ,由于数码管是共阳的,当段码端接收低电平时相应的笔段就会点亮,段码端接收的数据决定了数码管显示的具体内容。(例:要显示数字0,则笔段a、b、c、d、e、f 都必须点亮,笔段g、h不应该点亮,8个段接收的值应该是11000000,数据D0--D7就应该是11000000(0C0H),让段码端接收11000000它就会显示0)。
数码管的位码控制GND端,当它接收低电平时该数码管会被选中有效工作:即这时只要段码端有有效的数据数码管就会显示数据,当它接收高电平时数码管不工作,这时即使段码端有有效数据数码管也不会显示任何数据。
8255的A口工作在方式0输出状态控制数码管的段码;B端口工作在方式0输出状态控制数码管的位码,并且同时控制键盘列线的扫描;C端口工作在方式0输入状态,其中的PC0、PC1控制键盘的第一、第二行行值的读入。
- .MODEL TINY
- PA_8255 EQU 0270H
- PB_8255 EQU 0271H
- PC_8255 EQU 0272H
- CTRL_8255 EQU 0273H
- .STACK 100
- .DATA
- buffer DB ?
- SEG_TAB DB 0C0H, 0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H
- DB 080H, 90H, 88H, 83H, 0C6H,0A1H,86H,8EH,0FFH
-
- .CODE
- START: MOV AX,@DATA
- MOV DS,AX
- MOV ES,AX
- NOP
- MOV DX,CTRL_8255 ;8255初始化
- MOV AL,89H
- OUT DX,AL
- LEA SI,buffer
- MOV AL,10H ;默认数码管不显示
- MOV [SI],AL
-
- CALL DIR ;调用显示子程序
-
- MAIN2: LEA DI,buffer
- CALL Getkey ;得到按键在SEG_TAB中的值放入AL
- STOSB ;将AL赋值给DI指向的地址
- CALL DIR
- JMP MAIN2
-
- DIR PROC NEAR
- PUSH AX
- PUSH BX
- PUSH DX
- LEA SI,buffer ;置显示缓冲器初值
- MOV AL,[SI]
- LEA BX,SEG_TAB
- XLAT ;查表取显示数据->AL
- MOV DX,PA_8255
- OUT DX,AL ;AL段数据->8255 PA口
- MOV DX,PB_8255
- MOV AL,0 ;位码控制GND端低电平有效, 显示8位数据管
- OUT DX,AL
- CALL DL1ms
- POP DX
- POP BX
- POP AX
- RET
- DIR ENDP
-
- DL1ms PROC NEAR
- PUSH CX
- MOV CX,500
- LOOP $
- POP CX
- RET
- DL1ms ENDP
-
- GETKEY PROC NEAR
- PUSH BX
- PUSH DX
- LK: CALL AllKey ;调用判有无闭合键子程序
- JNE LK1
-
- CALL DIR ;调用显示子程序
- JMP LK
- ;补充程序完成列扫描,得到按键在SEG_TAB中的值放入AL
- LK1: MOV BL, 0FEH ;0FEH-->BL 第0列开始扫描,用BL保存列线扫描口数值,从PB0开始
- MOV BH, 0 ;0-->BH 用BH保存列线值,从第0列开始
- LK2: MOV DX, PB_8255 ;写B口位码控制端
- MOV AL, BL ;
- OUT DX, AL ;将BL写入B口列线控制端
-
- MOV DX, PC_8255 ;读C口
- IN AL, DX ;
- TEST AL, 1 ;PC0不等于0转向LONE继续判断PC1
- JNZ LONE ;
- MOV AL, 0 ;0行有键闭合,0-〉AL PC0等于0表示0行有键闭合,用BH存放按键值
- JMP LKP
-
- LONE: TEST AL, 2
- JNZ NEXT ;PC1不等于0则转向NEXT列计算器+1
- MOV AL, 08 ;1行有键闭合,08H-->AL
-
- LKP: ADD BH, AL ;用BH保存键值
-
- LK3: CALL AllKey
- JNE LK3 ;判断释放否
-
- MOV AL, BH ;BH键号->AL
- JMP EXIT
-
- NEXT: INC BH ;列计数器加1
- TEST BL, 80H ;
- JZ EXIT ;判是否已扫到最后一列则转向KEND
-
- ROL BL, 1 ;将BL循环左移一位
- JMP LK2
- EXIT: POP DX
- POP BX
- RET
- GETKEY ENDP
-
-
- AllKey PROC NEAR ;判断键盘是否有按键闭合
- MOV DX,PB_8255
- XOR AL,AL
- OUT DX,AL ;全"0"->扫描口,列线控制端低电平有效
- MOV DX,PC_8255 ;读C口数据
- IN AL,DX ;读键状态
- AND AL,03H ;取低二位
- CMP AL,3 ;取C口低二位和00000011b比较
- RET
- AllKey ENDP
-
- END START
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。