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

📄 ht1621.c

📁 和泰LCD显示器驱动的详细软件
💻 C
字号:
//貼一張我剛剛調試ok的液晶驅動芯片HT1621的c程序:


#include "HT1621.H"

unsigned char idata lcdBuff[8];
//查表函数

//uchar code
//uchar code lcdtab[12] = {0x5f,0x50,0x3d,0x7d,0x72,0x6b,0xbe,0x51,0x7f,0x7b,0x20,0x2f};
uchar code  lcdtab[17] = {0xfa,0x0a,0xbc,0x9e,0x4e,0xd6,0xf6,0x8a,0xfe,0xde,0x04,0xf4,
                         0x36,0xee,0x64,0x0e,0x00};
//char lcdtab[9];
// LD 测距LCD 显示段转换表
//char tab{} = {01011111B};
/* +   bit        hex
  0   0   0101 1111  0x5f
  1   1   0101 0000  0x50
  2   2   0011 1101  0x3d
  3   3   0111 1101  0x7d
  4   4   0111 0010  0x72
  5   5   0110 1011  0x6b
  6   6   0110 1110  0xbe
  7   7   0101 0001  0x51
  8   8   0111 1111  0x7f
  9   9   0111 1011  0x7b
  10  -   0010 0000  0x20
  11  E   0010 1111  0x2f
  12  o
  13  R
  14  -1
  15  1-
  16  空

*/

//查表函数
/*
uchar tab{} = {0x5f,0x50,0x3d,0x7d,0x72,
               0x6b,0xbe,0x51,0x7f,0x7b,
               0x20,0x2f};

*/



void test_ht1621(void)
{

 char command,i;
 char ch;
 //lcdBuff
 uchar lb[8];

 LCD_INT1621();
 lcd_onff(0);
 lcd_onff(1);

 //S11 测试闪亮标记
 Set_glint(0);
 DisplayLCD_ht1621(lcdBuff,8);

 Set_glint(1);
 DisplayLCD_ht1621(lcdBuff,8);

 Set_glint(0);
 DisplayLCD_ht1621(lcdBuff,8);

 //测试显示状态
 setFlag_qian(0);
 DisplayLCD_ht1621(lcdBuff,8);

 setFlag_qian(1);
 DisplayLCD_ht1621(lcdBuff,8);

 setFlag_qian(2);
 DisplayLCD_ht1621(lcdBuff,8);

 setFlag_qian(3);
 DisplayLCD_ht1621(lcdBuff,8);

 setFlag_qian(4);
 DisplayLCD_ht1621(lcdBuff,8);

 setFlag_qian(5);
 DisplayLCD_ht1621(lcdBuff,8);



 //测试长整数到BCD码变换
 ch = uintTObcd(1234567,lb);
  PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);

 ch = uintTObcd(123456,lb);
 PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);

 ch = uintTObcd(12345,lb);
 PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);

 ch = uintTObcd(1234,lb);
 PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);

 ch = uintTObcd(123,lb);
 PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);

 ch = uintTObcd(12,lb);
 PutLCDBuff(lb);
  DisplayLCD_ht1621(lcdBuff,8);
 //测试错误显示
   //Set_error();

   Set_testing();


 //测试显示段和数字的对应关系
 ClrLCDBuff(lcdBuff,8);
 DisplayLCD_ht1621(lcdBuff,8);

 for(i=0;i<16;i++)  {
      ch = lcdtab[i];
      lcdBuff[i%6] = ch;
      DisplayLCD_ht1621(lcdBuff,8);
      }


 //测试标号点的LCD段显示
    SetLCDBuff(lcdBuff,8);  //全显
    DisplayLCD_ht1621(lcdBuff,8);

    set_p(0);
    DisplayLCD_ht1621(lcdBuff,8);
    set_p(1);
    DisplayLCD_ht1621(lcdBuff,8);

    set_m(0);
    DisplayLCD_ht1621(lcdBuff,8);
    set_m(1);
    DisplayLCD_ht1621(lcdBuff,8);

    set_fast(0);
    DisplayLCD_ht1621(lcdBuff,8);
    set_fast(1);
    DisplayLCD_ht1621(lcdBuff,8);

    set_exalt(0);
    DisplayLCD_ht1621(lcdBuff,8);
    set_exalt(1);
    DisplayLCD_ht1621(lcdBuff,8);

    set_continuous(0);
    DisplayLCD_ht1621(lcdBuff,8);
    set_continuous(1);
    DisplayLCD_ht1621(lcdBuff,8);


 //测试8段,4段显示
 ClrLCDBuff(lcdBuff,8);    //清除显示缓冲区
 DisplayLCD_ht1621(lcdBuff,8);  //刷新显示区
   for(;;)  {
   for(i=0;i<8;i++)  {
     ClrLCDBuff(lcdBuff,8);
     lcdBuff[i] = 0xf0;
     DisplayLCD_ht1621(lcdBuff,8);

     ClrLCDBuff(lcdBuff,8);
     lcdBuff[i] = 0x0f;
     DisplayLCD_ht1621(lcdBuff,8);
     //ht1621_delay(300);
     }
    }
 for(;;)
 ;
 /*
 lcd_cs=1;
 lcd_rd=1;
 lcd_wr=1;
 lcd_data=1;
 lcd_delay(10);
 lcd_cs=0;
 lcd_rd=0;
 lcd_wr=0;
 lcd_data=0;
 */
  //LCDSerialPulse(0x55,8);
 //LCD_INT1621();

 }

