📄 24c02程序.asm
字号:
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV 40H,#70H ;键列扫描码,分别从第一列到第四列
MOV 41H,#0B0H
MOV 42H,#0D0H
MOV 43H,#0E0H
MOV 44H,#71H ;0的键值码
MOV 45H,#0B1H
MOV 46H,#0D1H
MOV 47H,#0E1H
MOV 48H,#72H
MOV 49H,#0B2H
MOV 4AH,#0D2H
MOV 4BH,#0E2H
MOV 4CH,#74H
MOV 4DH,#0B4H
MOV 4EH,#0D4H
MOV 4FH,#0E4H
MOV 50H,#78H
MOV 51H,#0B8H
MOV 52H,#0D8H
MOV 53H,#0E8H
MOV 60H,#00H ;存入键码
MOV R0,#61H
LOK0: MOV A,#0 ;显示缓冲区清0
MOV @R0,A
INC R0
CJNE R0,#65H,LOK0
MOV DPTR,#7F00H
MOV A,#43H ;定义PA,PB口为输出,PC口为输入
MOVX @DPTR,A
LOK1: LCALL DISP
LCALL SAO_MIAO ;调用键盘扫描程序
CJNE A,#0EH,LOOP0
LCALL T24C02_EEPW
AJMP LOK1
LOOP0: CJNE A,#0FH,LOK1
LCALL T24C02_EEPR
AJMP LOK1
DISP:
MOV R0,#64H ;显示数码存放在74H~77H(BCD形式)
MOV R4,#7FH ;把显示位码取到R4
LOK2:
MOV A,@R0
MOV R2,A ;把显示数码取到R2
ACALL DISP_A_BIT
ACALL DELAY
MOV A,R4
RR A ;下一位码
MOV R4,A
DEC R0 ;下一显示数码
CJNE R0,#60H,LOK2
RET
DISP_A_BIT:
MOV DPTR,#TABLE
MOV A,R2
MOVC A,@A+DPTR ;取段码:TABLE+x
MOV DPTR,#7F01H ;从PA口输出码值
MOVX @DPTR,A
MOV DPTR,#7F02H ;从PB口输出位码
MOV A,R4
MOVX @DPTR,A
RET
DELAY: MOV R6,#2
LOK3: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,LOK3
RET ;延迟(2us*255+2us)*2=1Ms
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,8CH
SAO_MIAO:
ACALL UP_DOWN
JNZ LOK4
TIP1: ACALL DISP
AJMP SAO_MIAO
LOK4: ACALL DISP
ACALL DISP
ACALL UP_DOWN
JNZ LOK5
AJMP TIP1
LOK5: MOV R0,#40H ;设R0为键扫描码入口地址
LOK6: MOV DPTR,#7F02H ;从PB口输出扫描码
MOV A,@R0
MOVX @DPTR,A
MOV DPTR,#7F03H ;从PC口输入行的状态
MOVX A,@DPTR
CPL A
ANL A,#0FH
JZ RIGHT_MOVE
ADD A,@R0
MOV 60H,A
MOV R3,#00H ;键值置初值
MOV R1,#44H ;键码首地址送R1,查键值
CMP: CLR C
MOV A,60H
SUBB A,@R1
JNZ LOK7
LOK8: LCALL DISP
LCALL UP_DOWN
JNZ LOK8
MOV A,R3
MOV 64H,63H
MOV 63H,62H
MOV 62H,61H
MOV 61H,A
RET
LOK7: INC R3
INC R1
AJMP CMP
RIGHT_MOVE:
INC R0 ;修改列扫描码
CJNE R0,#44H,LOK6
AJMP SAO_MIAO
UP_DOWN:
MOV DPTR,#7F02H
MOV A,#00H ;从PB口输出00H
MOVX @DPTR,A
MOV DPTR,#7F03H ;从PC口输入
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
T24C02_EEPW:
MOV R0,#20H ;从24C02的20H单元开始写入数据
MOV R1,#61H ;内存单元首地址放入R1中
LOK9: SETB P1.1
NOP
NOP
NOP
SETB P1.0
NOP
NOP
NOP
SETB P1.1 ;P1.1=1,P1.0=0时,开启24C02
NOP
CLR P1.0
TIP2: MOV A,#0A0H ;对24C02写操作
ACALL EEPW
JB ACC.0,TIP2
NOP
NOP
NOP
TIP3: MOV A,R0
ACALL EEPW
JB ACC.0,TIP3
NOP
NOP
NOP
TIP4: MOV A,@R1
ACALL EEPW
JB ACC.0,TIP4
CLR P1.1
CLR P1.0
SETB P1.1
SETB P1.0
ACALL DEL10MS
RET
DEL10MS:
MOV 6EH,#10
LOK10: LCALL DISP
DJNZ 6EH,LOK10
RET
EEPW:
CLR P1.1
MOV 7BH,#08H
LOK11: MOV 7CH,#04H
RLC A
MOV P1.0,C
SETB P1.1
DJNZ 7CH,$
CLR P1.1
DJNZ 7BH,LOK11
SETB P1.0
SETB P1.1
MOV C,P1.0
NOP
CLR P1.1
RLC A
RET
T24C02_EEPR:
MOV R0,#20H
MOV R1,#61H
MOV 7EH,#4
LOK12: CLR P1.1
SETB P1.0
NOP
NOP
SETB P1.1
CLR P1.0
TIP5: MOV A,#0A0H
ACALL EEPW
JB ACC.0,TIP5
TIP6: MOV A,R0
ACALL EEPW
JB ACC.0,TIP6
CLR P1.1
SETB P1.0
NOP
NOP
SETB P1.1
CLR P1.0
TIP7: MOV A,#0A1H
ACALL EEPW
JB ACC.0,TIP7
MOV 7DH,#08H
LOK13:
SETB P1.0
SETB P1.1
MOV C,P1.0
CLR P1.1
RLC A
DJNZ 7DH,LOK13
MOV @R1,A
CLR P1.0
NOP
SETB P1.1
SETB P1.0
INC R1
INC R0
DJNZ 7EH,LOK12
MOV R5,#4
MOV R0,#61H
LOOP: MOV A,@R0
DEC A
MOV @R0,A
INC R0
DJNZ R5,LOOP
RET
SETB P1.0
SETB P1.1
MOV R0,#21H ;从24C02的20H单元开始写入数据
MOV R1,#62H ;内存单元首地址放入R1中
LOK91: SETB P1.1 ;P1.1=1,P1.0=0时,开启24C02
CLR P1.0
TIP21: MOV A,#0A0H ;对24C02写操作
ACALL EEPW
JB ACC.0,TIP21
TIP31: MOV A,R0
ACALL EEPW
JB ACC.0,TIP31
TIP41: MOV A,@R1
ACALL EEPW
JB ACC.0,TIP41
CLR P1.0
NOP
NOP
SETB P1.1
NOP
NOP
SETB P1.0
ACALL DEL10MS
SETB P1.0
SETB P1.1
MOV R0,#22H ;从24C02的20H单元开始写入数据
MOV R1,#63H ;内存单元首地址放入R1中
LOK92: SETB P1.1 ;P1.1=1,P1.0=0时,开启24C02
CLR P1.0
TIP22: MOV A,#0A0H ;对24C02写操作
ACALL EEPW
JB ACC.0,TIP22
TIP32: MOV A,R0
ACALL EEPW
JB ACC.0,TIP32
TIP42: MOV A,@R1
ACALL EEPW
JB ACC.0,TIP42
CLR P1.0
NOP
NOP
SETB P1.1
NOP
NOP
SETB P1.0
ACALL DEL10MS
SETB P1.0
SETB P1.1
MOV R0,#23H ;从24C02的20H单元开始写入数据
MOV R1,#64H ;内存单元首地址放入R1中
LOK93: SETB P1.1 ;P1.1=1,P1.0=0时,开启24C02
CLR P1.0
TIP23: MOV A,#0A0H ;对24C02写操作
ACALL EEPW
JB ACC.0,TIP23
TIP33: MOV A,R0
ACALL EEPW
JB ACC.0,TIP33
TIP43: MOV A,@R1
ACALL EEPW
JB ACC.0,TIP43
CLR P1.0
NOP
NOP
SETB P1.1
NOP
NOP
SETB P1.0
ACALL DEL10MS
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -