2009年4月17日星期五

液晶驱动芯片PCF8576使用指导

 

1.PCF8576 工作方式设定
MODE1 EQU 50H ;1/3 偏压1:4 背极节电方式及清除显示(即清屏)
MODE2 EQU 58H ;1/3 偏压1:4 背极节电方式及允许显示
A.方式设定
PCF8576SET:
LCALL START ;启动I2C 总线
MOV A,#PCF8576 ;送器件地址
LCALL SendByte
MOV A,#MODE2 ;取方式命令字(即偏压背极及节电设定,闪烁配置一般由显示程序完成见
;程序2 中的LOAD8576 子程序)
LCALL SendByte ;发送命令字


LCALL STOP ;退出总线
RET
B.清屏程序
ClearLCD:
LCALL START ;启动I2C 总线
MOV A,#PCF8576 ;送器件地址
LCALL SendByte
MOV A,#MODE1 ;取清屏命令字
LCALL SendByte ;发送命令字
LCALL STOP ;退出总线
RET
2.将图3 中LCD 从左至右的位置上依次显示0--9 十个数(设S0/S1 段对应第一个7 段数码,以此类推):
DISPLAY:
LCALL Load8576 ;装载LCD 显示数据
DISPLAY0:
MOV SubAdr,#80H ;送起始显示地址,即从S0 段开始显示,最高位为1 表示发送的第1 个字节为命令
MOV ByteCnt,#11 ;取发送数据字节数,由1 个命令字和10 个显示数据组成
DISPLAY1:
MOV SlvAdr,#PCF8576;取器件地址
LCALL SendData ;发送数据并显示
RET
3.装载数据程序
XmtDat DATA 50H ;定义缓冲区首址
LOAD8576:
MOV 50H,#73H ;闪烁方式为正常,闪烁频率为0.5Hz 的命令字送缓冲区首址,其它命令最好单独设
;定如程序1 如果不需要闪烁应将数#70H 送入缓冲区首址
MOV 51H,#0EDH ;0--9 十个数送发送缓冲区
MOV 52H,#60H
MOV 53H,#0A7H
MOV 54H,#0E3H
MOV 55H,#6AH
MOV 56H,#0CBH
MOV 57H,#4FH
MOV 58H,#0E0H
MOV 59H,#0EFH
MOV 5AH,#0EBH
RET
注: 为方便起见,本文附录中给出了完整的I2C 总线数据发送模块(SendData)和字节发送程序(SendByte)
参考资料

附录: 向PCF8576 发送数据源程序
;I2C 总线模块化程序ZM-I2C -8576-V0.1
;***************************************************************************************************
; 87LPC762/4 单主控器模拟I2C 总线发送数据程序
;说明本程序是利用87LPC764 单片机的普通I/O口(如P0.1/P0.0)模拟实现I2C 总线的功能对I2C 总线上的器
; 件本程序采用PCF8576 进行写操作
; 被控器地址在SlvAdr 单元地址在SubAdr 中所发送的数据字节数在ByteCnt 中所发送的数据在XmtDat
; 中
;**************************************************************************************************
;87LPC762/4 单主控器模拟I2C 总线发送数据程序头文件
;器件地址
PCF8576 EQU 70H
;内存数据定义
BitCnt DATA 30H ; I2C 数据位计数器
ByteCnt DATA 31H ; I2C 数据字节计数器
SlvAdr DATA 32H ;被控器地址
SubAdr DATA 33H ;被控器单元地址
XmtDat DATA 50H ;发送数据缓冲区
;端口位定义
SDA BIT P0.1 ;模拟I2C 数据传送位
SCL BIT P0.0 ;模拟I2C 时钟控制状态标志
;*************************************************************************************************
;发送数据程序
;名称:SendData
;描述:发送ByteCnt 个字节给被控器PCF8576
;被控器地址在SlvAdr 中单元地址在SubAdr 中
;所发送数据的字节数ByteCnt 在中发送的数据在XmtDat 缓冲区中
;发送数据正常返回标志F0=0 F0=1 表示被控器无应答或损坏
;*************************************************************************************************
SendData:
ACALL START ;发送I2C 总线起始条件
MOV A ,SlvAdr ;取被控器总线地址
ACALL SentByte ;发送被控器总线地址
JB F0,SendReturn ;出错返回
MOV A,SubAdr ;取单元地址
ACALL SentByte ;发送单元地址
JB F0,SendReturn ;出错返回
MOV R0,#XmtDat ;取发送数据缓冲区首址
SentNext:
MOV A,@R0
ACALL SentByte ;发送一次数据
JB F0,SendReturn ;出错返回

 


INC R0 ;取下一个数据
DJNZ ByteCnt,SentNext ;重复操作直到发送完最后一个数据
ACALL STOP ;发送I2C 总线停止条件
Delay10:
MOV R7,#30H ;延时10ms,等待数据写完
D1:
MOV R6,#34H
D2:
DJNZ R6,D2
DJNZ R7,D1
SendReturn:
RET
;******************************************************************************
; 子程序
;名称:START
;描述:启动I2C 总线子程序--发送I2C 起始条件
;;*****************************************************************************
START:
SETB SDA ;发送起始条件的数据信号
NOP
SETB SCL ;发送起始条件的时钟信号
NOP ;起始条件建立时间大于4.7 s
NOP
NOP
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4 s
NOP
NOP
NOP
NOP
CLR SCL ;钳住I2C 总线准备发送或接收数据
RET
;--------------------------------------------------------------------------
;名称:STOP
;描述:停止I2C 总线子程序--发送I2C 总线停止条件
;-------------------------------------------------------------------------
STOP:
CLR SDA ;发送停止条件的数据信号
NOP
SETB SCL ;发送停止条件的时钟信号

 

 

NOP ;起始条件建立时间大于4 s
NOP
NOP
NOP
NOP
SETB SDA ;发送I2C 总线停止信号
NOP
NOP
NOP
NOP
RET
;----------------------------------------------------------------------
;名称:SentByte
;描述:字节数据传送子程序发送一个字节数据或地址给被控器PCF8576
;要发送的数据在ACC 中
;发送数据正常返回标志F0=0 F0=1 表示被控器无应答或损坏
;------------------------------------------------------------------------
SentByte:
MOV BitCnt,#08H ;要传送的数据长度为8 位
SentB:
RLC A ;要发送的数据左移,发送位入C
JC Sent1 ;发送位为"1"转发送数据位"1"
CLR SDA ;发送数据位"0"
SJMP Sent ;转发送数据位
Sent1:
SETB SDA ;发送数据位"1"
NOP
Sent:
NOP
SETB SCL ;置时钟线为高通知被控器开始接收数据位
NOP ;保证时钟高周期大于4 s
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线准备接收下一个数据位
DJNZ BitCnt,SentB ;8 位没发送完继续发送
NOP
NOP
SETB SDA ;8 位发送完后释放数据线准备收应答位
NOP
NOP

 

SETB SCL ;开始接收应答信号
NOP
NOP
CLR F0 ;预先清发送数据出错标志
JNB SDA, AckEnd ;判断是否接收到应答信号正常转AckEnd
SETB F0 ;未收到应答置位错误标志
AckEnd:
NOP
CLR SCL ;发送结束钳住总线准备下一步发送或接收数据或进行其它处理
RET

没有评论:

发表评论