void lcdint(void)  //写入脉冲初始化HT1621.
{
 lcd_cs=0;
 lcd_wr=1;
 _nop_();
 lcd_wr=0;
 _nop_();
}

//HT1621的延时脉冲,pn 脉冲数
void lcd_delay(char pn)
{
   int i;
   for(i=0;i<pn;i++)
     _nop_();

  }

void WriteClk(void)  //写入脉冲
{
 //lcd_cs=0;
 lcd_wr=0;
 lcd_delay(10);
 lcd_wr=1;
 lcd_delay(10);
}


void LCDSerialPulse(uchar id,uchar n)
{
uchar i;
for(i=0;i<n;i++)
 {
 if(id>=0x80)
  lcd_data=1;
 else
  lcd_data=0;
  WriteClk();
  id<<=1;
 }
}

void lcd_onff(char k)
{
  //char ch;
  char command;
 if(k == 0)
      command=0x04;         //关闭LCD
  else
  //LCDsendcom(command);
      command=0x06;         //開啟LCD
  LCDsendcom(command);

 }



//发送指令到LCD
void LCDsendcom(uchar command)
{
 uchar a=0x80,i=4,d=8;
 lcdint();
 LCDSerialPulse(a,i);
 LCDSerialPulse(command,d);
 lcd_wr=1;
 lcd_cs=1;
 lcd_data=1;
}
void LCD_INT1621(void)               //送命令字
{
 uchar command;
 command=BIAS;             // 1/3 bais . 4 duty
 LCDsendcom(command);
 command=RC256;         //啟動內部256KRC 振蕩器
 LCDsendcom(command);
 command=SYSTEN;
 LCDsendcom(command);
 command=LCDON;         //開啟LCD
 LCDsendcom(command);
}
//以上程序使能LCD驅動.

void LCDsend1621data()
{
 uchar a=0x01,b=0x80,c=0x40,d=0x08;
 uchar j,k;
 lcdint();
 LCDSerialPulse(b,a);
 LCDSerialPulse(c,d);  //從display buffer RAM 0x0000 開始
 for(j=0;j<16;j++) //        將X1[]數組需要顯示的數据逐個送RAM.
 {
 //k=X1[j];
 LCDSerialPulse(k,d);
 }

}

//清除LCD显示缓冲区
void ClrLCDBuff(uchar *spb,char nda)
{
   char i;
   for(i=0;i<nda;i++)  {
     spb[i] = 0x00;
     }
  }

//全显LCD显示缓冲区
void SetLCDBuff(uchar *spb,char nda)
{
   char i;
   for(i=0;i<nda;i++)  {
     spb[i] = 0xff;
     }
  }


//刷新缓冲区显示

void DisplayLCD_ht1621(uchar *sd,char nd)
{
 //uchar a=0x01,b=0x80,c=0x40,d=0x08;
 uchar j,k,dp;
 //lcdint();
 //dp = sd[0];
 lcd_cs=0;
 lcd_delay(10);
 LCDSerialPulse(0x0a0,3);   //写入命令
 LCDSerialPulse(0x00,6);
 //LCDSerialPulse(c,d);  //從display buffer RAM 0x0000 開始
 for(j=0;j<nd;j++) //        將X1[]數組需要顯示的數据逐個送RAM.
 {
   k = sd[j];
   LCDSerialPulse(k,8);    //写入数据
   }
   lcd_cs=1;
   lcd_delay(10);
}
//以上是//往HT1621 display buffer RAM送要顯示數据

void LCD_test(void)
{
  char i,j;
  char ab[8];

  for(j=0;j<6;j++)  {
   for(i=0;i<8;i++)
     ab[i] = 0xff;
     //reLCDht1621(ab,8);
     ht1621_delay(1000);
   for(i=0;i<8;i++)
     ab[i] = 0x00;
     //reLCDht1621(ab,8);
     ht1621_delay(1000);
   }

}


//延时1ms的程序
void ht1621_delay(int ms)
{
  int i,j;
  for(i=0;i<ms;i++)  {
  for(j=0;j<160;j++)
    _nop_();
  }
  }



//设置单个点
// sp-显示段字节位置,dot- 0灭,1-亮
void SetLcd_Dot(char* sp,char dot)
{
  char ch;
  ch = *sp;

  if(dot == 0)
    ch &= 0xfe;
   else
    ch |= 0x01;

    *sp = ch;
 }

//P的亮灭
void set_p(char dot)
{
  char* sp;
  sp = &lcdBuff[2];
  SetLcd_Dot(sp,dot);
  }

//M的亮灭

void set_m(char dot)
{
  char* sp;
  sp = &lcdBuff[5];
  SetLcd_Dot(sp,dot);
  }

