一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 12560|回复: 7
收起左侧

玩一个不常见的IIC段码屏,驱动PCF8576

[复制链接]
发表于 2019-8-5 21:31 | 显示全部楼层 |阅读模式
一个不常见的IIC段码屏,驱动是PCF8576。
3 b" N# d/ Y8 i/ e, K% B- V/ W! o5 ^4 ^1 P

0 _# q. d, L8 x( t1 Y: D% f PDC1402 V10442.编码.jpg . d! s2 N, o* E# f5 A% a& P0 X3 I
PDC1402 V10442.B.jpg
; @0 B4 a& d; L* j  X8 M
: |8 `  U" j3 A1 \9 N) o7 u; _2 D; x  }! o/ {
配套的PDF资料:" l8 z/ }1 G7 L8 Q! D
PCF8576中文资料.pdf (389.02 KB, 下载次数: 76)
9 N1 k) ?: o: P& X( @( _. c1 g  a) f9 e! ]- l
PCF8576C-En.pdf (254.55 KB, 下载次数: 72)
6 N9 g: L, u; ^6 b& H: k% h' J8 w) H9 y, p* D$ D  D' N- W% r5 x
测试源代码,主程序C语言,IIC底层驱动是汇编。$ E6 q& h- F1 ~/ a
压缩包有HEX文件,烧录51单片机即可,晶振需要 2 - 4 MHz 。
5 s0 m0 T& K$ ]- S) S# sSBIT                IIC_SCL        = P32 ;
  l' ]* P# a  h% K% O( B; USBIT                IIC_SDA        = P33 ;$ F: Y+ o: Z7 }9 t
7 t( q8 E- [5 z( t4 u( Q+ H
除了电源,只需连接这两根线,模块自带IIC总线的上拉电阻。' Z1 ?* r7 |7 f) z
PCF8576 I2C段码屏.rar (1.79 KB, 下载次数: 1, 售价: 5 人民币)
, Z- c! k6 B- C; [' m" _2 @1 }0 k原创,一般也用不到,收5个金币。
8 G, j# @" M/ ?
 楼主| 发表于 2019-8-6 08:12 | 显示全部楼层
本帖最后由 pla155 于 2019-8-6 08:15 编辑 , J, O# l& b4 X* t4 X

, v2 G% o9 i9 V3 q: \
IIC总体特征
Ø  SDA和SCL都是双向线路,通过一个电流源或上拉电阻连接到正的电源电压。
Ø  当总线空闲时这两条线路都是高电平。
Ø  连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。
Ø  总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s。
Ø  在SCL线是高电平期间SDA线上的数据必须保持稳定。
Ø  在SCL线是低电平期间SDA线的高或低电平状态可以改变。
Ø  在SCL线是高电平期间SDA线从高电平向低电平切换表示起始信号。
Ø  在SCL线是高电平期间SDA线从低电平向高电平切换表示停止信号。
Ø  发送到SDA线上的每个字节必须为8位。
Ø  首先传输的是数据的最高位。
Ø  每次传输可以发送的字节数量不受限制。
Ø  每个字节传输后必须从机需给一个响应位。
Ø  响应时钟脉冲SCL由主机产生。
Ø  在响应的时钟脉冲期间主机释放SDA线(高电平)。
Ø  在响应的时钟脉冲期间从机需将SDA线拉低并保持稳定。
Ø  如果从机不能立刻接收或发送下数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好后,应该释放时钟线SCL。

5 D' a7 \- @3 h9 x3 ]: G
第一个字节的位定义
第一个字节的头7位组成了从机地址。最低位LSB是第8位它决定了报文的方向。最低位是0 表示主机写信息到被选中的从机,最低位是1 表示主机向从机读信息。
1 s2 c9 T5 b: H, y1 J7 D

- G! H+ _/ N3 W# ?& g
对应这个驱动芯片,也就是很简单的三个函数。
/ c8 d8 C7 ~) u: I  E+ ~启动总线函数' t3 T3 K6 B: P) {/ b  i6 O% S
//         extern void IIC_START( void );
' }( e' r% J7 M# M; j% p2 t0 C# ?1 E        RSEG          ?PR?IIC_START?IIC
8 W5 h3 o2 m! cIIC_START:
- _$ n. ^; q/ U" p  K' U& ?                SETB    IIC_SDA
  Y7 u0 Z! n4 \2 U3 T                m_IIC_CLK
$ y$ W" i" p( N0 n( s        SETB    IIC_SCL
- t" M" V% E! _6 o                m_IIC_CLK9 B4 F3 ~: i, A: z6 `& u- U
        CLR     IIC_SDA
