⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f149-ht1621.c

📁 MSP430单片机与段码液晶驱动芯片通讯程序
💻 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 + -