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

📄 实验1-缺联机.asm

📁 红外抄表器.rar
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        CNW_6:  INC     CODE		;间址寄存器加1
                INC     O_XL		;列地址寄存器加1
                MOV     A,O_XL	        ;判列地址是否超出区域范围
                CJNE    A,#PARA1,CNW_7
        CNW_7:  JC      CNW_8           ;未超出则继续
                MOV     A,O_YL          ;超出则判是否在区域E2
                JB      ACC.3,CNW_8     ;在区域E2则退出
                SETB    ACC.3           ;在区域E1则修改成区域E2
                MOV     O_YL,A
                MOV     COM,#00H	;设置区域E2列地址为"0"
                LCALL   PR4
        CNW_8:  DJNZ    COUNT1,CNW_4	;当页循环
                MOV     A,O_YL          ;读页地址寄存器
                JB      ACC.7,CNW_9     ;判完成标志D7位, "1"则完成退出
                INC     A		;否则页地址加1
                SETB    ACC.7		;置完成位为"1"
                CLR     ACC.3
                MOV     O_YL,A
                MOV     CODE,#08H	;间址寄存器设置为16
                LJMP    CNW_1		;大循环
        CNW_9:  RET

;==============================================================
;数字和符号字库
CNTAB:
;--  文字:  0  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H
        DB 000H,00FH,010H,020H,020H,010H,00FH,000H

;--  文字:  1  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,010H,010H,0F8H,000H,000H,000H,000H
        DB 000H,020H,020H,03FH,020H,020H,000H,000H

;--  文字:  2  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,070H,008H,008H,008H,088H,070H,000H
        DB 000H,030H,028H,024H,022H,021H,030H,000H

;--  文字:  3  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,030H,008H,088H,088H,048H,030H,000H
        DB 000H,018H,020H,020H,020H,011H,00EH,000H

;--  文字:  4  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,000H,0C0H,020H,010H,0F8H,000H,000H
        DB 000H,007H,004H,024H,024H,03FH,024H,000H

;--  文字:  5  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,0F8H,008H,088H,088H,008H,008H,000H
        DB 000H,019H,021H,020H,020H,011H,00EH,000H

;--  文字:  6  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,0E0H,010H,088H,088H,018H,000H,000H
        DB 000H,00FH,011H,020H,020H,011H,00EH,000H

;--  文字:  7  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,038H,008H,008H,0C8H,038H,008H,000H
        DB 000H,000H,000H,03FH,000H,000H,000H,000H

;--  文字:  8  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,070H,088H,008H,008H,088H,070H,000H
        DB 000H,01CH,022H,021H,021H,022H,01CH,000H

;--  文字:  9  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H
        DB 000H,000H,031H,022H,022H,011H,00FH,000H

;--  文字:  .  --
;--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --
        DB 000H,000H,000H,000H,000H,000H,000H,000H
        DB 000H,030H,030H,000H,000H,000H,000H,000H

;==============================================================






;######键盘扫描子程序 SCANKEY ###########
;需要寄存器:R2,R3,R4,R5,R6
;R2-计数,R4-行号,R3-列号,R5-扫描码,R6-计数
;入口:无
;出口:KEYNUM,无键值KEYNUM中为'0FFH',有键值KEYNUM中为键值
;键值计算:(4-列号)*3+行号
;需调用函数:10MS延时函数 DLY10MS
;######################################
SCANKEY:LCALL KEXAM              ;判断是否有键按下,A中为零则无键按下,非零则有键按下
        JNZ SCANK0              ;有键则转
        MOV KEYNUM,#0FFH        ;无键按下  KEYNUM  EQU 11H           ;键号
        LJMP ESCANK             ;转返回
SCANK0: LCALL DLY10MS           ;有键按下,延时去抖
        LCALL KEXAM            ;再次判断是否有键按下,有键按下时A中为非零值
        JNZ SCANK1             ;有键按下则转
        MOV KEYNUM,#0FFH        ;无键按下
        LJMP ESCANK
SCANK1: MOV R4,#00H             ;行号
        MOV R6,#03H             ;扫描行数
        MOV R5,#0EFH            ;第一行扫描码
SCAN10: MOV A,R5                ;输出扫描码
        MOV P1,A
        MOV A,P1
        CPL A                   ;
        ANL A,#0FH
        JNZ CHK1                ;本行有键按下
        LJMP CHK2               ;本行无键按下
