news 2026/4/16 10:25:47

8255 PORTC 按键输入测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8255 PORTC 按键输入测试

1.硬件电路

2.测试程序(nasm汇编)

;------------------------------------------------------------------------------------------- ;长按学习板上的K4,会在串口上打印出 key0 event happen! ;------------------------------------------------------------------------------------------- ;2017.9.15 ;用nasm重新写原来的代码 ;推出配套的《在做中学微机原理》课程,与所销售的硬件相配套 ;从第一行程序开教,一步一步带你走入神秘的8086世界。 ; ;例程001 ;ex1.asm =example_1 ;8088启动,点亮系统板上的LED ;重点在于正确使用程序编辑环境,nasm汇编方法,EEprom的烧写方法 ; ;ex001----用下载到RAM中的程序,点亮系统板上的LED ;8088.asm是汇编源程序 ;8088.bin是编译生成的可下载执行的最终代码 ; ;编译很简单,双击make即可自动完成 ; ;Notepad++是我计算机上Notepad++的快捷方式 ;--------------------------------------------------------------------------------------------- led_port equ 800h _8255_port3 equ 203h _8255_porta equ 200h _8255_portb equ 201h _8255_portc equ 202h ;--------------------------------------------------------------------------------------------- org 2000h ;程序将由监控bios下载到内存RAM的地址(0000:2000) start: ;------------------------------------------------------ ;init part ;------------------------------------------------------ mov ax,0 mov ds,ax mov ss,ax mov sp,1fffh ;--------------------------------------------------------- ;8255 init ;--------------------------------------------------------- call _8255_init ;mov al,[LED_CODE] ;mov dx,_8255_porta ;out dx,al ;mov al,0feh ;mov dx,_8255_portb ;out dx,al st001: nop call _8255_disp call _8255_key ;----------------------------------------------------- ;点亮系统板上的LED ;----------------------------------------------------- ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,0aaH ;一亮一灭间隔点亮 OUT DX,AL call DELAY ;MOV DX,800H ;800H是板子上8个LED的端口地址号 mov dx,led_port MOV AL,00H ;一亮一灭间隔点亮 OUT DX,AL call DELAY mov ah,'$' call SEND ; lea di,STR1 ;nasm编译器不认 mov di, STR1 CALL STR_OUT mov di, STR3 CALL STR_OUT ;mov al,01010101b ;mov al,0f0h; ;out 25H,al ;hlt jmp st001 jmp start ;------------------------------------------------------------ ; DELAY PROC NEAR ;------------------------------------------------------------ ;push DELAY: PUSH CX PUSH BX NOP NOP mov bx,10 del1: mov cx,5882 del2: loop del2 dec bx jnz del1 ;pop cx ;pop bx POP BX POP CX RET ;------------------------------------------- ;pc16550 uart send by AH ;------------------------------------------- LSTAT EQU 1F5H DAT_165 EQU 1F0H SEND: ; PROC NEAR MOV DX,LSTAT WAITx: IN AL,DX TEST AL,20H JZ WAITx MOV AL,AH MOV DX,DAT_165 OUT DX,AL RET ;SEND ENDP ;------------------------------------------- ;串口打印字符串 ;------------------------------------------- STR_OUT :; PROC NEAR nop; LEA DI,STR1 STR_LOOP: ;MOV AH,BYTE PTR [DI] mov ah,byte [di] CMP AH,'$' JZ STR_EXIT CALL SEND INC DI JMP STR_LOOP STR_EXIT: NOP RET ;----------------------------- ;8255 init ;----------------------------- _8255_init: ;mov dx,203h mov dx, _8255_port3 ;mov al,80h mov al,89h;port a,b as output port c as input out dx,al ret _8255_disp: ;bit 0 mov al,[LED_CODE] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011111110b mov dx,_8255_portb out dx,al call DELAY ;bit 1 mov al,[LED_CODE+1] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011111101b mov dx,_8255_portb out dx,al call DELAY ;bit 2 mov al,[LED_CODE+2] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011111011b mov dx,_8255_portb out dx,al call DELAY ;bit 3 mov al,[LED_CODE+3] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011110111b mov dx,_8255_portb out dx,al call DELAY ;bit 4 mov al,[LED_CODE+4] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011101111b mov dx,_8255_portb out dx,al call DELAY ;bit 5 mov al,[LED_CODE+5] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 011011111b mov dx,_8255_portb out dx,al call DELAY ;bit 6 mov al,[LED_CODE+6] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 010111111b mov dx,_8255_portb out dx,al call DELAY ;bit 7 mov al,[LED_CODE+7] mov dx,_8255_porta out dx,al ;mov al,0feh mov al, 001111111b mov dx,_8255_portb out dx,al call DELAY ret ;------------------------------------------ ;8255 key ;------------------------------------------ _8255_key: MOV DX,202H IN AL,DX TEST AL,01H JNZ NO_KEY ;INC KEY_CNT mov di, STR4 CALL STR_OUT NO_KEY: NOP ret ;STR_OUT ENDP STR1 DB 'i8088-HELLO boy or girl!' ,13,10,'$' STR2 DB 0AH,0DH,' ',0dh,0ah,'$' STR3 db 'ex005---8255 key demo',13,10,'$' STR4 db 'key0 event happen!',13,10,'$' LED_CODE db 0C0h,0F9h,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H db 55h,55h,55h,55h,55h,55h ;程序结束标志,监控bios程序,收到后自动跳转到内存0000:2000处执行 ;----------------------------------------------------------------------------------------------

3.编译下载测试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:23:48

统一视觉多模态与多任务!快手可灵与港科大团队发布视频生成模型,加速真实世界理解

允中 整理自 凹非寺量子位 | 公众号 QbitAI不仅能“听懂”物体的颜色纹理,还能“理解”深度图、人体姿态、运动轨迹……统一多模态多任务的视频生成模型来了。来自港科大、港中文、清华大学和快手可灵的研究团队,最近提出了一个全新视觉框架——UnityVid…

作者头像 李华
网站建设 2026/4/16 10:24:29

60、Unix文件系统(UFS)深度解析

Unix文件系统(UFS)深度解析 1. UFS概述 Unix文件系统(UFS)是随Solaris系统发布的通用磁盘文件系统。自SunOS 4.x早期版本以来,它一直是基于磁盘的标准文件系统。在Solaris的发展历程中,UFS经历了大量变革,以满足应用性能、安全性和可靠性方面的要求。 2. UFS发展历程…

作者头像 李华
网站建设 2026/4/15 20:15:12

36、Unix/Linux文本处理与系统管理工具实用指南

Unix/Linux文本处理与系统管理工具实用指南 1. 目录大小统计脚本(dirsize.sh) 在Unix/Linux系统中,我们常常需要了解目录中文件和子目录的大小情况,以便合理管理磁盘空间。下面的 dirsize.sh 脚本可以帮助我们实现这一功能: #!/bin/bash cd "${1:-.}" if …

作者头像 李华
网站建设 2026/4/16 5:59:52

如何用AI自动修复Windows任务宿主错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个Windows系统错误诊断工具,能够自动检测task host window任务宿主正在停止错误。功能包括:1. 扫描系统日志和事件查看器 2. 分析错误原因(如资源冲突…

作者头像 李华
网站建设 2026/4/16 7:44:10

63、影响文件系统性能的分页参数及相关缓存机制解析

影响文件系统性能的分页参数及相关缓存机制解析 1. 启用优先级分页时的虚拟内存系统行为 当启用优先级分页时,虚拟内存系统会呈现出不同的行为。使用相同的测试程序对文件系统进行随机读取,会再次导致系统分页,页面扫描器会积极参与页面管理,且此时扫描器仅释放文件页面。…

作者头像 李华
网站建设 2026/4/16 7:43:50

37、系统管理工具实用指南

系统管理工具实用指南 在系统管理的日常工作中,有许多实用工具能帮助我们更高效地完成任务。下面为大家详细介绍一些常用工具及其使用方法。 1. 文件格式转换工具 在处理文件时,经常会遇到需要在 DOS 和 Unix 格式之间进行转换的情况。 tofrodos 软件包提供了 fromdos …

作者头像 李华