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

📄 success.asm

📁 本课题要求在研究PC机键盘通信协议的基础上
💻 ASM
📖 第 1 页 / 共 2 页
字号:
KBCLK      EQU   P3.0            ;定义键盘接口的KBCLK时钟线
KBDAT      EQU   P3.1            ;定义键盘接口的KBDATA数据线
WKLED      EQU   P3.3            ;定义工作指示灯LED的连接线
TEMPER_L   EQU   36H
TEMPER_H   EQU   35H
TEMPER_NUM EQU   60H
FLAG_DS    BIT   20H.7
DQ         BIT   P3.4

        ORG   0000H
        AJMP  START

        ORG   0003H
        AJMP  KEY_INT

        ORG   0040H
;主程序
START:  MOV   SP,#60H
        MOV   IE,#00H

        ;上电开始工作指示,LED连续闪动3次,随后常亮
        CLR   WKLED           ;点亮LED,并延时
        LCALL DELAY100
        SETB  WKLED           ;熄灭LED,并延时
        LCALL DELAY100
        CLR   WKLED           ;点亮LED,并延时
        LCALL DELAY100
        SETB  WKLED           ;熄灭LED,并延时
        LCALL DELAY100
        CLR   WKLED           ;点亮LED,并延时
        LCALL DELAY100
        SETB  WKLED           ;熄灭LED,并延时
        LCALL DELAY100
        CLR   WKLED           ;LED常亮

        ;其它初始化工作
        ACALL LCD_RST
        ACALL LCD_SET
        CLR   20H.0           ;清发送数据的奇偶标志位
        CLR   20H.1           ;清接收数据的奇偶标志位
        CLR   20H.2           ;清接收数据成功标志位
        MOV   21H,#00H        ;清接收数据的转存单元
        MOV   22H,#00H        ;清发送数据的转存单元
        MOV   R6,#00H         ;置数字键已按次数
        MOV   R0,#30H         ;置数字键存储缓冲区首址
        MOV   IE,#81H         ;开INT0中断,以响应按键
        MOV   P1,#0F0H        ;置键盘行线P1.0-P1.3为0,作好响应按键的准备
        SETB  KBCLK
        SETB  KBDAT
        LCALL DELAY100
        LCALL DELAY100
        LCALL DELAY100
        LCALL DELAY100
        MOV   A,#0AAH         ;向PC发送自检完毕码0AAH
        ACALL SEND_B
        MOV   A,#48H          ;'H'的ASCII码
        ACALL LCD_DSP
        MOV   A,#65H          ;'e'的ASCII码
        ACALL LCD_DSP
        MOV   A,#6CH          ;'l'的ASCII码
        ACALL LCD_DSP
        MOV   A,#6CH          ;'l'的ASCII码
        ACALL LCD_DSP
        MOV   A,#6FH          ;'o'的ASCII码
        ACALL LCD_DSP


        MOV   TEMPER_H,#00H
        MOV   TEMPER_L,#00H
        CLR   FLAG_DS
       



WAIT:  ;温度检测与显示
    	ACALL GET_TEMPER
        ACALL TEMPER_COV
        ACALL LCD_CLR
        ACALL LCD_SET_H
        MOV   A,TEMPER_H
        ACALL LCD_DSP

        ACALL LCD_SET_L
        MOV   A,TEMPER_L
        ACALL LCD_DSP

	;检查PC是否发来命令,并随时响应键盘中断
        MOV   C,KBDAT        ;检查KBDAT是否被拉为低电平
        JC    WAIT
        MOV   C,KBCLK
        JNC   WAIT
        ACALL RECEV_B
        JNB   20H.2,WAIT      ;接收失败转WAIT

        ;处理PC发来的字节命令,转存到21H单元中
        MOV   21H,A
        ;......
        ;ACALL LCD_DSP         ;临时调试用
        MOV   A,#0FFH         ;判断是否是复位命令FFH
        CLR   C
        SUBB  A,21H
        JZ    OD_FF
        MOV   A,#0FEH         ;判断是否是重发命令FEH
        CLR   C
        SUBB  A,21H
        JZ    OD_FE
        MOV   A,#0F5H         ;判断是否是禁止键盘命令F5H
        CLR   C
        SUBB  A,21H
        JZ    OD_F5
        MOV   A,#0F4H         ;判断是否是使能键盘命令F4H
        CLR   C
        SUBB  A,21H
        JZ    OD_F4
        MOV   A,#0F3H         ;判断是否是设置键盘重复速率命令F3H
        CLR   C
        SUBB  A,21H
        JZ    OD_F3
        MOV   A,#0F0H         ;判断是否是设置扫描码类型命令F0H
        CLR   C
        SUBB  A,21H
        JZ    OD_F0
        MOV   A,#0EEH         ;判断是否是回送响应命令EEH
        CLR   C
        SUBB  A,21H
        JZ    OD_EE
        MOV   A,#0EDH         ;判断是否是设置状态指示灯命令EDH
        CLR   C
        SUBB  A,21H
        JZ    OD_ED
        AJMP  OTHER           ;其它命令或命令参数
