houyawei 发表于 2025-2-5 16:18:51

32g怎么驱动HT1621B

<p>32g怎么驱动HT1621B</p>

神农鼎 发表于 2025-2-5 19:48:50



32F单片机 求教串口2同步模式0,启用SPI功能,是否还可以启动DMA | 可以已解决 - FOC,有ICache的 32F12K54 测试版块 国芯技术交流网站 - AI32位8051交流社区

DebugLab 发表于 2025-2-5 20:35:41

建议使用AI8H4K64TLCD直接驱动段式LCD

Ayb_ice 发表于 2025-2-6 08:53:59

网上找个51驱动的,简单改改可以用

houyawei 发表于 2025-2-6 09:08:17

Ayb_ice 发表于 2025-2-6 08:53
网上找个51驱动的,简单改改可以用

好的

houyawei 发表于 2025-2-7 15:09:35

<p>在网上找了个51代码移植过来,屏幕能点亮。<br />
但是只能给每个地址发0x01才会亮,每个地址的0x01对应会亮好几个部分<br />
有的部分很亮,有的部分亮的有点暗</p>
<p>清屏操作前,暗的部分会逐渐更暗</p>
<p><img alt="xiaoku" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/xiaoku.gif" title="xiaoku" /> 正常吗。</p>
<p>屏幕是咸鱼上买的二手屏,带ht1621的扩展板,没有屏幕资料。链接在屠龙刀上测试的。</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=83782"></video>
<p>驱动</p>
<p>https://blog.csdn.net/zhengshifeng123/article/details/56278814</p>
<p>头文件</p>
<pre><code>#ifndef        __HT1621B_DRV_H
#define        __HT1621B_DRV_H


#include        &quot;\..\library\config.h&quot;
#include        &quot;\..\library\STC32G_Delay.h&quot;


//#define _Nop() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
#define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com

#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器

#define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
#define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗

//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
sbit HT1621_DAT=P1^5; //HT1621数据引脚
sbit HT1621_CS=P1^6; //HT1621使能引脚
sbit HT1621_WR=P1^7; //HT1621时钟引脚
sbit P3_5=P3^5;//运行指示灯

u8 code Ht1621Tab[];//={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

u8 num_data[]={0xf5,0x05,0xb6,0x97,0x47,0xd3,0xf3,0x85,0xf7,0xd7};//0到9的字库

/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void Ht1621Wr_Data(u8 Data,u8 cnt);

/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无

说 明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(u8 Cmd);

/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
extern void Ht1621WrOneData(u8 Addr,u8 Data);

/********************************************************
HT1621测试程序,2008-2-13, 22:41:43
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
                  cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
         总数按8位计算
********************************************************/
void Ht1621WrAllData(u8 Addr,u8 *p,u8 cnt);

/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
版 本:1.0
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
extern void Ht1621_Init(void);

//清除缓存数据。清屏
extern void Ht1621CleanData(void);
//全部点亮
extern void Ht1621FullData(void);
#endif
</code></pre>
<p>c文件</p>
<pre><code>
#include &quot;ht1621b_drv.h&quot;

u8 code Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};



/******************************************************
写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void Ht1621Wr_Data(u8 Data,u8 cnt)
{
u8 i;
for (i=0;i&lt;cnt;i++)
      {
       HT1621_WR=0;
       NOP7();
       HT1621_DAT=Data&amp;0x80;
       NOP7();
       HT1621_WR=1;
       NOP7();
      Data&lt;&lt;=1;
   }
}

/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
返回说明:无

说 明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(u8 Cmd)
{
HT1621_CS=0;
NOP7();
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS=1;
NOP7();
}


/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(u8 Addr,u8 Data)
{
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr&lt;&lt;2,6); //写入地址数据
Ht1621Wr_Data(Data&lt;&lt;4,4); //写入数据
HT1621_CS=1;
NOP7();
}

/********************************************************
HT1621测试程序,2008-2-13, 22:41:43
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
                  cnt为写入数据总数
返回说明:无
说 明:HT1621的数据位4位,此处每次数据为8位,写入数据
         总数按8位计算
********************************************************/
void Ht1621WrAllData(u8 Addr,u8 *p,u8 cnt)
{
u8 i;
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr&lt;&lt;2,6); //写入地址数据
for (i=0;i&lt;cnt;i++)
      {
      Ht1621Wr_Data(*p,8); //写入数据
      p++;
       }
HT1621_CS=1;
NOP7();
}

//清除缓存数据。清屏
void Ht1621CleanData(void)
{
        u8 j;
        for(j=0;j&lt;16;j++)
        {
                Ht1621Tab=0x00;
        }

        Ht1621WrAllData(0,Ht1621Tab,16); //清除1621寄存器数据,即清屏
        printf(&quot;清屏\r\n&quot;);
}
//全部点亮
void Ht1621FullData(void)
{
        u8 j;
        for(j=0;j&lt;16;j++)
        {
                Ht1621Tab=0x01;
        }

        Ht1621WrAllData(0,Ht1621Tab,16); //全部点亮
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
版 本:1.0
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
delay_ms(2000); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);

}

</code></pre>
<p>主函数</p>
<pre><code>        Ht1621_Init();
        delay_ms(2000);

       
//        while(1)
//        {
        Ht1621CleanData();

        delay_ms(1000);

        Ht1621FullData();


        for (i=0;i&lt;12;i++)
                {
       
                t=0x01;
                Ht1621WrOneData(i,t);
                printf(&quot;DATA:0x%d:0x%x\r\n&quot;,i,t);
                P3_5=~P3_5;
                delay_ms(2000);
                Ht1621CleanData();

                }
               
</code></pre>

houyawei 发表于 2025-2-7 18:04:43

<p>可以了,解决了,把上面 u8code 里面的code 删掉,nop7改成nop40,,就全部正常了。图标可以全部显示,以及单独显示,亮度都一样。</p>
<pre><code>for (i=0;i&lt;12;i++)
        {
                t=0x01;
                for (j=0;j&lt;4;j++)
                {
                Ht1621WrOneData(i,t);
                printf(&quot;DATA:0x%d:0x%x\r\n&quot;,i,t);
                P3_5=~P3_5;
                t&lt;&lt;=1;
                delay_ms(3000);
                Ht1621CleanData();
                }
        }
        Ht1621FullData();
        delay_ms(4000);
        Ht1621CleanData();
</code></pre>
页: [1]
查看完整版本: 32g怎么驱动HT1621B