//t1的亮灭
void set_fast(char dot)
{
  char* sp;
  sp = &lcdBuff[3];
  SetLcd_Dot(sp,dot);
  }
//t2的亮灭
void set_exalt(char dot)
{
  char* sp;
  sp = &lcdBuff[1];
  SetLcd_Dot(sp,dot);
  }
//t3的亮灭
void set_continuous(char dot)
{
  char* sp;
  sp = &lcdBuff[0];
  SetLcd_Dot(sp,dot);
  }

//设置前端标记旗号
// fl-0 全灭, 1-前,2-中,3-后
void setFlag_qian(char nfl)
{
  //char *sp;

  lcdBuff[6] = 0x00;
  lcdBuff[7] = 0x00;
  switch(nfl)  {
    case 0:
          lcdBuff[6] = 0x0;
          lcdBuff[7] = 0x0;
          break;
    case 1:
          lcdBuff[6] = 0x8c;
          lcdBuff[7] = 0xff;
          break;
    case 2:
          lcdBuff[6] = 0xca;
          lcdBuff[7] = 0xff;
          break;
    case 3:
          lcdBuff[6] = 0xe9;
          lcdBuff[7] = 0xff;
          break;
    case 4:
          lcdBuff[6] = 0xff;
          lcdBuff[7] = 0xff;
          break;

        }

}

//S11 闪亮标记
void Set_glint(char mfl)
{
 char ch;
 ch = lcdBuff[7];
 if(mfl == 0)
   ch &= 0x7f;
 else
   ch |= 0x80;

 lcdBuff[7] = ch;
 }

//全部点亮和清零
void Set_LCDseg(char mfl)
{
  char ch,i;
  //char ab[8];
  if(mfl == 0)
   ch = 0;
   else ch = 0xff;

   for(i=0;i<8;i++)
      lcdBuff[i] = ch;

 }

 //错误显示 -1
void Set_error(void)
{

  ClrLCDBuff(lcdBuff,8);
  //DisplayLCD_ht1621(lcdBuff,8);
  lcdBuff[0] = lcdtab[11];
  lcdBuff[1] = lcdtab[13];
  lcdBuff[2] = lcdtab[13];
  lcdBuff[3] = lcdtab[12];
  lcdBuff[4] = lcdtab[13];
  DisplayLCD_ht1621(lcdBuff,8);

}

//显示 正在测试中---
void Set_testing(void)
{

  //ClrLCDBuff(lcdBuff,8);
  //DisplayLCD_ht1621(lcdBuff,8);
  lcdBuff[0] = lcdtab[10];
  lcdBuff[1] = lcdtab[10];
  lcdBuff[2] = lcdtab[10];

  lcdBuff[3] = lcdtab[16];
  lcdBuff[4] = lcdtab[16];
  lcdBuff[5] = lcdtab[16];
  //lcdBuff[4] = lcdtab[13];
  DisplayLCD_ht1621(lcdBuff,8);

}

//显示 对准符号|-
void Set_Aiming(void)
{

  //ClrLCDBuff(lcdBuff,8);
  //DisplayLCD_ht1621(lcdBuff,8);
  lcdBuff[0] = lcdtab[14];
  lcdBuff[1] = lcdtab[16];
  lcdBuff[2] = lcdtab[16];

  lcdBuff[3] = lcdtab[16];
  lcdBuff[4] = lcdtab[16];
  lcdBuff[5] = lcdtab[16];
  //lcdBuff[4] = lcdtab[13];
  DisplayLCD_ht1621(lcdBuff,8);

}
 //将长整数转换成BCD码,放入BCD缓冲区 ,限制6位
char uintTObcd(long in,uchar *sp)
{
 long intm,inb;
 uchar ch;
 char i,j;
 char * spa;
 spa = sp;
  inb = in;
  intm = 100000;
  j = 6;
  for(i=0;i<6;i++)  {
       ch = inb/intm;
       inb = inb%intm;
       intm /= 10;
       sp[i] = ch;

     }
     //if(i == 8) ch = 8;
  return ch;
  }

//将BCD码转换成显示段码放入LCD缓冲区
void PutLCDBuff(uchar* sp)
{
 char ch,i;
 uchar uch;
 char *spp;
 spp = sp;

  ClrLCDBuff(lcdBuff,8);

 for(i=0;i<6;i++)  {
   ch = spp[i];
      //前置0禁止显示

   lcdBuff[i] = lcdtab[ch];

   if(spp[0] == 0) {
       lcdBuff[0] = lcdtab[16];
       if(spp[1] == 0)
         lcdBuff[1] = lcdtab[16];
         }
   }

  set_p(1);  //P的亮灭
  set_m(1);  //M的亮灭
}

//上电显示符号
void main_start(void)
{
  lcdBuff[0] = lcdtab[0];
  lcdBuff[1] = lcdtab[0];
  lcdBuff[2] = lcdtab[0];
  //lcdBuff[3] = 0x01;
  //lcdBuff[4] = 0x01;
  //lcdBuff[5] = 0x01;
  //lcdBuff[6] = 0x01;
  set_m(1);
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -