📄 f149-ht1621.c
字号:
#include<msp430x14x.h>
#include"F149-HT1621.h"
#include<intrinsics.h>
#include "timer.h"
#include "define.h"
//#include "comm.h"
//#include "intrins.h" /* use _nop_() function */
//#include "isp_iap.h"
//#include "iic.h"
//#include "disp.h"
#include "key.h"
/*********************************************************
* 接口定义:data<--->p2.5; cs<--->p2.6; wr<--->p2.7 *
**********************************************************/
uchar temp[7];
uchar time_date[7];
uint Data[3];
unsigned char DispFlag;
/**********************************************************************
延时函数
***********************************************************************/
//void Delay(void)
//{
//uchar i;
//for(i=0;i<10;i++); /*用于调整clk 脉冲宽度*/
//}
void Delay(uint M)
{
while (M > 0) M--;
}
/**********************************************************************
长延时函数
***********************************************************************/
void Delay_1s(void)
{
uchar i;
uint j;
for(i=0;i<100;i++)
for(j=0;j<1300;j++);
}
/*********************************************************************
发送命令函数a类
发送ht1621 命令时要先发送id 值,及命令字用于设置ht1621.
*********************************************************************/
void sendcoma(uchar com)
{
start_spi();
SendBit_1621(0x80,4); /*发送设置命令id=100 0*/
sendbyte(com); /*发送命令字*/
}
/*********************************************************************
发送命令函数b 类
发送ht1621 命令时要先发送id 值,后发送要写入数据起始地址,
用于对ram 写操作(调用此函数后即可发送数据) adr 是高5 位有效
*********************************************************************/
void sendcomb(uchar adr)
{
start_spi();
SendBit_1621(0xa0,4); /*发送写显示ram 命令id=101 0*/
SendBit_1621(adr,5); /*指定写入地址*/
}
/*********************************************************************
发送命令函数(c 类)
发送ht1621 命令时要先发送id 值.然后发送c 类的命令字
*********************************************************************/
void sendcomc(uchar com)
{
start_spi();
SendBit_1621(0x90,4); /*发送命令id=100 1*/
sendbyte(com); /*发送命令字*/
}
/**********************************************************************
向显示缓冲区填充,以最简便的形式显示数据
**********************************************************************/
void disp(uchar dat)
{
uchar i;
sendcomb(0x00); /*把数据指针指回0 接着写入数据*/
for(i=0;i<16;i++) /*写入16 字节数据*/
{
sendbyte(dat); /*写入数据*/
}
}
/******************************************************
全显示
******************************************************/
void disp_all(uchar data)
{
sendcoma(bias); /*设置偏压,背极数*/
sendcoma(rc256); /*设为内晶振256k*/
sendcoma(sysen); /*启动振荡器*/
sendcoma(lcdon); /*显示使能*/
sendcoma(timerdis); /*禁止时基输出*/
disp(data); /*输出全显数据*/
}
/******************************************************
LED选择显示
******************************************************/
void disp_led(uchar data)
{
sendcoma(bias); /*设置偏压,背极数*/
sendcoma(rc256); /*设为内晶振256k*/
sendcoma(sysen); /*启动振荡器*/
sendcoma(lcdon); /*显示使能*/
sendcoma(timerdis); /*禁止时基输出*/
disp(data); /*输出全显数据*/
}
/************************************************************************
名称: 发送数据位(?发送数据位向右移也要做)
************************************************************************/
void SendBit_1621(uchar dat,uchar bitcnt)
{
uchar i;
for(i=0;i<bitcnt;i++)
{
if(( dat & 0x80 ) == 0)
P5OUT&=~BIT1;//sda_port = 0;
else
P5OUT|=BIT1;//sda_port = 1; /*发送数据由高位到低位传送*/
Delay(10);
P5OUT|=BIT2;//clk_port = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay(10);
P5OUT&=~BIT2;//clk_port = 0; /*钳住总线准备下一个数据位*/
dat=dat<<1; /*发送数据左移一位*/
}
}
void Send_rightBit_1621(uchar dat,uchar bitcnt)
{
uchar i;
for(i=0;i<bitcnt;i++)
{
if(( dat & 0x80 ) == 0)
P5OUT&=~BIT1;//sda_port = 0;
else
P5OUT|=BIT1;//sda_port = 1; /*发送数据由高位到低位传送*/
Delay(10);
P5OUT|=BIT2;//clk_port = 1; /*置时钟线为高通知被控器开始接收数位*/
Delay(10);
P5OUT&=~BIT2;//clk_port = 0; /*钳住总线准备下一个数据位*/
dat=dat>>1; /*发送数据右移一位*/
}
}
/**********************************************************************
起动ht1621
**********************************************************************/
void start_spi(void)
{
P5OUT|=BIT4;//cs_port=1;
P5OUT|=BIT2;//clk_port=1;
P5OUT|=BIT1;//sda_port=1;
Delay(10);
P5OUT&=~BIT4;//cs_port=0;
P5OUT&=~BIT4;//cs_port=0;
P5OUT&=~BIT2;//clk_port=0;
P5OUT&=~BIT2;//clk_port=0;
}
/************************************************************************
发送字节函数,向ht1621 发送字节数据数据单元dat
************************************************************************/
void sendbyte(uchar dat)
{
SendBit_1621(dat,8); /*发送字节*/
}
/************************************************************************
*以下是借鉴的程序*
************************************************************************/
/**-------------------------------------------------------------------------
Name: SendCmd(送命令)
---------------------------------------------------------------------------*/
void SendCmd_1621(uchar command)
{
start_spi();
SendBit_1621(0x80,4); //写入标志码“100”和9 位command 命令,由于
SendBit_1621(command,8); //没有使有到更改时钟输出等命令,为了编程方便
//直接将command 的最高位写“0”
}
/**-------------------------------------------------------------------------
Name: Write_1621(送8位数据和命令程序)
---------------------------------------------------------------------------*/
void Write_1621(uchar addr,uchar sdata)
{
addr<<=2;
start_spi();
SendBit_1621(0xa0,3); //写入标志码“1010 0000”
SendBit_1621(addr,6); //写入addr 的高6位
SendBit_1621(sdata,8); //写入data 的8位
}
/**-------------------------------------------------------------------------
Name: Write_1621b(送4位数据和命令程序)
---------------------------------------------------------------------------*/
void Write_1621b(uchar addr,uchar sdata)
{
addr<<=2;
start_spi();
SendBit_1621(0xa0,3); //写入标志码“1010 0000”
SendBit_1621(addr,6); //写入addr 的高6位
SendBit_1621(sdata<<4,4); //写入data 的4位
}
/**-------------------------------------------------------------------------
Name: all_off(清除1621显示)
---------------------------------------------------------------------------*/
void HT1621_all_off(void)
{ uchar i;
uchar addr=0;
for(i=0;i<16;i++)
{
Write_1621(addr,0x00);
addr+=2;
}
}
/****************************************************************************
Name: all_on(全部点亮1621)
****************************************************************************/
void HT1621_all_on(void)
{ uchar i;
uchar addr=0;
for(i=0;i<12;i++)
{
Write_1621(addr,0xff);
addr+=2;
}
}
/****************************************************************************
Name: led显示
****************************************************************************/
void HT1621_led_on(void)
{
uchar addr1=0x00;
Write_1621b(addr1,0xf0);
uchar addr=0x01;
Write_1621(addr,0xaf);
uchar addr2=0x07;
Write_1621(addr2,0xf);
uchar addr3=0x0b;
Write_1621(addr3,0xff);
}
void HT1621_LED_sz(void)
{
uchar LED4=0x01;
Write_1621(LED4,0xaf);
uchar LED3=0x03;
Write_1621(LED3,0xaf);
uchar LED2=0x05;
Write_1621(LED2,0xaf);
uint date=0xfa;
uchar LED1_1=0x10;
Write_1621b(LED1_1,date);
date=date<<4;
uchar LED1_2=0x07;
Write_1621b(LED1_2,date);
uchar LED5_1=0x00;
Write_1621b(LED5_1,0xf0);
uchar LED5_2=0x08;
Write_1621b(LED5_2,0xa0);
uchar LED6=0x09;
Write_1621(LED6,0xfa);
uchar LED7=0x0b;
Write_1621(LED7,0xfa);
uchar LED8=0x0d;
Write_1621(LED8,0xfa);
uchar LED9=0x14;
Write_1621(LED9,0xfe);
uchar LED10=0x16;
Write_1621(LED10,0xfe);
uchar LED11=0x18;
Write_1621(LED11,0xfe);
uchar LED12=0x1a;
Write_1621(LED12,0xfe);
uchar LED13=0x1c;
Write_1621(LED13,0xfe);
uchar LED14=0x1e;
Write_1621(LED14,0xfe);
uchar Ealendar=0x13;
Write_1621b(Ealendar,0x40);
}
/****************************************************************************
Name: Init_1621(初始化1621)
*****************************************************************************/
void Init_1621(void)
{
sendcoma(bias); /*设置偏压,背极数*/
sendcoma(rc256); /*设为内晶振256k*/
sendcoma(sysen); /*启动振荡器*/
sendcoma(lcdon); /*显示使能*/
sendcoma(timerdis); /*禁止时基输出*/
}
/****************************************************************************
Name: LCDoff(初始化1621)
*****************************************************************************/
void LCDoff(void)
{
SendCmd_1621(LCD_off);
}
/****************************************************************************
Name: LCDon(初始化1621)
*****************************************************************************/
void LCDon(void)
{
SendCmd_1621(LCD_on);
}
/**********************************************************************
主函数
*********************************************************
SPI接口定义:data<--->p5.1; cs<--->p5.4; wr<--->p5.2
light口定义:light<--->p4.4
**********************************************************************/
void main()
{
WDTCTL = WDTPW + WDTHOLD; //off watchdog
DCOCTL = 0XE0;
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
BCSCTL1 |= DIVA_3;
uchar m;
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (m = 0xFF; m > 0; m--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
BCSCTL2 |= SELM1+SELM0; // MCLK = LFXT1 (safe)
BCSCTL2 |= DIVM_1;
ii=0;
jj=0;
ll=0;
kk=0;
MMMM=0x00;
DispFlag = 249;
KeyScanMode =0;
Code_Const_Flash = 0;
Code_Const = 0x65;
TB0_COUNT = 0;
TB1_COUNT = 0;
P3DIR |= 0X0b;
P5DIR|=BIT1+BIT2+BIT4;
//P4DIR|=BIT4;
Init_7758();
Init_1621();
TimerInitial();
P1DIR |= 0X70;
P1OUT &= ~0X70;
P4DIR |= 0X10;
P4OUT &= ~0X10;
//uchar i;
_EINT();
HT1621_all_off();
//if(Main_Flag==1)
//while(Main_Flag==1)
do
{
/*
if(!((~P4IN & 0xf) == 0));
{
P4OUT |= 0X10;
Delay(60000);
}
*/
//KeyScan();
//KeyProcess();
/*HT1621_all_off();
for(i=0;i<150;i++)
{
Disp_Number_H(0x24,0xFC,0xEE,0x3E);
Delay(1000);
}
*/
if((!MMMM) && DispFlag == 250)
{
uint Data1,Data2,Data3,Danwei;
Danwei = 0x02;
Data1 = Read_7758_Dan(0x0d);
Data2 = Read_7758_Dan(0x0e);
Data3 = Read_7758_Dan(0x0f);
Get_U(Data1,Data2,Data3,Danwei);
Disp_Number(DISP);
}
if((~P4IN & 0xf) != 0)
{
//TB1_COUNT = 0;
P4OUT &= ~0X10;
if(TB1_COUNT < 300)
{
P4OUT |= 0X10;
}
}
else
if(TB1_COUNT > 300)
{
P4OUT &= ~0X10;
TB1_COUNT = 0;
}
/*
HT1621_all_off();
for(i=0;i<50;i++)
{
uint Data1,Data2,Data3,Danwei;
Danwei = 0x01;
Data1 = Read_7758_Dan(0x0a);
//Data1 = Data1 << 8;
Data2 = Read_7758_Dan(0x0b);
Data3 = Read_7758_Dan(0x0c);
//Read_UI(uint *a1,uint *a2,uint *a3);
//Get_UI(uint *D_Data1,uint *D_Data2,uint *D_Data3);
Get_U(Data1,Data2,Data3,Danwei);
Disp_Number(DISP);
Delay(1000);
}
HT1621_all_off();
for(i=0;i<50;i++)
{
uint Data1,Data2,Data3,Danwei;
Danwei = 0x40;
Data1 = Read_7758_Di_16(0x01); //WATTHR_MEASURE
//Data1 = Data1 << 8;
Data2 = Read_7758_Di_16(0x02);
Data3 = Read_7758_Di_16(0x03);
//Read_UI(uint *a1,uint *a2,uint *a3);
//Get_UI(uint *D_Data1,uint *D_Data2,uint *D_Data3);
Get_PQ(Data1,Data2,Data3,Danwei);
Disp_Number(DISP);
Delay(1000);
}
HT1621_all_off();
for(i=0;i<50;i++)
{
uint Data1,Data2,Data3,Danwei;
Danwei = 0x04;
Data1 = Read_7758_Di_16(0x04); //VARHR_MEASURE
//Data1 = Data1 << 8;
Data2 = Read_7758_Di_16(0x05);
Data3 = Read_7758_Di_16(0x06);
//Read_UI(uint *a1,uint *a2,uint *a3);
//Get_UI(uint *D_Data1,uint *D_Data2,uint *D_Data3);
Get_PQ(Data1,Data2,Data3,Danwei);
Disp_Number(DISP);
Delay(1000);
}
HT1621_all_off();
for(i=0;i<50;i++)
{
uint Data1,Data2,Data3,Danwei;
Danwei = 0x08;
Data1 = Read_7758_Di_16(0x07); //VAHR_MEASURE
//Data1 = Data1 << 8;
Data2 = Read_7758_Di_16(0x08);
Data3 = Read_7758_Di_16(0x09);
//Read_UI(uint *a1,uint *a2,uint *a3);
//Get_UI(uint *D_Data1,uint *D_Data2,uint *D_Data3);
Get_PQ(Data1,Data2,Data3,Danwei);
Disp_Number(DISP);
Delay(1000);
}
*/
/*
if(!MMMM)
{
//HT1621_all_off();
//for(i=0;i<50;i++)
// {
read_rtc4543(temp);
time_date[i]=temp[i];
Get_Time();
Disp_Number(DISP);
Delay(1000);
// }
}
*/
}while(1);
//Main_Flag = 0; //主程序结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -