ETC ZLG7290

广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
ZLG7290 I2C 接口键盘及 LED 驱动器
一 特点
1
I2C 串行接口 提供键盘中断信号
2
可驱动 8 位共阴数码管或 64 只独立 LED 和 64 个按键
3
可控扫描位数
4
提供数据译码和循环
方便与处理器接口
可控任一数码管闪烁
移位
5
8 个功能键
6
无需外接元件即直接驱 LED
7
提供工业级器件
段寻址等控制
可检测任一键的连击次数
可扩展驱动电流和驱动电压
多种封装形式 PDIP24
SO24
二 引脚及说明
采用 24 引脚封装
13
12
21
22
3
4
5
6
20
19
14
11
引脚图如图 1 所示
Dig7
Dig6
Dig5
Dig4
Dig3
Dig2
Dig1
Dig0
SegA
SegB
SegC
SegD
SegE
SegF
SegG
SegH
SDA
SCL
/INT
GND
VCC
OSC2
OSC1
/RES
其引脚功能分述如下
23
24
1
2
7
8
9
10
16
18
17
15
ZLG7290
图 1 引脚图
三 功能描述
1 键盘部分
ZLG7290 可采样 64 个按键或传感器
1
可检测每个按键的连击次数
其基本功能如下
键盘去抖动处理
当键被按下和放开时
可能会出现电平状态反复变化
称作键盘抖动
若不作处理会引起按键盘命令
错误 所以要进行去抖动处理 以读取稳定的键盘状态为准
2
双键互锁处理
当有两个以上按键被同时按下时 ZLG7290 只采样优先级高的按键 优先顺序为 S1>S2>…>S64
如同时按下 S2 和 S18 时采样到 S2
3
连击键处理
当某个按键按下时 输出一次键值后
如果该按键还未释放
该键值连续有效
就像连续压按该键
一样 这种功能称为连击 连击次数计数器 RepeatCnt 可区别出单击 某些功能不允许连击 如开
关 或连击 判断连击次数可以检测被按时间 以防止某些功能误操作 如连续按 5 秒经入参数设置状态
4
功能键处理
功能键能实现 2 个以上按键同时按下来扩展按键数目或实现特殊功能 如 PC 机上的 Shift
Alt
键
典型应用图中的 S57~S64 为功能键
-1-
Ctrl
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
功能框图
键盘
SegH
Key(KeyUp)
01H
RepeatCnt
02H
FunctionKey
03H
FastPressCnt
04H
8
8
SCL
SDA
通信接口
/INT
IIC地址
... ...
键盘
扫描
SegA
GND
00H
系统状态
SystemReg
LED
驱动
Dig7
VCC
电源
命令接口
... ...
FlashOnOff
显示
CmdBuf0~2
0CH
ScanNum
Dig0
0DH
07H~08H
DpRam0~7
命令解释:
译 码,移位...
10H~17H
图 2 系统功能框图即寄存器映象图
2
显示部分
在每个显示刷新周期
存 DpRam0
ZLG7290 按照扫描位数寄存器
ScanNum 指定的显示位数 N
DpRamN 的内容按先后循序送入 LED 驱动器实现动态显示
描时间的占空比
以提高 LED 亮度
显示缓存中的内容不受影响
把显示缓
减少 N 值可提高每位显示扫
修改闪烁控制寄存器
FlashOnOff
可改变闪烁频率和占空比 亮和灭的时间
ZLG7290 提供两种控制方式
映象控制是指直接访问底层寄存器
寄存器映象控制和命令解释控制
实现基本控制功能
如实现寄存器的位操作
寄存器
这些寄存器须字节操作
命令解释控制是指通过解释命令缓冲区 CmdBuf0
现扩展控制功能
如上述对显示部分的控制
CmdBuf1 中的指令 间接访问底层寄存器实
对显示缓存循环
移位
对操作数译码等操作
请参考指令详
解部分
四 寄存器详解
系统状态部分
1. 系统寄存器
状态
•
SystemReg
地址 00H 复位值 11110000B 系统寄存器保存 ZLG7290 系统
并可对系统运行状态进行配置 其功能分位描述如下
SystemReg.0
KeyAvi
状态变化
阻态
/INT 引脚信号有效
置 1 时表示有效的按键动作 普通键的单击
清 0 表示无按键动作
变为低电平
有效的按键动作消失后或读 Key 后
连击
/INT 引脚信号无效
和功能键
变为高
KeyAvi 位自动清 0
键盘部分
2. 键值寄存器 Key
地址 01H 复位值 00H Key 表示被压按键的键值 当 Key=0 时 表示没
有键被压按
3. 连击次数计数器
RepeatCnt
地址 02H
复位值 00H
RepeatCnt=0 时
表示单击键
RepeatCnt 大于 0 时 表示键的连击次数 用于区别出单击键或连击键 判断连击次数可以检测被按时间
-2-
广州周立功单片机发展有限公司
4. 功能键寄存器
对应功能键被压按
Tel: (020) 38730916
FunctionKey
38730917
38730976
FunctionKey.0 对应 S64
Fax: 38730925
FunctionKey 对应位的值=0 表示
地址 03H 复位值 0FFH
FunctionKey.7
38730977
S57
命令接口部分
5. 命令缓冲区 CmdBuf0
CmdBuf1
地址 07H 08H 复位值 00H 00H 用于传输指令
显示部分
6. 闪烁控制寄存器
FlashOnOff
地址 0CH 复位值 0111B/0111B 高 4 位表示闪烁时亮的时
间 低 4 位表示闪烁时灭的时间 改变其值同时也改变了闪烁频率 也能改变亮和灭的占空比 FlashOnOff
的 1 个单位相当于 150
250ms 亮和灭的时间范围为
1
16
0000B 相当 1 个时间单位
所有象
素的闪烁频率和占空比相同
7. 扫描位数寄存器
为 0
度
地址 0DH 复位值 7
ScanNum
7 对应的显示位数为 1
用于控制最大的扫描显示位数
有效范围
减少扫描位数可提高每位显示扫描时间的占空比 以提高 LED 亮
8
不扫描显示的显示缓存寄存器则保持不变
如 ScanNum 3 时
只显示 DpRam0 DpRam3 的内
容
8. 显示缓存寄存器
1 表示该像素亮
DpRam0
DpRam7
DpRam7
地址 10H 17H 复位值 00H 00H 缓存中一位置
DpRam0 的显示内容对应 Dig7
Dig0 引脚
五 通信接口
ZLG7290 的 I2C 接口传输速率可达 32kbit/s 容易与处理器接口 并提供键盘中断信号 提高主处
理器时间效率
slave address 为 70H(01110000B)
ZLG7290 的从地址
有效的按键动作
普通键的单击
连击和功能键状态变化
KeyAvi 位置 1 /INT 引脚信号有效 变为低电平
都会令系统寄存器
SystemReg
的
用户的键盘处理程序可由/INT 引脚低电平中断触发
以提高程序效率 也可以不采样/INT 引脚信号节省系统的 I/O 数 而轮询系统寄存器的 KeyAvi 位 要注
意读键值寄存器会令 KeyAvi 位清 0 并会令/INT 引脚信号无效 为确保某个有效的按键动作所有参数寄
存器的同步性 建议利用 I2C 通信的自动增址功能连续读 RepeatCnt FunctionKey 和 Key 寄存器 但
用户无需太担心寄存器的同步性问题
应为键参数寄存器变化速度较缓慢
典型 250ms 最快 9ms
ZLG7290 内可通过 I2C 总线访问的寄存器地址范围为 00H 17H 任一寄存器都可按字节直接读
写
也可以通过命令接口间接读写或按位读写
请参考指令详解部分
支持自动增址功能
访问一寄存器
后 寄存器子地址 sub address 自动加一 和地址翻转功能 访问最后一寄存器 子地址 17H 后
寄存器子地址翻转为 00H
ZLG7290 的控制和状态查询全部都是通过读/写寄存器实现的
用户只需象
2
即可实现对 ZLG7290 的控制 关于 I C 总线访问的细节请参考 I2C 总线规
读写 24C02 内的单元一样
范
六 指令详解
ZLG7290 提供两种控制方式 寄存器映象控制和命令解释控制
寄存器 除通信缓冲区外的寄存器
解释命令缓冲区 CmdBuf0
存器的位操作
CmdBuf1 中的指令 间接访问底层寄存器实现扩展控制功能 如实现寄
对显示缓存循环
移位
对操作数译码等操作
一个有效的指令由一字节操作码和数个操作数组成
称为复合指令
CmdBuf0
2
一个完整的指令须在一个 I C 帧中
CmdBuf1
中
寄存器映象控制是指直接访问底层
实现基本控制功能 请参考寄存器详解部分 命令解释控制是指通过
否则会引起错误
-3-
只有操作码的指令称为纯指令
起始信号和结束信号间
带操作数的指令
连续传输到命令缓冲区
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
1. 纯指令
(1) 左移指令
命令缓冲区
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
CmdBuf0:
0
0
0
1
N3
N2
N1
N0
该指令使与 ScanNum 相对应的显示数据和显示属性 闪烁 自右向左移动 N 位 N3~N0
移动后
例
右边 N 位无显示
+1
与 ScanNum 不相关的显示数据和显示属性则不受影响
DpRamB DpRam0= 87654321
执行指令 00010001B 后
4
其中
闪烁
DpRamB DpRam0=
ScanNum 5
4321
4
87
闪烁
不显示
高两位和低两位无显
示
(2) 右移指令
通信缓冲区
Bit7 Bit6 Bit5 Bit4 Bit3
ComBuf0:
0
0
1
0
N3
与左移指令类似 只是移动方向为自左向右 移动后 左边 N 位
例
DpRamB DpRam0= 87654321
其中
3
闪烁
执行指令 00100001B 后 DpRamB DpRam0=
Bit2 Bit1 Bit0
N2
N1
N0
N3~N0 +1 无显示
ScanNum 5
6543
3
闪烁
87
不显示
高四位无显示
(3) 循环左移指令
通信缓冲区
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
ComBuf0:
0
0
1
1
N3
N2
N1
N0
与左移指令类似 不同的是在每移动一位后 原最左位的显示数据和属性转移到最右位
例
DpRamB DpRam0= 87654321
其中
4
执行指令 00110001B 后 DpRamB DpRam0=
闪烁
ScanNum 5
432165
4
87
闪烁
不显示
高两位无显示
(4) 循环右移指令
通信缓冲区
Bit7 Bit6
ComBuf0:
0
1
与循环左移指令类似 只是移动方向相反
例
Bit5
0
DpRamB DpRam0= 87654321
其中
执行指令 01000001B 后 DpRamB DpRam0=
Bit4
0
3
Bit3
N3
闪烁
Bit2
N2
Bit1
N1
ScanNum 5
216543
3
Bit0
N0
87
不显示
闪烁
(5) SystemReg 寄存器位寻址指令
通信缓冲区
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2
ComBuf0:
0
1
0
1
On
S2
当 On 1 时 第 S S2~S0 位置 1 当 On 0 时 第 S 位清 0
Bit1
S1
Bit0
S0
2. 复合指令
(1) 显示像素寻址指令
通信缓冲区
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
ComBuf0:
0
0
0
0
0
0
0
1
ComBuf1:
On
0
S5
S4
S3
S2
S1
S0
当 On 1 时 第 S S5~S0 点像素亮 置 1 当 On 0 时 第 S 点像素灭 清 0 该指令用于
点亮 关闭数码管中某一段 或 LED 矩阵中某一特定的 LED 该指令受 ScanNum 的内容影响 S6~S0
为像素地址 有效范围从 00H 3FH 无效的地址不会产生任何作用
像素地址
DpRam0
DpRam1
Sa
00H
08H
Sb
01H
09H
Sc
02H
0AH
-4-
Sd
03H
0BH
Se
04H
0CH
像素位地址映象如下
Sf
05H
0DH
Sg
06H
0EH
Sh
07H
0FH
广州周立功单片机发展有限公司
…
DpRam7
Tel: (020) 38730916
38H
39H
3AH
38730917
3BH
38730976
3CH
38730977
3DH
3EH
Fax: 38730925
3FH
(2) 按位下载数据且译码指令
其中 A3
通信缓冲区
Bit7 Bit6
Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
ComBuf0:
0
1
1
0
A3
A2
A1
A0
ComBuf1:
DP
Flash 0
D4
D3
D2
D1
D0
A0 为显示缓存编号 范围为 0000B 0111B 对应 DpRam0 DpRam7 无效的编号
不会产生任何作用
D4
DP=1 时点亮该位小数点 Flash=1 时该位闪烁显示 Flash=0 时该位正常显示
D0 为要显示的数据 按以下表规则进行译码
D5 D4 D3 D2 D1 D0 十六进制 显示内容 D5 D4 D3 D2 D1 D0 十六进制 显示内容
0 0 0 0 0 0
00H
0
0 1 0 0 0 0
10H
G
0 0 0 0 0 1
01H
1
0 1 0 0 0 1
11H
H
0 0 0 0 1 0
02H
2
0 1 0 0 1 0
12H
i
0 0 0 0 1 1
03H
3
0 1 0 0 1 1
13H
J
0 0 0 1 0 0
04H
4
0 1 0 1 0 0
14H
L
0 0 0 1 0 1
05H
5
0 1 0 1 0 1
15H
o
0 0 0 1 1 0
06H
6
0 1 0 1 1 0
16H
P
0 0 0 1 1 1
07H
7
0 1 0 1 1 1
17H
q
0 0 1 0 0 0
08H
8
0 1 1 0 0 0
18H
r
0 0 1 0 0 1
09H
9
0 1 1 0 0 1
19H
t
0 0 1 0 1 0
0AH
A
0 1 1 0 1 0
1AH
U
0 0 1 0 1 1
0BH
b
0 1 1 0 1 1
1BH
y
0 0 1 1 0 0
0CH
C
0 1 1 1 0 0
1CH
c
0 0 1 1 0 1
0DH
d
0 1 1 1 0 1
1DH
h
0 0 1 1 1 0
0EH
E
0 1 1 1 1 0
1EH
T
0 0 1 1 1 1
0FH
F
0 1 1 1 1 1
1FH 无显示
(3) 闪烁控制指令
通信缓冲区
Bit7
Bit6
CmdBuf0:
0
1
CmdBuf1:
F7
F6
当 Fn=1 时 该位闪烁 n 的范围为 0~7
Bit5 Bit4 Bit3 Bit2
1
1
X
X
F5
F4
F3
F2
对应 0~7 位 当 Fn=0 时
Bit1 Bit0
X
X
F1
F0
该位不闪烁 该指令会改
变所有像素的闪烁属性
例
执行指令 01110000B 00000000B 后
所有数码管不闪烁
七 附录
A. 电气特性 TA=25
符号
参数
VCC
IDD1
工作电压
工作电流
VIL1
VIH1
VIL2
VIH2
IOL
SDA,SCL 输入低电平
SDA,SCL 输高低电平
/RST 输入低电平
/RST 口输入高电平
INT 输出灌电流
IDL
Dig0~Dig7 灌电流
IDH
SegA~SegH 源电流
fI2C
I2C 接口速度
测试条件
VDD
条件
3.3
5
LED 全灭
无键按下
3.3V
5V
3.3V
5V
3.3V
5V
VOL=0.1VCC
VOL=0.1VCC
VOL=0.1VCC
VOL=0.1VCC
VOH=0.9VCC
VOH=0.9VCC
上拉电阻 3K3
-5-
最小
典型
最大
单位
3.3
5
1
3
8
20
8
20
-4
-10
-
5.5
2
5
0.3VCC
VCC
0.4VCC
VCC
32
V
mA
0
0.7VCC
0
0.9VCC
4
10
4
10
-2
-5
20
V
V
V
V
mA
mA
mA
KHz
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
极限参数:
电源供应电压………… GND-0.3V ~ GND+6.0V
储存温度………… -50 ~ 125
端口输入电压………… GND-0.3V ~ VCC+0.3V
工作温度………… -40 ~ 85
注.这里只强调 额定功率超过极限参数所规定的范围将对芯片造成损害无法预期 芯片在上述标示范围外
的工作状态而且若长期在标示范围外的条件下工作可能影响芯片的可靠性
B. 引脚说明
引脚号
13,12,21,22,3~6
10~7,2,1,24,23
20
19
14
15
17
18
16
11
引脚名称
Dig7~ Dig0
SegH~SegA
SDA
SCL
/INT
/RES
OSC1
OSC2
VCC
GND
引脚属性
输入/输出
输入/输出
输入/输出
输入/输出
输出
输入
输入
输出
电源
电源
引脚描述
LED 显示位驱动及键盘扫描线
LED 显示段驱动及键盘扫描线
I2C 总线接口数据/地址线
I2C 总线接口时钟线
中断输出端,低电平有效
复位输入端,低电平有效
连接晶体以产生内部时钟
电源正(3.3~5.5V)
电源地
C. 应用举例
S1
S2
S3
S4
S5
S6
S7
S8
S9
S10
S11
S12
S13
S14
S15
S16
4148
D2
S17
S18
S19
S20
S21
S22
S23
S24
4148
D3
S25
S26
S27
S28
S29
S30
S31
S32
4148
D4
D1
SegA
SegB
SegH
SegG
SegF
SegE
SegD
SegC
SegB
SegA
R1
R2
R3
R4
R5
R6
R7
R8
220
220
220
220
220
220
220
220
S34
S35
S36
S37
S38
S39
S40
4148
D5
S41
S42
S43
S44
S45
S46
S47
S48
4148
D6
S49
S50
S51
S52
S53
S54
S55
S56
4148
D7
S57
S58
S59
S60
S61
S62
S63
S64
4148
D8
a
b
c
d
e
f
g
h
L2
a
b
c
d
e
f
g
h
L1
SegD
S33
11
7
4
2
1
10
5
3
11
7
4
2
1
10
5
3
SegC
C0
C1
C2
C3
C0
C1
C2
C3
SegE
9
8
6
Dig2
Dig1
Dig0
6
Dig4
Dig3 12
8
9
Dig5
SegG
Dig6
Dig7 12
SegF
SegH
4148
R18
3K3
Dig7
R17
3K3
Dig6
R16
3K3
Dig5
Dig4
R15
3K3
Dig3
R14
3K3
Dig2
R13
3K3
Dig1
R12
3K3
Dig0
R11
3K3
U1
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
13
12
21
22
3
4
5
6
SDA 20
SCL 19
/INT 14
11
Dig7
Dig6
Dig5
Dig4
Dig3
Dig2
Dig1
Dig0
SegA
SegB
SegC
SegD
SegE
SegF
SegG
SegH
SDA
SCL
/INT
GND
VCC
OSC2
OSC1
/RES
23
24
1
2
7
8
9
10
SegA
SegB
SegC
SegD
SegE
SegF
SegG
SegH
VCC
16
18 OscOut
17 OscIn
15 /RST
VCC
C1
22p
VCC
R33
3K3
R37
100K
P1
/RST
C4
470p
1
2
3
4
5
VCC
OscOut
X1
8MHz
R34
3K3
C3
104
E1
220u/16V
OscIn
SCL
SDA
C2
22p
/INT
ZLG7290
D. 范例程序
该范例实现数字的输入与修改功能
入和修改数字
K0~K9(S10
以上键都可连击实现快速输入和修改
S1~S9)为数字键
对应数字 0
KRight(S11)为右移键
1~9
KLeft(S12)为左移键
在修改模式下 右移键或左移键用于选择要修改的位 可连击 KMode(S13)模式键 实现进入
改模式
用于输
退出修
不允许连击
使用该程序前要根据系统接线和速度配置 Zlg90Demo.c 或 Zlg90Demo.a51 文件内的 KeyInt
和 IicSMasU.inc 文件 其中项目 DemoC 是用 C 语言实现的范例 项目 DemoAsm 是用汇编语言实现
-6-
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
的范例 两者实现同样的功能 并且项目中都必须包含 IicSMasU.a51 文件
38730977
Fax: 38730925
C 编译器使用 Keil C51 V6.0
及以上
/*****
;FileName:
Zlg90Demo.c
;Describe:
ZLG7290 应用范例 80c51 系列模拟 I2C 总线主控器
;
此程序在 ZLG7290 test board 上运行
;
ZLG7290 为被控器
* K0~K9(S10,S1~S9)为数字键,对应数字 0,1~9
;
用于输入和修改数字,以上键都可连击实现快速输入和修改
;
* KRight(S11)为右移键; KLeft(S12)为左移键
;
在修改模式下 右移键或左移键用于选择要修改的位
;
* KMode(S13)模式键
;
KMode(S13)键实现进入
;Author:
退出修改模式
不允许连击
广州周立功单片机发展有限公司 伍仕峰 Blueyes Wu
;Date:
2003/04/25
*****/
#include<reg51.h>
#define
uchar
unsigned char
#define
uint
unsigned int
//hardware 与硬件有关的定义
//按键定义
#define K0
10
//S10
#define K1
1
//S1
#define K2
2
//S2
#define KRight
11
//S11
#define KLeft
12
//S12
#define KMode
13
//S13
#define SlvZlg7290
0x70
//ZLG7290 从地址
#define SubKey
0x1
//键码值子地址
#define SubCmdBuf
0x7
//命令缓冲区子地址
#define SubDpRam
0x10
//显存子地址
//根据硬件配置 IicSM.inc
//根据硬件配置 ZLG7290 的中断信号引脚 INT
sbit KeyInt=P3^3;
//中断信号
//hardware
//80c51 系列模拟 I2C 总线主控器驱动程序接口说明
/*****
;Name:
_IicTxdRxd(TxdByte,RxdByte,&IicDataBuf)
;Describe:
发送数据给被控器/接收来自被控器的数据
;Input:
TxdByte(R7)=要发送数据的字节数
;
RxdByte(R5)=要接收数据的字节数
;
IicDataBuf(R1)=发送/接收缓冲区首字节的地址
;
(SlvAddr(被控器地址),SubAddr(单元地址))
-7-
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
;Output: C(Retry=1):操作失败标志
;
IicDataBuf=接收到的数据首字节地址(主接收时有效)
;调用说明:
A.现行地址写: SlvAddr(写)
!!!(带 SubAddr 的器件不能使用该子程序)
;
TxdByte=(发送数据字节数(SubAddr 为第一个要发送的数据))
;
RxdByte=0
;
B.指定地址写: SlvAddr(写),SubAddr
;
TxdByte=(1+发送数据字节数)
;
RxdByte=0
;
C.现行地址读: SlvAddr(读)
;
TxdByte=0
;
RxdByte=要接收数据的字节数
;
D.指定地址读: SlvAddr(读),SubAddr
;
TxdByte=1
;
RxdByte=要接收数据的字节数
;Nesting level:
1
;Change:
A,C,R1, R4~R7
;****/
extern
bit IicTxdRxd(uchar TxdByte,uchar RxdByte, uchar *IicDataBuf);
//函数定义(程序入口地址)
extern
data uchar SlvAddr;
//被控器从地址
extern
data uchar SubAddr;
//单元地址
uchar
DpBuf[8];
//显示缓冲区
uchar
i;
//显示缓冲区指针
uchar
IicWriteBuf[3];
//IIC 写缓冲区
uchar
IicReadBuf[3];
//IIC 读缓冲区
#define key
IicReadBuf[0]
#define key_repeat
IicReadBuf[1]
#define FunctionKey
IicReadBuf[2]
bit
EditMode;
子地址
//修改模式
void main(void){
uchar
KeyNum;
uchar
Temp;
//数字键键码 0
KeyInt=1;
9
//置 KeyInt 引脚为输入状态
for (i=0;i<8;i++){
DpBuf[i]=0;
//显示缓冲区初始化值
}
EditMode=0;
//非修改模式
i=0;
//显示缓冲区指针初始化
while(1){
-8-
输入模式
Fax: 38730925
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
while(KeyInt==0){
38730976
38730977
Fax: 38730925
//等待按键
//读 key,key_repeat,FunctionKey 的内容到 IicReadBuf0~2
SlvAddr=SlvZlg7290;
SubAddr=SubKey;
while(IicTxdRxd(1,3,&IicReadBuf)==1);
//读出错重试
if(key<=K0){
//有效的数字键
KeyNum=key;
if(key==K0){
KeyNum=0;
};
if(EditMode==0){
//输入模式下
左移一位
IicWriteBuf[0]=0x10;
//左移一位指令
SlvAddr=SlvZlg7290;
SubAddr=SubCmdBuf;
IicTxdRxd(1+1,0,&IicWriteBuf);
};
//输出一位 控制闪烁
DpBuf[i]=KeyNum;
IicWriteBuf[1]=DpBuf[i];
IicWriteBuf[0]=0x60+i;
//在第 i 位数码管译码并显示 DpBuf[i]
if(EditMode){
IicWriteBuf[1]|=0x40;
//修改模式下闪烁
};
SlvAddr=SlvZlg7290;
SubAddr=SubCmdBuf;
IicTxdRxd(1+2,0,&IicWriteBuf);
}else{
//控制键
if((key==KMode)&(key_repeat==0)){
//不允许连击
EditMode=~EditMode;
i=0;
//显示缓冲区指针初始化
};
IicWriteBuf[1]=0x00;
//当前位不闪烁
if (EditMode==1){
//修改模式,选择要修改的位
if(key==KLeft){
if(i<7){
i++;
};
};
if(key==KRight){
if(i>0){
i--;
-9-
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
};
};
Temp=i+1;
IicWriteBuf[1]=1;
for(;Temp>1;Temp--){
//当前位(新选择的)闪烁
IicWriteBuf[1]=IicWriteBuf[1]+IicWriteBuf[1];
}
}
IicWriteBuf[0]=0x70;
//闪烁控制指令
SlvAddr=SlvZlg7290;
SubAddr=SubCmdBuf;
IicTxdRxd(1+2,0,&IicWriteBuf);
}
}
}
}
/*****
; FileName:
Zlg90Demo.a51
; Describe:
ZLG7290 应用范例 80c51 系列模拟 I2C 总线主控器
;
此程序在 ZLG7290 test board 上运行
;
* K0~K9(S10,S1~S9)为数字键,对应数字 0,1~9
;
;
;
;
用于输入和修改数字,以上键都可连击实现快速输入和修改
* KRight(S11)为右移键; KLeft(S12)为左移键
在修改模式下
; Date:
右移键或左移键用于选择要修改的位
* KMode(S13)模式键
;
; Author:
ZLG7290 为被控器
KMode(S13)键实现进入 退出修改模式
不允许连击
广州周立功单片机发展有限公司 伍仕峰 Blueyes Wu
2003/04/25
*****/
$include (reg51.inc)
;hardware 与硬件有关的定义
;按键定义
K0
equ 10
;S10
K1
equ 1
;S1
K2
equ 2
;S2
KRight
equ 11
;S11
KLeft
equ 12
;S12
KMode
equ 13
;S13
SlvZlg7290
equ 0x70
;ZLG7290 从地址
SubKey
equ 0x1
;键码值子地址
- 10 -
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
SubCmdBuf
equ 0x7
;命令缓冲区子地址
SubDpRam
equ 0x10
;显存子地址
;根据硬件配置 IicSM.inc
;根据硬件配置 ZLG7290 的中断信号引脚 INT
KeyInt
equ P3.3
;中断信号
extrn
code(_IicTxdRxd)
;程序入口地址
extrn
data(SlvAddr)
;被控器从地址
extrn
data(SubAddr)
;单元地址
;hardware
子地址
DataSegZlg90Demo SEGMENT DATA
RSEG DataSegZlg90Demo
DpBuf:
i:
ds
ds
8
;显示缓冲区
1
;显示缓冲区指针
IicWriteBuf: ds
3
;IIC 写缓冲区
IicReadBuf:
3
;IIC 读缓冲区
key
ds
equ IicReadBuf
key_repeat
equ IicReadBuf+1
FunctionKey equ IicReadBuf+2
EditMode bit
1
KeyNum:
;修改模式
ds
1
Temp:
DS 1
?STACK
SEGMENT
RSEG
;数字键键码
0
9
IDATA
?STACK
DS 1
CodeSegZlg90Demo SEGMENT CODE
RSEG CodeSegZlg90Demo
org
0
main:
MOV
sp,#?STACK-1
;系统堆栈初始化
SETB
KeyInt
;置 KeyInt 引脚为输入状态
CLR
A
;显示缓冲区初始化值
MOV
R0,#DpBuf
MOV
R1,#8
DpBufIni:
MOV
@R0,a
INC
R0
- 11 -
Fax: 38730925
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
DJNZ
R1,DpBufIni
CLR
EditMode
;非修改模式 输入模式
MOV
i,A
;显示缓冲区指针初始化
Loop:
JB
KeyInt,Loop
;读 key,key_repeat,FunctionKey 的内容到 IicReadBuf0~2
MOV
SlvAddr,#SlvZlg7290
MOV
SubAddr,#SubKey
Loop1:
MOV
R1,#IicReadBuf
MOV
R5,#3
MOV
R7,#1
LCALL
_IicTxdRxd
JC
Loop1
MOV
A,key
SETB
C
SUBB
A,#K0
JNC
CtrlKey
;读出错重试
;有效的数字键
MOV
KeyNum,key
MOV
A,key
CJNE
A,#K0,ForKey0End
MOV
KeyNum,#0
ForKey0End:
JB
EditMode, ForEditEnd
;输入模式下 左移一位
MOV
IicWriteBuf,#010H
MOV
SlvAddr,#SlvZlg7290
MOV
SubAddr,#SubCmdBuf
MOV
R1,#IicWriteBuf
MOV
R5,#0
MOV
R7,#1+1
LCALL
_IicTxdRxd
;左移一位指令
ForEditEnd:
;输出一位
MOV
控制闪烁
A,#LOW (DpBuf)
ADD
A,i
MOV
R0,A
MOV
@R0,KeyNum
MOV
A,@R0
JNB
EditMode, ForNoEditEnd
- 12 -
Fax: 38730925
广州周立功单片机发展有限公司
ORL
Tel: (020) 38730916
A,#040H
38730917
38730976
38730977
Fax: 38730925
;修改模式下闪烁
ForNoEditEnd:
MOV
IicWriteBuf+01H,A
MOV
A,i
ADD
A,#060H
MOV
IicWriteBuf,A
MOV
SlvAddr,#SlvZlg7290
MOV
SubAddr,#SubCmdBuf
MOV
R1,#IicWriteBuf
MOV
R5,#0
MOV
R7,#1+2
LCALL
_IicTxdRxd
SJMP
ForNext
;在第 i 位数码管译码并显示 DpBuf+i
CtrlKey:
;控制键
MOV
A,key_repeat
JNZ
ForKModeEnd
MOV
A,key
CJNE
A,#KMode, ForKModeEnd
;单击 KMode
CPL
EditMode
CLR
A
MOV
i,A
;显示缓冲区指针初始化
ForKModeEnd:
MOV
IicWriteBuf+1,#0H
JNB
EditMode, InInputMode
;当前位不闪烁
;修改模式,选择要修改的位
MOV
A,key
CJNE
A,#KLeft, ForKLeftEnd
INC
i
ForKLeftEnd:
MOV
A,key
CJNE
A,#KRight, ForKRightEnd
DEC
i
ForKRightEnd:
ANL
i,#111B
MOV
DPTR,#Tab8Sel1
MOV
A,i
MOVC
A,@A+DPTR
MOV
IicWriteBuf+1,A
;当前位(新选择的)闪烁
MOV
IicWriteBuf,#70H
;闪烁控制指令
MOV
SlvAddr,#SlvZlg7290
MOV
SubAddr,#SubCmdBuf
InInputMode:
- 13 -
广州周立功单片机发展有限公司
Tel: (020) 38730916
MOV
R1,#IicWriteBuf
MOV
R5,#0
MOV
R7,#1+2
LCALL
_IicTxdRxd
38730917
38730976
38730977
ForNext:
LJMP
Loop
Tab8Sel1:
DB 00000001B,00000010B,00000100B,00001000B
DB 00010000B,00100000B,01000000B,10000000B
END
;/*****
;FileName:
IicSMasU.a51
;Describe:
80c51 系列模拟 I2C 总线主控器驱动程序
;Author:
伍仕峰 Blueyes Wu
;Date:
2003/01/12
;*****/
$include (IicSMasU.inc)
public _IicTxdRxd
;RAM
public SlvAddr
public SubAddr
;/*****
;Name:
bit _IicTxdRxd(TxdByte,RxdByte,&IicDataBuf)
;Describe:
发送数据给被控器/接收来自被控器的数据
;Input:
TxdByte=要发送数据的字节数
;
RxdByte=要接收数据的字节数
;
IicDataBuf=发送/接收缓冲区的首字节
;
(SlvAddr(被控器地址),SubAddr(单元地址))
;Output:
C(Retry=1):操作失败标志
;
IicDataBuf=接收到的数据的首字节(主接收时有效)
;调用说明:
;
;
;
;
A.现行地址写: SlvAddr(写)
!!!(带 SubAddr 的器件不能使用该子程序)
TxdByte=(发送数据字节数(SubAddr 为第一个要发送的数据))
RxdByte=0
B.指定地址写: SlvAddr(写),SubAddr
;
TxdByte=(1+发送数据字节数)
;
RxdByte=0
;
;
C.现行地址读: SlvAddr(读)
TxdByte=0
- 14 -
Fax: 38730925
广州周立功单片机发展有限公司
;
Tel: (020) 38730916
38730917
38730976
RxdByte=要接收数据的字节数
;
D.指定地址读: SlvAddr(读),SubAddr
;
TxdByte=1
;
RxdByte=要接收数据的字节数
;Nesting level:
1
;Change:
A,C,R1, R4~R7
;****/
BitSegIicSM
SEGMENT BIT overlayable
RSEG BitSegIicSM
Retry:
dbit
DataSegIicSM
1
;指明 I2C 最后的数据传送失败应该重复操作
SEGMENT DATA overlayable
RSEG DataSegIicSM
SlvAddr:
ds
1
;被控器地址
SubAddr:
ds
1
;单元地址
TxdByte
equ r7
;要发送数据的字节数(第一传递参数)
RxdByte
equ r5
;要接收数据的字节数(第二传递参数)
WaitXTm macro
X
;延时 X 个机器周期
if X=0
exitm
endif
if X=1
nop
endif
if X=2
nop
nop
endif
if X=3
nop
nop
nop
endif
if X>255
error "the number of X is too much"
else
mov r6,#X/2
DJNZ
r6,$
endif
endm
- 15 -
38730977
Fax: 38730925
广州周立功单片机发展有限公司
CodeSegIicSM
Tel: (020) 38730916
38730917
38730976
SEGMENT CODE
RSEG CodeSegIicSM
_IicTxdRxd:
SETB
Retry
;设置错误标志位
;/*****
;发送起动条件
;*****/
SendStart:
SETB
SDA
SETB
SCL
WaitXTm IicDelay
CLR
SDA
;产生起始信号
WaitXTm IicDelay
CLR
SCL
;结束起动条件
;/*****
;送被控器地址地址,数据
;*****/
SendSlaAdr:
MOV
A,SlvAddr
CJNE
TxdByte,#0,SendSlaAdr1
SETB
ACC.0
;TxdByte=0 时进行读操作
SETB
C
;检测应答位时释放 SDA 线
CALL
XmByte
JC
IicErr
;无应答出错
JB
ACC.0,ReceiveData
;SlaAdr.0=1 时进行读操作
SendSlaAdr1:
;写操作
MOVA,SubAddr
SendData:
SETB
C
CALL
XmByte
JC
IicErr
MOV
A,@R1
INC
R1
DJNZ
TxdByte,SendData
DEC
R1
MOV
A,RxdByte
JNZ
SendStart
JMP
SendStop
;检测应答位时释放 SDA 线
;无应答出错
;RxdByte>0 时进行读操作
- 16 -
38730977
Fax: 38730925
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
;/*****
;Name:
RcvByte
;Describe:
接收 1 字节数据(接收 8 位,发送+1 位(非)应答位)
;Input:
C=1:发送非应答位(通知 slave 停止通信)
;
C=0:发送应答位(通知 slave 继续发送后续字节)
;Output:
A=接收到的数据, C=(非)应答位
;Use:
A,R4,C,R6(WaitXTm)
;*****/
RcvByte:
MOV
A,#0FFH
;释放 SDA 线允许输入
;/*****
;Name:
XmByte
;Describe:
发送 1 字节数据(发送 8 位,接收 1 位(非)应答位)
;Input:
A=待发送的数据, C=1(检测应答位时释放 SDA 线)
;Output:
C=1:slave 非应答(slave 不响应)
;
C=0:slave 应答(slave 接收成功)
;Use:
A,R4,C,R6(WaitXTm)
;*****/
XmByte:
MOV
R4,#9
;设置数据格式为 8 位+1 位(非)应答位
RLC
A
;左移数据
MOV
SDA,C
;output data
SETB
SCL
MOV
C,SDA
RXBit:
;input data
WaitXTm IicDelay
CLR
SCL
WaitXTm IicDelay
DJNZ
R4,RXBit
;重复操作直到处理完所有数据位
RET
ReceiveData:
MOV
A,RxdByte
CJNE
A,#2,ReceiveData1
;RxdByte=1(最后一个字节)时,发送非应答位(C=1)
;否则发送应答位(C=0)
ReceiveData1:
CALL
RcvByte
MOV
@R1,A
INC
R1
DJNZ
RxdByte,ReceiveData
;/*****
;产生 I2C 停止条件程序
- 17 -
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
;*****/
SendStop:
CLR
Retry
;清除错误标志位
IicErr:
;出错返回
CLR
SDA
SETB
SCL
WaitXTm IicDelay
SETB
SDA
MOVC,Retry
;RETURN ERROR FLAG(C=Retry)
RET
END
;/*****
;FileName:
IicSMasU.inc
;Describe:
80c51 系列模拟 I2C 总线主控器驱动程序包含文件
;Author:
伍仕峰 Blueyes Wu
;Date:
2003/01/12
;*****/
$include (reg51.inc)
;hardware
IicDelay
EQU
15
;与 I2C 信号延时(100KHz 时为 4.7uS)相对应的机器周期个数
;如你的系统的 1 机器周期=0.5uS, I2C 总线速度为 50KHz(I2C 信号延
;时约为 10uS) ,所以 IicDelay=(10uS/0.5uS)=20
SCL
EQU
p3.4
SDA
EQU
p3.5
;hardware
- 18 -
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
Plastic SKDIP Outline Dimensions
24-pin SKDIP (300mil) Outline Dimensions
A
B
2 4
1 3
1
1 2
H
C
D
E
Symbol
F
=
G
I
Dimensions in mil
Min.
Nom.
Max.
A
1235
¾
1265
B
255
¾
265
C
125
¾
135
D
125
¾
145
E
16
¾
20
F
50
¾
70
G
¾
100
¾
H
295
¾
315
I
345
¾
360
a
0°
¾
15°
广州周立功单片机发展有限公司
Tel: (020) 38730916
38730917
38730976
38730977
Fax: 38730925
SOP Outline Dimensions
24-pin SOP (300mil) Outline Dimensions
1 3
2 4
A
B
1 2
1
C
C '
G
H
D
E
Symbol
=
F
Dimensions in mil
Min.
Nom.
Max.
A
394
¾
419
B
290
¾
300
C
14
¾
20
C¢
590
¾
614
D
92
¾
104
E
¾
50
¾
F
4
¾
¾
G
32
¾
38
H
4
¾
12
a
0°
¾
10°