⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s8251.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
字号:
;FOR    EAT598
Z8279   EQU     0F239H  ;8279 状态/命令口地址
D8279   EQU     0F238H  ;8279 数据口地址
LEDMOD  EQU     00H     ;左边输入 八位字符显示
                        ;外部译码键扫描方式,双键互锁
LEDFEQ  EQU     2FH     ;扫描速率
LEDCLS  EQU     0C1H    ;清除显示 RAM
LEDWR0  EQU     80H     ;设定的将要写入的显示RAM地址
READKB  EQU     40H     ;读 FIFO RAM 地址 0 的命令字
Z8251   EQU     0F202H  ;8251 状态/命令口地址
D8251   EQU     0F200H  ;8251 数据口地址
COM_MOD EQU     04EH    ;字符 8 位, 1 位起始位, 1 位停止位
                        ;异步 * 16,不校验
COM_COM EQU     25H     ;请求发送,发送允许,接收允许

        ORG     0000H
        AJMP    START
        ORG     0040H
START:
        MOV     SP,#60H
        LCALL   INIT8279        ;初始化8279
        LCALL   INIT8251        ;初始化8251
        SETB    EA              ;开中断
WAIT:
        MOV     DPTR,#Z8251     ;8251 状态寄存器(读)
        MOVX    A,@DPTR
        ANL     A,#02H
        JZ      WAIT1           ;判断是否有串行输入
        SJMP    DIS_REC         ;显示字符
WAIT1:  LCALL   GETKEY          ;读键盘
        CJNE    A,#0FFH,WAIT    ;判断是否有按键
        MOV     DPTR,#Z8251
WAIT3:  MOVX    A,@DPTR
        ANL     A,#01H
        JZ      WAIT3           ;判断发送允许
        MOV     A,B
        MOV     DPTR,#D8251
        MOVX    @DPTR,A         ;发送数据
        NOP
        MOV     DPTR,#Z8251
WAIT2:  MOVX    A,@DPTR
        ANL     A,#01H
        JZ      WAIT2           ;判断发送允许
        SJMP    WAIT

DIS_REC:
        MOV     DPTR,#D8251
        MOVX    A,@DPTR         ;读接收到的字符
        CLR     C
        SUBB    A,#30H          ;以下判定输入是否在0-F内
        JC      ERROR
        SUBB    A,#0AH
        JNC     DIS_REC1
        ADD     A,#0AH
        SJMP    DIS_REC2
DIS_REC1:
        SUBB    A,#7H
        JC      ERROR
        SUBB    A,#6H
        JNC     ERROR
        ADD     A,#10H
DIS_REC2:
        MOV     R4,#0
        MOV     R5,A
        LCALL   DISLED          ;显示输入的数字(0-F)
ERROR:  AJMP    WAIT

INIT8251:                       ;8251 初始化子程序
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        MOV 	DPTR,#Z8251        

        MOV 	A,#COM_MOD       ;置 8251 工作方式
        MOVX 	@DPTR,A
        NOP

        MOV 	A,#COM_COM       ;请求发送,发送允许,接收允许
        MOVX 	@DPTR,A
        NOP

        MOV 	A,#65H
        MOVX 	@DPTR,A
        NOP

        MOV    	A,#COM_MOD       ;置 8251 工作方式
        MOVX   	@DPTR,A
        NOP

        MOV    	A,#COM_COM       ;请求发送,发送允许,接收允许
        MOVX   	@DPTR,A
        NOP
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET

INIT8279:                       ;8279初始化子程序
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        LCALL  DELAY            ;延时
        MOV    DPTR ,#Z8279
        MOV    A,#LEDMOD        ;置8279工作方式
        MOVX   @DPTR,A
        MOV    A,#LEDFEQ        ;置键盘扫描速率
        MOVX   @DPTR,A
        MOV    A,#LEDCLS        ;清除 LED 显示
        MOVX   @DPTR,A
        LCALL  DELAY            ;延时
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET
;读键盘子程序
;输入: 无   ; 输出: B: 读到的键码 A: 按键的标志
GETKEY: PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   PSW
        MOV    DPTR,#Z8279
        MOVX   A,@DPTR          ;读8279状态
        ANL    A,#07H           ;屏蔽D7-D3
        JNZ    GETVAL           ;判断是否有键输入
        MOV    A,#0H            ;置标志(无键输入)
        SJMP   NKBHIT
GETVAL: MOV    A,#READKB        ;读 FIFO RAM 命令
        MOVX   @DPTR,A
        MOV    DPTR,#D8279
        MOVX   A,@DPTR          ;读键
        ANL    A,#3FH           ;屏蔽 SHIFT 和 CTRL 键
        MOV    R6,A
        MOV    DPTR,#KEYCODE    ;键码表起始地址
        MOVC   A,@A+DPTR        ;查表
        MOV    B,A              ;置返回键值
        MOV    A,#0FFH          ;置标志(有键输入)
        MOV    A,#LEDWR0        ;置显示起始地址
        MOV    DPTR,#Z8279
        MOVX   @DPTR,A         ;设定显示位置
        MOV    DPTR,#LEDSEG    ;置显示常数表起始位置
        MOV    A,R6
        MOVC   A,@A+DPTR       ;查表
        MOV    DPTR,#D8279
        MOVX   @DPTR,A         ;显示数据
        MOV    A,#0FFH
NKBHIT: POP    PSW              ;恢复现场
        POP    DPL
        POP    DPH
        RET
;显示字符子程序
;输入: R4,位置 R5,值
DISLED:  PUSH   DPH             ;保存现场
         PUSH   DPL
         PUSH   ACC
         MOV    A,#LEDWR0       ;置显示起始地址
         ADD    A,R4            ;加位置偏移量
         MOV    DPTR,#Z8279
         MOVX   @DPTR,A         ;设定显示位置
         MOV    DPTR,#LEDSEG    ;置显示常数表起始位置
         MOV    A,R5
         MOVC   A,@A+DPTR       ;查表
         MOV    DPTR,#D8279
         MOVX   @DPTR,A         ;显示数据
         POP    ACC             ;恢复现场
         POP    DPL
         POP    DPH
         RET

DELAY:                          ;延时子程序
        PUSH    0               ;保存现场
        PUSH    1
        MOV     0,#0H
DELAY1: MOV     1,#0H
        DJNZ    1,$
        DJNZ    0,DELAY1
        POP     1               ;恢复现场
        POP     0
        RET

;LED显示常数表
LEDSEG: DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
        DB      7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
;键盘键码表
KEYCODE:DB      30H,31H,32H,33H,34H,35H,36H,37H ;'0,1,2,3,4,5,6,7'
        DB      38H,39H,41H,42H,43H,44H,45H,46H ;'8,9,A,B,C,D,F,F'
        
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -