HT1622 驱动程

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_CS = P1^0;		//端口还没按原理图改过来,应为p0^0~p0^3;
sbit LCD_RD = P1^1;
sbit LCD_WR = P1^2;
sbit LCD_DATA = P1^3;
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
//Subroutine Declare
//------------------------------------------------------------------------------
void Delay2us(uchar);
void Delay100us(uchar);
void Delay1ms(uchar);
void Delay10ms(uchar);
void Delay100ms(uchar);

//==============================================================================
//Subroutine:	Delay2us
//==============================================================================
void Delay2us(uchar Counter)
{
    while (--Counter);
}

//==============================================================================
//Subroutine:	Delay100us
//==============================================================================
void Delay100us(uchar Counter)
{
    while (Counter--)
    {
        Delay2us(150);
    }
}

//==============================================================================
//Subroutine:	Delay1ms
//==============================================================================
void Delay1ms(uchar Counter)
{
    while (Counter--)
    {
        Delay100us(11);
    }
}

//==============================================================================
//Subroutine:	Delay10ms
//==============================================================================
void Delay10ms(uchar Counter)
{
    while (Counter--)
    {
        Delay1ms(11);
    }
}

//==============================================================================
//Subroutine:	Delay100ms
//==============================================================================
void Delay100ms(uchar Counter)
{
    while (Counter--)
    {
        Delay1ms(101);
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////
void SendBit(bit SENT_BIT)	   //发送一位数据
{

    //LCD_CS=0;
    LCD_DATA=SENT_BIT;
    LCD_WR=0;
    Delay2us(1);
    //delay100ns(2);
    LCD_WR=1;
    //LCD_CS=1;
}
void SendData(uchar dat,uchar CNT)	 //发送数据
{
    uchar i;
    for (i=0;i<CNT;i++)
    {
        SendBit(dat&0x01);
        dat=dat>>1;
    }
}
void SendAddr(uchar addr ,uchar CNT)   //发送地址
{
    uchar i;
    for (i=0;i<CNT;i++)
    {
        SendBit(addr&0x80);
        addr<<=1;
    }
}
void LCD_Write_Command(uchar CMD)		 //写命令
{
    LCD_CS=0;
    SendAddr(0x80,3);
    SendAddr(CMD,9);					 //A5 A4 A3 A2 A1 A0
    LCD_CS=1;
}
void LCD_Write_Data(uchar addr ,uchar DAT)	 //写数据
{
    LCD_CS=0;
    SendAddr(0xA0,3);
    SendAddr(addr<<2,6);   		   		 //A5 A4 A3 A2 A1 A0
    SendData(DAT,4);					  //D0 D1 D2 D3
    LCD_CS=1;
}
void LCD_Init()							//初始化
{
    LCD_Write_Command(0x01);		     //SYS EN
    LCD_Write_Command(0x29);		     //set bias 1/3
    LCD_Write_Command(0x18);			 //on-chip RC oscillator
    LCD_Write_Command(0x01);			 //SYS EN
    LCD_Write_Command(0x03);			 //dispaly on
}
void display(uchar dat)					//0x00清空
{
    uchar i;
    uchar address=0;
    for (i=0;i<255;i++)
    {
        LCD_Write_Data(address,dat);
        address++;
    }
}



////status=0xffff;
////从左到右 分别对应0~15
//void SetSunLightStatus(uint status)
//{
//	bit leve=0;
//	uint i=0;
//	uchar addr=1;
//	uchar storge=44;
//	// Delay100ms(3);
//
//	for(i=0;i<16;i++)
//	{
//	    if(i%4==0)
//		addr=1;
//		if(i>=0&&i<<4)
//			storge=44;
//		if(i>=4&&i<<8)
//			storge=45;
//		if(i>=8&&i<12)
//			storge=40;
//		if(i>=12&&i<16)
//			storge=41;
//	   leve=status&0x8000;
//	   status<<=1;
//	   if(leve==1)
//	   {
//
//		  LCD_Write_Data(storge,addr);
//
//		  Delay1ms(25);//时间函数要改
//
//	   }
//	      if(i==3)
//		  {
//		  	  	LCD_Write_Data(44,0x00);
//
//		  }
//		  if(i==7)
//		  {
//
//		  		LCD_Write_Data(45,0x00);
//		  }
//          if(i==11)
//		  {
//		  		 LCD_Write_Data(40,0x00);
//
//		  }
//		  if(i==15)
//		  {
//		  		 LCD_Write_Data(41,0x00);
//
//		  }
//	   addr<<=1;
//	   leve=0;
//
//	}
//}

void SetSunLightStatus(uint status)
{
    bit leve=0;	 //高低电平判断
    uchar val=0;  //记录一个单元地址的总值
    uchar temp=0;
    uchar addr=1;

    uint i=0;
    for (i=0;i<16;i++)
    {
        leve=status&0x8000;
        status<<=1;
        if (leve==1)
        {
            val+=addr;
            addr<<=1;
        }
        else
        {
            addr<<=1;
        }
        leve=0;
        if ((i+1)%4==0)	  //所有变量重新初始化,以便继续下一个单元的计算
        {
            temp=val;
            addr=1;
            val=0;
        }
        if (i==3)
        {
            LCD_Write_Data(44,temp);
            temp=0;
        }
        if (i==7)
        {
            LCD_Write_Data(45,temp);
            temp=0;

        }

        if (i==11)
        {
            LCD_Write_Data(40,temp);
            temp=0;

        }
        if (i==15)
        {
            LCD_Write_Data(41,temp);
            temp=0;
        }
    }
}
void SetSoarXLightStatus(uint status)
{
    bit leve=0;	 //高低电平判断
    uchar val=0;  //记录一个单元地址的总值
    uchar temp=0;
    uchar addr=1;

    uint i=0;
    for (i=0;i<16;i++)
    {
        leve=status&0x8000;
        status<<=1;
        if (leve==1)
        {
            val+=addr;
            addr<<=1;
        }
        else
        {
            addr<<=1;
        }
        leve=0;
        if ((i+1)%4==0)	  //所有变量重新初始化,以便继续下一个单元的计算
        {
            temp=val;
            addr=1;
            val=0;
        }
        if (i==3)
        {
            LCD_Write_Data(42,temp);
            temp=0;
        }
        if (i==7)
        {
            LCD_Write_Data(43,temp);
            temp=0;

        }

        if (i==11)
        {
            LCD_Write_Data(38,temp);
            temp=0;

        }
        if (i==15)
        {
            LCD_Write_Data(39,temp);
            temp=0;
        }
    }
}
/////////////////////////////////////////////////////



enum{V,KW,A,KWh,AllUnit}Choice_Unit=V;
void SetUnitValue(void)
{
    switch (Choice_Unit)
    {
    case V:
        LCD_Write_Data(0,0x01);
        break;
    case KW:
        LCD_Write_Data(0,0x02);
        break;
    case A:
        LCD_Write_Data(1,0x04);
        break;
    case KWh:
        LCD_Write_Data(1,0x08);
    case AllUnit:
        LCD_Write_Data(0,0x03);
        LCD_Write_Data(1,0x0c);
        break;
    default :
        break;
    }
}


/////////////////////////////////////////////////////
enum{Battery,Solar,Total}BatteryOrSolarMode=Battery;
void SetBatteryOrSolarLightMode()
{
    switch (BatteryOrSolarMode)
    {
    case Battery:
        LCD_Write_Data(0,0x07);
        break;
    case Solar:
        LCD_Write_Data(1,0x0d);
        break;
    case Total:
        LCD_Write_Data(1,0x0e);
        break;
    default:
        break;
    }
}
//实际应用中,SetBatteryOrSolarLightMode()应放到SetUnitValue(void)后,制版问题,两个显示在一个单元地址导致
///////////////////////////////////////////////////////
void SetValue(uchar local, uchar value,bit leve) //KWh小数点位置,1表示有,0表示无
{
    uchar seg1[10]={13,0,14,10,3,11,15,0,15,11};

    uchar seg2[10]={7, 6, 3, 7,6, 5, 5,7, 7, 7};

    uchar addr1=0;
    uchar addr2=0;
    uchar value1=seg1[value] ;
    uchar value2=seg2[value];

    if (local==1)
    {
        addr1=2;
        addr2=4;
    }
    else if (local==2)
    {
        addr1=6;
        addr2=8;
    }
    else if (local==3)
    {
        addr1=10;
        addr2=12;
    }
    else if (local==4)
    {
        addr1=14;
        addr2=16;
    }
    else if (local==5)
    {
        addr1=22;
        addr2=24;
    }
    else if (local==6)
    {
        addr1=26;
        addr2=28;
    }
    else if (local==7)
    {
        addr1=30;
        addr2=32;
    }
    else if (local==8)
    {
        addr1=34;
        addr2=36;

    }
    else if (local<=17&&local>=9)
    {
        addr1=(local-9)*4+3;
        addr2=addr1+2;
    }

    LCD_Write_Data(addr1,value1);

    if (leve==1&&(local==3||local==7||local==11||local==17||local==16))
        value2+=8;



    LCD_Write_Data(addr2,value2);
}
void main()
{
    LCD_Init();
    display(0x00);
//	 LCD_Write_Data(1,0x01);
//	 display(0x00);
    //  LCD_Write_Data(24,7);
//	while(1) ;
    while (1)
    {
        uchar i,j;
        for (j=0;j<10;j++)
        {
            for (i=1;i<=17;i++)
            {
                if (i==17)
                    SetValue(i, j,0) ;
                else
                    SetValue(i, j,1) ;


            }
            Delay10ms(10);
        }
    }

    SetValue(17, 7,1);





}

//////////////////////////////////////////////////////////////////////////////
/*	 SetValue()测试程序
	 while(1)
 	 {
 	 	  uchar i,j;
 	     for(j=0;j<10;j++)
 	 	 {
 		   for(i=1;i<=17;i++)
 	    	{
 		       if(i==17)
 			   SetValue(i, j,0) ;
 			   else
 			   SetValue(i, j,1) ;


 			}
 			Delay10ms(10);
 	     }
 	 }
*/
//////////////////////////////////////////////////////////
/*
			Choice_Unit=AllUnit;
	     SetUnitValue()	 ;
			 BatteryOrSolarMode=Solar;
       SetBatteryOrSolarLightMode() ;
*/
//////////////////////////////////////////////////////////


你可能感兴趣的:(HT1622 驱动程)