OD_FF:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        MOV   A,#0AAH         ;向PC发送自检完毕码AAH
        ACALL SEND_B
        AJMP  GOON
OD_FE:  MOV   A,22H           ;向PC重发上次发送的字节
        ACALL SEND_B
        AJMP  GOON
OD_F5:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        AJMP  GOON
OD_F4:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        ACALL LCD_CLR
        MOV   A,#4FH          ;'O'的ASCII码
        ACALL LCD_DSP
        MOV   A,#4BH          ;'K'的ASCII码
        ACALL LCD_DSP
        AJMP  GOON
OD_F3:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        AJMP  WAIT            ;等待接收下一字节内容
OD_F0:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        AJMP  WAIT            ;等待接收下一字节内容
OD_EE:  MOV   A,#0EEH         ;向PC发送回送响应码EEH
        ACALL SEND_B
        AJMP  GOON
OD_ED:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        AJMP  WAIT            ;等待接收下一字节内容
OTHER:  MOV   A,#0FAH         ;向PC发送应答码FAH
        ACALL SEND_B
        AJMP  GOON
GOON:   SETB  WKLED
        LCALL DELAY100
        CLR   WKLED            ;以上3条熄灭LED再点亮,提示已处理PC发来的命令
        ;SETB  KBCLK
        ;SETB  KBDAT
        ;LCALL SLEEP

        AJMP  WAIT

;-------主程序结束----------------------------------------------------------------

GET_TEMPER:
        SETB   DQ             ; 定时入口
BCD:    LCALL  INIT_1820
        JB     FLAG_DS,S22
        LJMP   BCD            ; 若DS18B20不存在则返回
S22:    LCALL  DELAY11
        MOV    A,#0CCH        ; 跳过ROM匹配------0CC
        LCALL  WRITE_1820
        MOV    A,#44H         ; 发出温度转换命令
        LCALL  WRITE_1820
        NOP
        LCALL  DELAY
        LCALL  DELAY
CBA:    LCALL  INIT_1820
        JB     FLAG_DS,ABC
        LJMP   CBA
ABC:    LCALL  DELAY11
        MOV    A,#0CCH        ; 跳过ROM匹配
        LCALL  WRITE_1820
        MOV    A,#0BEH        ; 发出读温度命令
        LCALL  WRITE_1820
        LCALL  READ_1820T     ;READ_1820
        RET

;读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
        MOV  R2,#8
RE1:    CLR  C
        SETB DQ
        NOP
        NOP
        CLR  DQ
        NOP
        NOP
        NOP
        SETB DQ
        MOV  R3,#7
        DJNZ R3,$
        MOV  C,DQ
        MOV  R3,#23
        DJNZ R3,$
        RRC  A
        DJNZ R2,RE1
        RET

;-------------------写DS18B20的程序
WRITE_1820:
        MOV R2,#8
        CLR C
WR1:    CLR DQ
        MOV R3,#6
        DJNZ R3,$
        RRC A
        MOV DQ,C
        MOV R3,#23
        DJNZ R3,$
        SETB DQ
        NOP
        DJNZ R2,WR1
        SETB DQ
        RET

;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_1820T:
        MOV R4,#2             ; 将温度高位和低位从DS18B20中读出
        MOV R1,#36H           ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:   MOV R2,#8
