(3)DIG为允许数字键输入标志,00H表示不允许,01H表示允许。此标志主要是防止输入多余的密码,或输入的款数超出限额。
(4) NUM表示输入第几个数字,00H表示无数字输入,01H~08H表示输入密码,09H~10H表示输入款数或新密码,若NUM为11H,显示出错信息。
3.3 X76F100读程序举例

图4 循环键盘显示程序流程图
X76F100为I2C总线E2PROM。SCL为时钟输入,SDA为双向数据输入输出线。通过片输入来控制对器件的访问。下面以页写为例,先结合时序说明X76F100的工作过程,然后给出程序。页写时序如图5所示。在该系统中,GMS97C52为主机,X76F100为从机。首先主机向从机发一个START命令,产生开始条件,然后发写命令字。当从机接到命令后,向主机发一个应答信号NACK。然后跟随8字节密码,随后进入一个写周期,写周期结束后进行密码应答轮询ACK Polling。X76F100要求主机用专用的应答命令55H进行应答轮询。如果输入的密码正确,将返回一个“ACK”。如果密码不正确,将返回“no-ACK”,重试计数器加1,返回到启始位置,提示重新
送入写命令字和8字节密码。若密码正确,主机接着送入8个字节的数据,ACK响应成功后,主机发出STOP命令完成写操作。下面是用写密码进行页写的程序。

图5 页写时序图(需要密码)
WRITE_USING_WRITE_PASS: ;用写密码进行写操作
ACALL START
;调开始命令
MOV A,#SECTOR_WR
;调页写命令
ACALL OUTBYTE
;调输出字节命令
ACALL NACK
;X76F100发应答信号
ACALL WR_WR_PASS
;调写密码命令
ACALL T10ms
;10ms延时开始写密码周期
ACALL ACK_POLLING
;调密码应答轮询子程序
ACALL WR_DATA
;调页写数据子程序
ACALL STOP
;调停止命令
ACALL T10ms
;延时10ms写密码周期
RET
WR_WR_PASS: ;将写密码写入X76F100
MOV R0,#WR_PASS7
;将密码首址送入R0
MOV R1,#08H
;写密码为8个字节
WP:MOV A,@R0 ;将R0中的数据送入A中
ACALL OUTBYTE
;输出字节子程序
ACALL NACK
INC R0
DJNZ R1,WP
RET
WR_DATA: ;将数据写到X76F100中
MOV R0,#DATA0
;将数据首地址送入R0
MOV R1,#08H
;一页有8个数据
WB: MOV A,@R0 ;将R0中数据送入A
ACALL OUTBYTE
;调输出字节子程序
ACALL NACK
;从机发应答信号
INC R0
;下一个字节
DJNZ R1,WB
;循环直到R1为0
RET
OUTBYTE: ;主机向X76F100发字节
MOV R2,#08H
;一个字节有8位
LOOPO:
CLR SCL_76
RLC A
;移位
MOV SDA_76,C
;将进位送入数据线
SETB CL_76
DJNZ R2,LOOP
;循环直到R2为0
RET
START:
SETB SDA_76
;开始子程序
SETB SCL_76
CLR SDA_76
CLR SCL_76
RET
STOP:
CLR SDA_76
;停止子程序
SETB SCL_76
SETB SDA_76
RET
ACK_POLLING: ;密码应答轮询子程序
ACALL START
MOV A,#55H
;主机发固定应答命令
ACALL OUTBYTE
ACALL NACK
;调从机发应答信号
JC PASS_ERROR
;若有进位则密码错误
RET
PASS_ERROR: ;密码错误
ACALL STOP
RET
ACK:
CLR SDA_76
;主机执行一个应答
ACALL CLOCK
RET
NACK:
SETB SDA_76
;从机执行一个应答
ACALL CLOCK
RET
CLOCK:
SETB SCL_76
;第9个脉冲
MOV C,SDA-76
;读SDA状态以判断是否有应答
CLR SCL_76