一 测量原理图
说明K1 K2 K3 是LCD 模块的设置开关K1 是WDT 选择开关闭合时打开WDT 否则关闭
WDT K2 是TONE 选择开关闭合时打开音频输出否则关闭K3 是LCD 模块振荡器选择开关K3 闭合时是选择外部32.768K 晶振否则选择内部RC 振荡器256K KEY 是确认键用于循环测量流程LED 是测量值可读数指示灯当MCU 对LCD 模块设置完后将把接口的IO 口P0.1 P0.3 P0.5 置为高阻态再点亮LED 指示测量值可读
测量方法通过对K1 K2 K3 选择LCD模块的工作方式然后按一下KEY 键等LED 点亮时观
察LCD 若LCD 全显则此时电流表测出的电流就是当前设置工作方式全显的电流再按一下KEY 键LCD 则全灭此时电流测量值就是掉电方式下的电流
二 源程序
/***********************************************************
DLCD.c
本程序是对本公司水表LCD 模块进行调试及参数测量,可对LCD 模块的全显时的
功耗掉电模工下的功耗WDT及音频输出时的功耗进行测量.........
**********************************************************/
#include
#define uint unsigned int
/*为SPI.h 设置LCD 模块接口端口参数*/
sbit CS_PORT=P0^1; /*CS 端口*/
sbit CLK_PORT=P0^3; /*WR 端口*/
sbit SDA_PORT=P0^5; /*DATA端口*/
#include /*SPI.h 文件内已定义了uchar*/
/*模式选择开关定义*/
sbit K1=P0^0; /*WDT打开关闭选择*/
sbit K2=P1^6; /*音频输出打开关闭选择*/
sbit K3=P1^4; /*内外部晶振选择*/
sbit KEY=P1^1; /*'确认'按键*/
sbit LED=P0^7; /*可读数指示灯*/
/*命令字定义命令字是'命令模式'的低8 位数据*/
#define BIAS 0X52 /*定义1 3 偏压4 背极*/
#define XTAL32 0X28 /*使用外部晶振*/
#define RC256 0X30 /*使用内部256KRC 振荡器*/
#define SYSEN 0X02 /*打开振荡发生器*/
#define LCDON 0X06 /*打开LCD*/
#define SYSDIS 0X00 /*关闭振荡发生器*/
#define LCDOFF 0X04 /*显示关闭*/
#define TONE4 0X80 /*设置BZ 输出频率为4K*/
#define TONEON 0X12 /*打开BZ 音频输出*/
#define TONEOFF 0X10 /*关闭BZ 音频输出*/
#define CLRWDT 0X1c /*清零WDT*/
#define F1 0X40 /*WDT设置为4 秒溢出*/
#define IRQEN 0X10 /*IRQ 输出禁止*/
#define IRQDIS 0X00 /*IRQ 输出允许*/
#define WDTEN 0X0e /*打开WDT*/
#define WDTDIS 0X0a /*关闭WDT*/
#define TIMERDIS 0X08 /*关闭时基输出*/
/************************************************************
延时函数
函数原型: void Delay()
使用: SPI 操作的延时
**********************************************************/
void Delay()
{
uchar i;
for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
}
/*****************************************************
长延时函数
函数原型: void Delay1s()
使用: 长延时.....
******************************************************/
void Delay1s()
{
uchar i;
uint j;
for(i=0;i<10;i++)
for(j=0;j<1300;j++);
}
/*****************************************************
发送命令函数A类
函数原型: void SENDCOMA(uchar com)
使用: 发送还HT1621 命令时要先发送ID 值,及命令字用于设置HT1621.
*********************************************************/
void SENDCOMA(uchar com)
{
Start_spi();
SendBit(0X80,4); /*发送设置命令ID=100 0*/
SendByte(com); /*发送命令字*/
}
/******************************************************
发送命令函数B 类
函数原型: void SENDCOMB(uchar adr)
使用: 发送还HT1621 命令时要先发送ID 值,后发送要写入数据起始地址,
用于对RAM 写操作(调用此函数后即可发送数据) adr 是高5 位有效
*******************************************************/
void SENDCOMB(uchar adr)
{
Start_spi();
SendBit(0XA0,4); /*发送写显示RAM 命令ID=101 0*/
SendBit(adr,5); /*指定写入地址*/
}
/********************************************************
发送命令函数(C 类)
函数原型: void SENDCOMC(uchar com)
使用: 发送还HT1621 命令时要先发送ID 值.然后发送C 类的命令字
*******************************************************/
void SENDCOMC(uchar com)
{
Start_spi();
SendBit(0X90,4); /*发送命令ID=100 1*/
SendByte(com); /*发送命令字*/
}
/********************************************************
向显示缓冲区填充
原型: void disp(ucahr dat)
功能: 向显示缓冲区填充,以最简便的形式显示数据
***********************************************************/
void disp(uchar dat)
{
uchar i;
SENDCOMB(0x00); /*把数据指针指回0 接着写入数据*/
for(i=0;i<16;i++) /*写入16 字节数据*/
{
SendByte(dat); /*写入数据*/
}
}
/******************************************************
全显示的电流测量
可选择部件WDT 音频输出内部RC 外部晶振选择
时基输出关闭
******************************************************/
void DISP_ALL()
{
/*显示芯片初始化同时也是LCD 模块掉电唤醒程序*/
SENDCOMA(BIAS); /*设置偏压,背极数*/
/*选择晶振类型*/
K3=1;
if(K3==1)SENDCOMA(RC256); /*设为内晶振256K*/
else SENDCOMA(XTAL32);
/*启动LCD 振荡器*/
SENDCOMA(SYSEN); /*启动振荡器*/
Delay1s();
SENDCOMA(LCDON); /*显示使能*/
SENDCOMA(TIMERDIS); /*禁止时基输出*/
/*看门狗选择*/
K1=1;
if(K1==0)
{
SENDCOMC(F1); /*WDT设置为4S*/
SENDCOMA(WDTEN); /*打开WDT*/
SENDCOMA(CLRWDT); /*清零WDT*/
SENDCOMC(IRQEN); /*打开IRQ*/
}
else
{
SENDCOMC(IRQDIS); /*禁止IRQ*/
SENDCOMA(WDTDIS); /*禁止WDT溢出标志输出*/
}
/*音频输出选择*/
K2=1;
if(K2==0)
{
SENDCOMA(TONE4); /*音频输出设为4KHz*/
SENDCOMA(TONEON); /*打开音频输出*/
}
else SENDCOMA(TONEOFF); /*否则关闭音频输出*/
disp(0xff); /*输出全显数据*/
PT0AD=0x3e; /*SPI 接口数字输入功能禁止*/
P0M1=P0M1|0x3e; /*设SPI 口为仅为输入P0M2 对应位已经是0*/
LED=1; /*指示测量值可读*/
KEY=1; /*等待'确认'按键*/
while(KEY==1);
P0M1=P0M1&0xc1; /*设SPI 口为双向口*/
PT0AD=0x00;
LED=0; /*关LED 指示*/
while(KEY==0);
}
/*********************************************************
掉电测量部分
先把音频输出关闭再进入掉电方式
掉电后LCD 接口置为高阻态I O 口没有高阻态方式时应置为1
********************************************************/
void DISP_OFF()
{
SENDCOMA(TONEOFF); /*音频输出禁止*/
Delay1s();
SENDCOMA(LCDOFF); /*显示禁能*/
Delay1s();
SENDCOMA(SYSDIS); /*停止振荡器*/
P0M1=P0M1|0x3e; /*设SPI 口为仅为输入*/
PT0AD=0x3e; /*SPI 接口数字输入功能禁止*/
LED=1; /*指示掉电电流测量值可读*/
KEY=1;
while(KEY==1);
P0M1=P0M1&0xc1; /*设SPI 口为双向口*/
PT0AD=0x00;
LED=0;
while(KEY==0);
}
/****************************************************
主函数
原型: void main()
功能: 对KEY 不断查询若有按键则进行全显测量状态若再次按键则进入
掉电测量状态依次循环测量
**********************************************************/
void main()
{
P0M1=P0M1&0x7f; /*设LED 口为上拉输出*/
P0M2=P0M2|0x80;
while(1)
{
LED=0; /*关指示灯*/
DISP_ALL(); /*全显示测量*/
DISP_OFF(); /*掉电测量*/
}
}
头文件SPI.h
/****************************************************************
SPI.h
此头文件是对SPI 进行读写的一些基本函数用于对本公司水表等LCD 模块
驱动调试
************************************************************/
#define uchar unsigned char
extern void Delay(); /*器件驱动程序的延时程序*/
/*************************************************************/
名称: 发送数据位
原型: void SendBit(uchar dat,uchar bitcnt)
用途: 向SPI 发送dat 的bitcnt 位数据由高位开始.(bitcnt 不能大于8)
/***************************************************************/
void SendBit(uchar dat,uchar bitcnt)
{
uchar i;
for(i=0;i
if(( dat & 0X80 ) == 0)
SDA_PORT = 0;
else
SDA_PORT = 1; /*发送数据由高位到低位传送*/
Delay();
CLK_PORT = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay();
CLK_PORT = 0; /*钳住总线准备下一个数据位*/
dat=dat<<1; /*发送数据左移一位*/
}
}
/*************************************************************
起动spi
原型: void Start_spi()
作用: 起动spi,以便进行器件操作
************************************************************/
void Start_spi()
{
CS_PORT=1;
CLK_PORT=1;
SDA_PORT=1;
Delay();
CS_PORT=0; CS_PORT=0;
CLK_PORT=0; CLK_PORT=0;
}
/***************************************************************/
名称: 发送字节函数
原型: void SendByte(uchar dat)
用途: 向SPI 发送字节数据数据单元dat
/***************************************************************/
void SendByte(uchar dat)
{
SendBit(dat,8); /*发送字节*/
}
三测量数据
测量条件VDD 3.6V,测量时与LCD 接口的IO 口为高阻态电流表是Agilent 6 1/2(LCD模块的RD 及
IRQ 脚悬空) P87LPC764 采用片内振荡12 clock 内部上电复位看门狗禁止复位IO 口
为高电平掉电检测2.5V
注意事项与LCD 模块接口的IO CS WR DATA 平时应设置为高阻态若所用的单片机IO 没
有高阻态方式则应置为高电平状态若置为低电平LCD 模块电流会增加120uA 左右
(VDD=3.6V) 音频输出时功耗很大主要是蜂鸣器讯响器驱动电流应避免长时间输出
且进入掉电模式前一定要关掉音频输出退出掉电模式只要打开系统振荡器打开LCD 偏置
发生器即可但最好再次设置其工作方式由于要测量的电流值较小LCD 模块接口上VDD
和VSS 及其它各点焊接要注意焊锡不要态多尽量防止松香开成漏电回路
部分水表LCD 模块在各工作方式下的电流测量表
LCD模块数据表
相关文章