: N) s# Y( U2 h% g$ \" P4 n                m_IIC_CLK
9 r* A- X5 t; ^4 g/ Z  r        CLR     IIC_SCL( v7 f, {$ Y+ p3 W1 m
                RET
: ?2 a7 q, f7 s7 E7 O7 g;---------------------------------------' \* j* Q/ h/ J1 ?/ _" A/ g4 _& T

  E: k8 H" t& H" T2 P! H* L& \! Z
' r" T/ r0 F' I0 m, w
结束总线函数
: ~' u) ?% ?! P5 G$ ~9 _+ c//         extern void IIC_STOP( void );
7 n" S7 k1 p. B  K3 ^3 o/ u, Y        RSEG          ?PR?IIC_STOP?IIC. ]7 E3 N- B" J5 r0 J
IIC_STOP:
# Y( k% M  O+ W( q5 ]        CLR     IIC_SDA7 a" a, k$ W: m
                m_IIC_CLK
$ e* W$ h5 W) \8 M$ q6 Z        SETB    IIC_SCL
  x: |7 c: c( f. L) m( G' l+ ]- K. k                m_IIC_CLK4 ?/ Z/ Y8 }; l% x3 ?
                SETB    IIC_SDA
( z: a% A/ X* N8 s7 y6 n- Q                m_IIC_CLK
* R8 S1 v6 J& v                m_IIC_CLK/ |  m0 ^& F& L6 {3 {: [
                RET6 a. n0 E) i' I/ M4 u+ R
;-------------------------------------------------------------------------------1 b, m1 ?( n. o7 L
发送数据函数# I6 z$ b( b7 Z# @) V% R
//         extern bit IIC_WriteByte( unsigned char cDATA );
- {9 S0 [3 V3 f# g8 n( l3 j& D8 a        RSEG          ?PR?_IIC_WriteByte?IIC7 ^) O$ S- s. Q; p  H8 H$ R, g
_IIC_WriteByte:
. W2 j2 J2 Z: p' l2 g7 i        MOV                A                        , R7
, M- s! R; i( R  D7 {7 [                MOV                R7                        , #008H
) U( }6 q2 ?  v) Z  R7 d" lJP0_IIC_WriteByte:, z5 C! B/ {' M8 f3 I
                RLC                A                                                ; 首先传输的是数据的最高位
" I, G' d. f* x$ }* S) [  U0 E                MOV                IIC_SDA                , C; Q7 A% \" k+ Z$ {2 Y
                m_IIC_CLK4 n/ i5 r  C  D) r' z
        SETB    IIC_SCL
9 a/ k8 A8 g4 \4 `* S                m_IIC_CLK
6 x* k' C6 C9 A! p$ K; f        CLR     IIC_SCL4 @* }2 }; F4 w. v+ @
                DJNZ        R7                        , JP0_IIC_WriteByte! U1 H) F! V) A/ ^0 _5 }
                ;在响应的时钟脉冲期间主机释放SDA线(高电平)
, a- t9 e. c# g" v: m2 F                m_IIC_CLK
9 R6 j1 N# c  F1 |. x. T                SETB    IIC_SDA
, V# y' G' ?- O9 @0 S                m_IIC_CLK: s; Z, p+ B  f4 v$ H. D% X' l
        SETB    IIC_SCL
5 }# ~) N3 T0 H4 W. _) B                m_IIC_CLK4 ~% s* |9 S# N% f0 \, L
                ; 每个字节传输后必须从机需给一个响应位
( b& ^. ]- w3 Y& L                 MOV                C                     , IIC_SDA
: i8 @7 u$ v( Y' I9 c        CLR     IIC_SCL$ a+ H8 w8 `7 j2 G& Q" x: ?
                RET
( t+ \% {! Q- f% V7 g! S" b
5 M0 L8 v: W8 @5 i5 C! l; S! y, D4 E/ _8 K. f& m1 k

# X+ G: O/ m, R9 p; H首先启动IIC总线,然后按照要求发送控制字和数据,最后释放总线。(高电平)- r4 M: q& z& ]
 楼主| 发表于 2019-8-6 08:22 | 显示全部楼层
在PCF8576这边看,也是相对很简单:
0 V( H) I  v$ C" a* I' c  e总线首先发送过来几个字节的控制字,完成初始化工作。
7 E/ o+ E) c1 d& l) j5 a$ [/******************************************************************************/
+ d4 D6 P% }. A2 n% J& @void PCF8576_Init(void)) Y* Q2 A4 N# s' r( T( O
{% J" u. O* U; ~7 J
" }/ S( w+ B: c3 k. T# X/ q
        IIC_START();
. l4 A9 v- R" t  E& l9 E        IIC_WriteByte(0x070);                                // 器件地址为070H
: K% `( U# H! d8 m1 V' S' P        IIC_WriteByte(0x0CC);                                // 方式:四背极,1/3偏置,正常显示
$ v& W$ Z/ r$ L3 [7 x9 |* U        IIC_WriteByte(0x0FB);                                // 不闪烁
, V7 `5 ?% z4 [9 |1 z$ M8 K2 @$ [        IIC_STOP();, Q: Z* ?3 [, a2 k5 t
        return;
, K6 q! z7 h  w6 C}
$ B9 k1 \+ p0 E+ `: _$ R, A
$ T0 Q) \# ^0 q. @( G! K之后就是发送要写入的地址和相关数据即可。5 h( B* D4 ?+ D+ ]1 I1 `8 R) a

  A+ q- H# n# b7 mRAM空间是 4*40 的,每个点与屏幕上的笔划是一一对应的。
8 z' p4 }( M5 {& C+ l6 b+ \6 h' H! {. c: `: Y
void PCF8576_CLS(void) 1 h- w  L- _8 e' W
{
/ R! d7 E7 s% k( x" N        IIC_START();0 |7 c8 H& X: O: w6 W! t
        IIC_WriteByte(0x070);                                // 器件地址为070H
- v. Z9 M/ q& J, |        IIC_WriteByte(0x000);                                // 数据地址 0
& Y' V9 y9 q* A; E, [9 d        for(i = 0 ; i <20; i++)8 z+ A* ^4 L" j' ]
                IIC_WriteByte(0x000);                                        : C2 C: E  ?7 c  V3 z" z
        IIC_STOP();; J3 m7 E; c! t& b) R

: U5 z& X6 Y; ?9 v        return;
" V0 F. x2 w- C. V5 l}
, D, e4 B  Z0 G1 h& X. d0 s. ]  O! b, ?

, J6 Z  M3 n( I1 L4 ?2 ~* G
 楼主| 发表于 2019-8-6 08:27 | 显示全部楼层
一直疑惑他的编码方式,为什么地址不连续,详见一楼图片。
8 E; O' V/ \) N! T! d# @# N- o3 n8 @4 U- `0 C9 K/ a

: a4 L$ S5 x; F睡了一觉,想明白了。
( Y# w8 q. |" s5 |: }7 e; Z芯片内部是4个位作为一个字节, V- F  e6 O1 Y
从总线上接收到8个位,地址节会自动加2 。# O6 j3 G7 }2 @/ B
豁然开朗,一切都那么的神清气爽。
' f* n. [4 X7 z
$ w% x  ], P# N) Z/ V, {3 ^7 M
! T; {' k, T# O  R1 c
还是手册没好好看,人家开篇就说了是 4X40 的 RAM 。, M4 |9 P, G6 ?6 p/ F% b
原因是英语不好,
. U: m" i" m' t. @! d: D归结为小时候学习不努力,2 t0 S9 V4 y. E: B, P1 N9 O. [% m
让我哭一会儿。0 V1 p: n; C: S+ i
发表于 2019-8-6 20:02 | 显示全部楼层
小时候学习不努力,大了好像也没努力

点评

家里有矿,晓得开矿就可以了  详情 回复 发表于 2019-8-8 08:33
发表于 2019-8-8 08:33 | 显示全部楼层
lising 发表于 2019-8-6 20:02
$ Y$ K/ X  E9 W/ a小时候学习不努力,大了好像也没努力

7 n& N8 {, L3 W4 ?% v家里有矿,晓得开矿就可以了
发表于 2022-8-22 13:34 | 显示全部楼层
我最近也在调试这个PCF8576芯片,清除显示不能清除,不知道啥问题
发表于 2024-2-29 13:25 | 显示全部楼层
感谢分享,少见的芯片

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-4-27 17:02 , Processed in 0.052234 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表