📄 实验1-缺联机.asm
字号:
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 + -