OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6400|回复: 5

跪求基于STM32F4主控HT1621B芯片驱动段码LCD的程序

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-7-12
在线时间
1 小时
发表于 2016-7-12 12:11:53 | 显示全部楼层 |阅读模式
1金钱
最近一直在弄段码LCD的显示程序,用HT1621B驱动,STM32F407ZGT6主控,总是什么都不显示!!!各位大神,有没有这块的程序分享一下啊! 不胜感激!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

112

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2015-10-29
在线时间
49 小时
发表于 2016-7-14 19:54:15 | 显示全部楼层

void lcddelay(uint32_t time)
{
        do
        {
                time--;
        }while(time>0);
}


void SendBit_1621(uint8_t data,uint8_t cnt) //data μĸßcntλD′èëHT1621,¸ßλÔúǰ
{
        uint8_t i;
        for(i=0;i<cnt;i++)
        {
                if((data&0x80)==0)
                {
                        CLR_DAT();
                }
                else
                {
                        SET_DAT();
                }
                Lcd1621delay();
                CLR_WR();
                Lcd1621delay();
                SET_WR();
                data<<=1;
        }
}

void SendDataBit_1621(uint8_t data,uint8_t cnt) //data μ&#196;μícnt&#206;&#187;D′è&#235;HT1621£&#172;μí&#206;&#187;&#212;ú&#199;°
{
        uint8_t i;
       
        for(i=0;i<cnt;i++)
        {
                if((data&0x01)==0)
                {
                        CLR_DAT();
                }
                else   
                {
                        SET_DAT();
                }
                Lcd1621delay();
                CLR_WR();
                Lcd1621delay();
                SET_WR();
                data>>=1;
        }
}

void SendCmd(uint8_t command)
{
        SET_WR();
        SET_DAT();
        CLR_CS();
        SendBit_1621(0x80,4); // D′è&#235;±ê&#214;&#190;&#206;&#187;&#194;&#235; 100 oí9&#206;&#187;command &#195;üá&#238;
        SendBit_1621(command,8); //
        SET_WR();
        SET_DAT();
        SET_CS();
}

void Write_1621(uint8_t addr,uint8_t data)
{
        SET_WR();
        SET_DAT();
        CLR_CS();
        SendBit_1621(0xa0,3);
        SendBit_1621(addr,6);
        SendDataBit_1621(data,4);
        SET_WR();
        SET_DAT();
        SET_CS();
}

void WriteAll_1621(uint8_t addr,uint8_t *p,uint8_t cnt)
{
        uint8_t i;
        SET_WR();
        SET_DAT();
        CLR_CS();
        SendBit_1621(0xa0,3);                //high to low
        SendBit_1621(addr,6);
        for(i=0;i<cnt;i++)
        {
                SendDataBit_1621(*p,4);                        //low to high
                p++;
        }
        SET_CS();
        SET_WR();
        SET_DAT();
        SET_CS();
}