RE01:   CLR C
        SETB DQ
        NOP
        NOP
        CLR DQ
        NOP
        NOP
        NOP
        SETB DQ
        MOV R3,#7
        DJNZ R3,$
        MOV C,DQ
        MOV R3,#23
        DJNZ R3,$
        RRC A
        DJNZ R2,RE01
        MOV @R1,A
        DEC R1
        DJNZ R4,RE00
        RET

;将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
        MOV   A,#0F0H
        ANL   A,TEMPER_L       ;舍去温度低位中小数点后的四位温度数值
        SWAP  A
        MOV   TEMPER_L,A       ;将低位温度保存在TEMPER_L中

        MOV   A,TEMPER_H
        ANL   A,#07H
        SWAP  A

        ORL   A,TEMPER_L
        MOV   TEMPER_NUM,A     ;保存变换后的温度数据
        LCALL BIN_BCD          ;得到温度的BCD码

        MOV   A,#0F0H
        ANL   A,TEMPER_NUM
        SWAP  A
        MOV   TEMPER_H,A       ;将高位温度保存在TEMPER_H中
        MOV   A,TEMPER_H
        MOV   DPTR,#TAB_ASC1
        MOVC  A,@A+DPTR        ;取TEMPER_H的ASC值
        MOV   TEMPER_H,A

        MOV   A,#0FH
        ANL   A,TEMPER_NUM
        MOV   TEMPER_L,A         ;将低位温度保存在TEMPER_L中
        MOV   DPTR,#TAB_ASC1
        MOVC  A,@A+DPTR         ;取TEMPER_L的ASC值
        MOV   TEMPER_L,A

        RET
BIN_BCD:
MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H

;DS18B20初始化程序
INIT_1820:
        SETB DQ
        NOP
        CLR DQ
        MOV R0,#0FFH
TSR1:   DJNZ R0,TSR1          ; 延时
        SETB DQ
        MOV R0,#25H           ;96US-25H
TSR2:   DJNZ R0,TSR2
        JNB  DQ,TSR3
        LJMP TSR4             ; 延时
TSR3:   SETB FLAG_DS            ; 置标志位,表示DS1820存在
        LJMP TSR5
TSR4:   CLR FLAG_DS             ; 清标志位,表示DS1820不存在
        LJMP TSR7
TSR5:   MOV R0,#06BH          ;200US
TSR6:   DJNZ R0,TSR6          ; 延时
TSR7:   SETB DQ
        RET

;重新写DS18B20暂存存储器设定值
RE_CONFIG:
        JB FLAG_DS,RE_CONFIG1   ; 若DS18B20存在,转RE_CONFIG1
        RET
RE_CONFIG1:
        MOV A,#0CCH           ; 发SKIP ROM命令
        LCALL WRITE_1820
        MOV A,#4EH            ; 发写暂存存储器命令
        LCALL WRITE_1820
        MOV A,#00H            ; TH(报警上限)中写入00H
        LCALL WRITE_1820
        MOV A,#00H            ; TL(报警下限)中写入00H
        LCALL WRITE_1820
        MOV A,#7FH            ; 选择12位温度分辨率
        LCALL WRITE_1820
        RET

;延时子程序
DELAY:  MOV R7,#00H
MIN:    DJNZ R7,YS500
        RET
YS500:  LCALL YS500US
        LJMP MIN

YS500US:MOV R6,#00H
        DJNZ R6,$
        RET

DELAY11:MOV R7,#20H
        DJNZ R7,$
        RET

;中断服务子程序---响应键盘按键并扫描
KEY_INT:CLR   EX0             ;临时关INT0中断,防止混乱,因为进入键盘扫描的过程中,还会引起INT0的变化
        LCALL DELAY20         ;延时20ms,等待按合抖动过去
        MOV   R2,#04H         ;R2作计数器,存扫描行数
        MOV   R4,#7FH         ;R4作指针,指示待扫描行
        MOV   R7,#0           ;R7用以决定键号,初设为0号
SCAN:   MOV   A,R4
        RL    A
        MOV   R4,A            ;以上3条调整待扫描行
        MOV   P1,A            ;逐行扫描,被扫描行送0
        MOV   A,P1            ;读回各列线电平
        MOV   R3,#04H         ;R3作计数器,存被扫描行的待查列数
        ANL   A,#0F0H         ;高4位为有效的列线电平
        SWAP  A               ;移到低4位

⌨️ 快捷键说明

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