CHK1:   MOV R2,#4               ;扫描列数
CHK10:  JB ACC.0,CALK1           ;该列有键按下则转
        RR A
        DJNZ R2,CHK10           ;检测按键所在列
CHK2:   MOV A,R5
        RL A
        MOV R5,A                ;修正扫描码
        INC R4                  ;行号加1
        DJNZ R6,SCAN10           ;扫描下一行
        MOV KEYNUM,#0FFH         ;未检测到按键
        LJMP ESCANK              ;返回
CALK1:  CLR C                    ;计算键值
        MOV A,#4
        SUBB A,R2               ;计算列号
        MOV B,#03H
        MUL AB
        ADD A,R4                ;计算键值
        MOV KEYNUM,A             ;存键值
KEYNO:   LCALL DLY10MS            ;
        LCALL KEXAM              ;发全扫描信号
        JNZ KEYNO             ;健未释放则等待
		 LCALL DLY10MS           ;延时消抖
ESCANK: RET

;=========================================================
;功能:判断是否有键被按下
;入口参数:无
;出口参数:A中为零则无键按下,非零则有键按下
;=========================================================
KEXAM:  MOV P1,#8FH
        MOV A,P1
        CPL A
        ANL A,#0FH
        RET



;##############个位键处理子程序-KEYGW ############
;入口参数:无
;出口参数:无
;需调用函数:显示机号子程序-DISJIHAO
;说明:会修改JIHAOL的低四位,使之从零到九循环增加
;################################################

KEYGW:MOV A,JIHAOL
	  ANL A,#0FH			;保留低四位
	  INC A
	  CJNE A,#0AH,GW00		;
GW00: JNC GW01 			;A>09H则转
	  INC JIHAOL			;A<=09H时 个位加一
	  LJMP GW02
GW01: ANL JIHAOL,#0F0H		;A>09H时,个位清零
GW02: SETB DISMOD       	;反白显示机号
	  LCALL DISJIHAO
	  LCALL DLY10MS
	  RET


;##############个位键处理子程序-KEYSW ############
;入口参数:无
;出口参数:无
;需调用函数:显示机号子程序-DISJIHAO
;说明:会修改JIHAOL的高四位,使之从零到九循环增加
;     EDSCAN定义在个位键处理子程序内
;################################################

KEYSW:MOV A,JIHAOL
	  ANL A,#0F0H			;保留高四位
	  SWAP A
	  INC A
	  CJNE A,#0AH,SW00		;
SW00: JNC SW01 			;A>09H则转
          MOV A,JIHAOL
	  ADD A,#10H		;A<=09H时 十位加一
          MOV JIHAOL,A
	  LJMP SW02
SW01: ANL JIHAOL,#0FH		;A>09H时 十位清零
SW02: SETB DISMOD       	;反白显示机号
	  LCALL DISJIHAO
	  LCALL DLY10MS
	  RET


;##############百位键处理子程序-KEYBW ############
;入口参数:无
;出口参数:无
;需调用函数:显示机号子程序-DISJIHAO
;说明:会修改JIHAOH的低四位,使之从零到九循环增加
;     EDSCAN定义在个位键处理子程序内
;################################################

KEYBW:MOV A,JIHAOH
	  ANL A,#0FH			;保留低四位
	  INC A
	  CJNE A,#0AH,BW00		;
BW00: JNC BW01 			;A>09H则转
	  INC JIHAOH			;A<=09H时 个位加一
	  LJMP BW02
BW01: ANL JIHAOH,#0F0H		;A>09H时,个位清零
BW02: SETB DISMOD       	;反白显示机号
	  LCALL DISJIHAO
	  LCALL DLY10MS
	  RET



EDSCAN: LCALL DL100MS
        LCALL DL100MS
        LCALL DL100MS
        LJMP SCAN


;###########2字节BCD转换子程序###############
;入口参数:
;    1.BCD高位-R5
;    2.BCD低位-R4
;出口参数:
;    1.16进制高位-R5
;    2.16进制低位-R4
;需调用子程序:无
;##############################################
BCD4B:  MOV A,R5
        MOV R2,A
        ACALL BCD2B
        MOV B,#64H
        MUL AB
        MOV R6,A
        XCH A,B
        MOV R5,A
        MOV A,R4
        MOV R2,A
        ACALL BCD2B
        ADD A,R6
        MOV R4,A
        MOV A,R5
        ADDC A,#00H
        MOV R5,A
        RET
;=============1字节BCD转换子程序================
BCD2B:  MOV A,R2
        ANL A,#0F0H
        SWAP A
        MOV B,#0AH
        MUL AB
        MOV R3,A
        MOV A,R2
        ANL A,#0FH
        ADD A,R2
        MOV R2,A
        RET

;###############双字节循环左移一位#################
;入口R5高位,R4低位;;;;;;;
;出口R5高位,R4低位;;;;;;
;####################################################
BINRL:  CLR C
        MOV A,R4
        RLC A
        MOV R4,A
        MOV A,R5
        RLC A
        MOV R3,A
        RET

;~~~~~~~~~~~~~~波浪线内为AT24C64驱动程序~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ;SCL最高工作频率100K
;############ 启动 AT24C64 #################
;入口参数:无
;出口参数:无
;需调用子程序:喂狗子程序-WDOG
;##########################################

AT1:    LCALL WDOG             ;喂狗,延时
	    CLR SCL
        LCALL WDOG              ;喂狗,延时
        SETB SDA
        LCALL WDOG              ;喂狗,延时
        SETB SCL
        LCALL WDOG              ;喂狗,延时
        CLR SDA
        LCALL WDOG              ;喂狗,延时
        CLR SCL
        LCALL WDOG              ;喂狗,延时
        RET

;############ 关闭 AT24C64 #################
;入口参数:无
;出口参数:无
;需调用子程序:喂狗子程序-WDOG
;##########################################
ATW3:	LCALL WDOG              ;喂狗,延时
        CLR SCL
        LCALL WDOG              ;喂狗,延时
	CLR SDA
        LCALL WDOG              ;喂狗,延时
	SETB SCL
        LCALL WDOG              ;喂狗,延时
	SETB SDA
        LCALL WDOG              ;喂狗,延时
	RET

;/** 单字节读 **/
ATR2:	CLR A
	CLR C
        LCALL WDOG              ;喂狗,延时
	CLR SCL
        LCALL WDOG              ;喂狗,延时
        MOV R2,#8
J5:	SETB SCL
        LCALL WDOG              ;喂狗,延时
	MOV C,SDA
	RLC A
        LCALL WDOG              ;喂狗,延时
	CLR SCL
        LCALL WDOG              ;喂狗,延时
	DJNZ R2,J5
	CLR SDA
        LCALL WDOG              ;喂狗,延时
	SETB SCL
        LCALL WDOG              ;喂狗,延时
	CLR SCL
        LCALL WDOG              ;喂狗,延时
        SETB SDA
        RET

;################序列读最后一字节###############
;读最后一字节时需要发送停止信号
ATR3:	CLR A
	CLR C
        LCALL WDOG              ;喂狗,延时
	CLR SCL
        LCALL WDOG              ;喂狗,延时
        MOV R2,#8
J50:	SETB SCL
        LCALL WDOG              ;喂狗,延时
	MOV C,SDA
	RLC A
        LCALL WDOG              ;喂狗,延时
	CLR SCL
        LCALL WDOG              ;喂狗,延时
	DJNZ R2,J50
	SETB SDA
        LCALL WDOG              ;喂狗,延时
	SETB SCL                ;停止信号
        LCALL WDOG              ;喂狗,延时
        RET

;##############写数据到at24c64-ATW2##############
;说明:写一字节数据到at24c64,失败PSW.5置1
;入口参数:A
;出口参数:无
;需调用子程序:喂狗-WDOG
;###############################################
ATW2:	MOV R2,#8
        clr SCL
J4:	RLC A
        LCALL WDOG              ;喂狗,延时
	MOV SDA,C
        LCALL WDOG              ;喂狗,延时
	SETB SCL
        LCALL WDOG              ;喂狗,延时
	CLR SCL
	DJNZ R2,J4
        setb SDA
        LCALL WDOG              ;喂狗,延时
	SETB SCL
        LCALL WDOG              ;喂狗,延时
	JB SDA,J1
	CLR SCL
        LCALL WDOG              ;喂狗,延时
	CLR PSW.5
	Ljmp edw
J1:	SETB PSW.5
edw:	RET
;~~~~~~~~~~~~~~~~~~~AT24C64驱动程序结束~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



;##########延时1MS子程序 DLY1MS ##########
;使用寄存器R5,R6
;入口参数:无
;出口参数:无
;需调用函数:喂狗函数 WDOG
;##################################
DLY1MS: MOV R5,#2
DLY50:  MOV R6,#250
        DJNZ R6,$
        DJNZ R5,DLY50
        LC

⌨️ 快捷键说明

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