市场上很多假冒的HT1621,应特别注意初始化IO口后将三个通信口拉高
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-7-15 23:03:21 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2016-11-4 09:24:47 | 显示全部楼层
你可以百度一下 有ht1621的官方c语言程序  我最近也在用ht1621驱动lcd  试了一下  可以用  就是stm处理速度比较快  所以你适当的加点延时
我用的是stm 32f103c8t6
。c文件
#include "lcd.h"
#include "delay.h"
#include "sys.h"
#define BIAS   0x4A           //0b1000 0100 1010  1/3duty 3com
#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  内部时钟RC256K
#define TONEON  0X12          //0b1000 0001 0010  打开声音 输出
#define TONEOFF 0X10          //0b1000 0001 0000 关闭声音输出
#define WDTDIS  0X0A        //0b1000 0000 1010  禁止看门狗
#define TONE_4K 0x80        //4k声音输出频率
#define TONE_2K 0xC0   
//函数名称:void Init_Ht1621(void)
//功能描述: HT1621-IO口初始化
void Init_HT1621(void){
       
        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
                                                          //JTAG口已经在beep配置中禁止掉了
        GPIOA->CRH&=0XF0000FFF;
        GPIOA->CRH|=0X03333000;//PD.3 2推挽输出
       
        GPIOA->ODR|=15<<11;          
}
//函数名称:void Ht1621_Init(void)
//功能描述: HT1621初始化
//说 明:初始化后,液晶屏所有字段均显示
//-----------------------------------------------------------------------------------------
void HT1621_Init(void){
         LCD_CS=1;//HT1621_CS=1;
         LCD_WR=1;//HT1621_WR=1;
         LCD_DATA=1;//HT1621_DAT=1;
         delay_ms(20); //延时使LCD工作电压稳定
         HT1621WrCmd(BIAS);         //1/3偏压 开3com口
         HT1621WrCmd(RC256); //使用内部振荡器
         HT1621WrCmd(SYSDIS); //关振系统荡器和LCD偏压发生器
         HT1621WrCmd(WDTDIS); //看门狗禁止
         HT1621WrCmd(SYSEN);  //打开系统 振荡器
         HT1621WrCmd(LCDON);  //打开LCD偏 压
         delay_ms(20); //延时一段时间
         HT1621WrAllData(0xff);        //0x00 清屏 0xff显示所有字段
         delay_ms(1000); //延时一段时间
         delay_ms(1000); //延时一段时间
         HT1621WrAllData(0x00);       
}
//函数名称:Ht1621Wr_Data()
//功 能:写数据函数,cnt为传送数据位数,数据传送为低位在前
void HT1621Wr_Data(uchar dat ,uchar dat1) {
           uchar i;
           for(i =0; i <dat1; i ++)
           {
                     if((dat&0x80)==0)
                           LCD_DATA=0;
                         else
                         LCD_DATA=1;
       
                         LCD_WR=0;
                         delay_ms(1);
                         LCD_WR=1;
                         dat<<=1;
           }
           delay_ms(5);
          
}
//函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
//功能描述: HT1621在指定地址写入数据函数
//参数说明:Addr为写入初始地址,Data为写入数据
//说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
//-----------------------------------------------------------------------------------------
void HT1621WrOneData(uchar Addr,uchar Data){

                 LCD_CS=0;
                 delay_ms(1);
                 HT1621Wr_Data(0xa0,3); //写入数据标志101
                 HT1621Wr_Data(Addr<<2,6); //写入地址数据
                 HT1621Wr_Data(Data<<4,4); //写入数据
                 LCD_CS=1;//
                 delay_ms(5);

}
//函数名称:void Ht1621WrOneNum(uchar Addr,uchar Num)
//功能描述: HT1621在指定地址写入一个数字(0-9)函数
//参数说明:Addr为写入初始地址,Num为写入数据
//说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
//-----------------------------------------------------------------------------------------
void HT1621WrOneNum(uchar Addr,uchar num){

     LCD_CS=0;//HT1621_CS=0;
     HT1621Wr_Data(0xa0,3); //写入数据标志101
     HT1621Wr_Data(Addr<<2,6); //写入地址数据
     HT1621Wr_Data(num,8);//写一个完整的数。就是连续写两个数。
     LCD_CS=1;//
         delay_ms(5);
}
//函数名称:void Ht1621WrAllData()
//功能描述: HT1621连续写入方式函数  0x00 清屏 0xff显示所有字段
//说 明:HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算
//-----------------------------------------------------------------------------------------
void HT1621WrAllData(u8 num){

         uchar i;
         LCD_CS=0;//
         HT1621Wr_Data(0xa0,3); //写入数据标志101
         HT1621Wr_Data(0x00<<2,6); //写入地址数据
         for (i=0;i<16;i++)
         {
          HT1621Wr_Data(num,8);//0x00,8); //写入数据
         }
         LCD_CS=1;//
         delay_ms(5);
}
//函数名称:void Ht1621WrCmd(uchar Cmd)
//功能描述: HT1621命令写入函数
//参数说明:Cmd为写入命令数据
//说 明:写入命令标识位100
//-----------------------------------------------------------------------------------------
void HT1621WrCmd(uchar Cmd){

         LCD_CS=0;//HT1621_CS=0;
         delay_ms(1);
         HT1621Wr_Data(0x80,4); //写入命令标志100
         HT1621Wr_Data(Cmd,8); //写入命令数据
         LCD_CS=1;//HT1621_CS=1;
         delay_ms(5);
}

。h文件
#ifndef __LCD_H
#define __LCD_H       
#include "sys.h"
#define uint       unsigned int
#define uchar      unsigned char

#define LCD_CS    PAout(11)  
#define LCD_RD    PAout(12)       
#define LCD_WR    PAout(13)       
#define LCD_DATA  PAout(14)  
void Init_HT1621(void);
void HT1621_Init(void);
void HT1621Wr_Data(uchar dat ,uchar dat1) ;
void HT1621WrOneData(uchar Addr,uchar Data);
void HT1621WrOneNum(uchar Addr,uchar num);
void HT1621WrAllData(u8 num);
void HT1621WrCmd(uchar Cmd);
#endif

主程序初始化显示所有的段码

void HT1621_Init(void){
         LCD_CS=1;//HT1621_CS=1;
         LCD_WR=1;//HT1621_WR=1;
         LCD_DATA=1;//HT1621_DAT=1;
         delay_ms(20); //延时使LCD工作电压稳定
         HT1621WrCmd(BIAS);         //1/3偏压 开3com口
         HT1621WrCmd(RC256); //使用内部振荡器
         HT1621WrCmd(SYSDIS); //关振系统荡器和LCD偏压发生器
         HT1621WrCmd(WDTDIS); //看门狗禁止
         HT1621WrCmd(SYSEN);  //打开系统 振荡器
         HT1621WrCmd(LCDON);  //打开LCD偏 压
         delay_ms(20); //延时一段时间
         HT1621WrAllData(0xff);        //0x00 清屏 0xff显示所有字段
         delay_ms(1000); //延时一段时间
         delay_ms(1000); //延时一段时间
         HT1621WrAllData(0x00);       
}
回复

使用道具 举报

22

主题

271

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
405
金钱
405
注册时间
2019-3-21
在线时间
107 小时
发表于 2019-6-12 10:41:38 | 显示全部楼层
sodermalm 发表于 2016-11-4 09:24
你可以百度一下 有ht1621的官方c语言程序  我最近也在用ht1621驱动lcd  试了一下  可以用  就是stm处理速度 ...

为什么我的屏还是点亮不了
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-8-27 14:37:39 | 显示全部楼层
1599064432 发表于 2019-6-12 10:41
为什么我的屏还是点亮不了

在主函数里面记得要初始化ht1621的函数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 06:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表