找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5130|回复: 15
打印 上一主题 下一主题
收起左侧

我用STC8G1K08单片机HT1621芯片屏老点不亮

  [复制链接]
跳转到指定楼层
楼主
ID:341833 发表于 2020-3-21 23:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STC8G1K08,HT1621段码屏驱动芯片屏老点不亮
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:341833 发表于 2020-3-21 23:57 | 只看该作者
#include "STC8G1K08.H"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

#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=P3^4; //HT1621数据引脚
sbit HT1621_CS=P3^6; //HT1621使能引脚
sbit HT1621_WR=P3^5; //HT1621时钟引脚
sbit P1_5=P1^5;
uchar code
Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

//delay us
void Delay(uchar us) //5,7,9
{
while(--us);
}


//delay ms
void DelayMS(uint iMs)
{
uint i,j;
for(i=0;i<iMs;i++)
for(j=0;j<65;j++) Delay(1);
}

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

}

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

说 明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
HT1621_CS=0;
_Nop();
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS=1;
_Nop();
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
返回说明:无
说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data<<4,4); //写入数据
HT1621_CS=1;
_Nop();
}
/********************************************************
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(uchar Addr,uchar *p,uchar cnt)
{
uchar i;
HT1621_CS=0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i<cnt;i++)
      {
        Ht1621Wr_Data(*p,8); //写入数据
        p++;
       }
HT1621_CS=1;
_Nop();
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
版 本:1.0
说 明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS=1;
HT1621_WR=1;
HT1621_DAT=1;
DelayMS(2000); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);
}

/**********************************/
void main()
{
uchar i,j,t;
Ht1621_Init(); //上电初始化LCD
DelayMS(1000); //延时一段时间
while(1)
{
//               Ht1621WrAllData(0,Ht1621Tab,16); //清除1621寄存器数据,暨清屏
               Ht1621WrAllData(0,Ht1621Tab,32); //清除1621寄存器数据,暨清屏
               for (i=0;i<32;i++)
                    {
                     t=0x01;
                     for (j=0;j<4;j++)
                          {
                           Ht1621WrOneData(i,t);
                           t<<=1;
                           t++;
                           P1_5=~P1_5;
                           DelayMS(5000);
                          }
                     }
}
  }
回复

使用道具 举报

板凳
ID:341833 发表于 2020-3-22 00:00 | 只看该作者
SEG18-SEG31  COM0-COM3
回复

使用道具 举报

地板
ID:721297 发表于 2020-4-2 21:30 | 只看该作者
我刚好正在研究这片子,也遇到点屏不亮的问题,后来仔细看官网手册发现一句很重要的话:
注意: 1、除 P3.0 和 P3.1 外,其余所有 I/O 口上电后的状态均为高阻输入状态,用户在
使用 I/O 口时必须先设置 I/O 口模式
就是他了,main函数里加一句:
P1M0 = 0x00;
P1M1 = 0x00;
P*M0 = 0x00;
P*M1 = 0x00;
.......把相应的IO口都设为准双向或推挽输出即可。
我是从STC15移植过来的程序,当然,也用有过STC8A,STC8F系列,没想到这STC8G系列有这种操作,也是折腾了一下午才明白,现在还卡在ADC模块,也和STC15系列不一样,头大中。想找ADC的例子看到这里有感而发,也是我踩到的坑,希望能帮到你。
回复

使用道具 举报

5#
ID:341833 发表于 2020-4-3 20:19 | 只看该作者
刀刀杀猪 发表于 2020-4-2 21:30
我刚好正在研究这片子,也遇到点屏不亮的问题,后来仔细看官网手册发现一句很重要的话:
注意: 1、除 P3. ...

你移植过来的程序,用HT1621的屏点亮了么?我进行了IO口端口配置,用HT1621屏就是没有点亮
回复

使用道具 举报

6#
ID:213173 发表于 2020-4-3 21:28 | 只看该作者
finezwl 发表于 2020-3-21 23:57
#include "STC8G1K08.H"
#include
#define uchar unsigned char

你的程序好像有点问题,给你一个示例参考:
  1. #include <STC89C5xRC.H>
  2. //宏定义LCD的操作命令
  3. #define ComMode  0x52    //4COM,1/3bias                1000 0101 0010
  4. //#define ComMode  0x50  //4COM,1/2bias          1000 0101 0000
  5. #define RCosc    0x30    //内部RC振荡器(上电默认)1000 0011 0000
  6. #define LCD_on   0x06    //打开LCD显示 偏压发生器1000 0000 0110
  7. #define LCD_off  0x04    //关闭LCD显示(上电默认)
  8. #define Sys_en   0x02    //系统振荡器开 1000 0000 0010
  9. #define Ctrl_cmd 0x80    //写控制命令   1000
  10. #define Data_cmd 0xa0    //写数据命令   1010
  11. // 端口声明
  12. sbit DIPIN=P3^7;
  13. sbit CLKPIN=P3^6;
  14. sbit CSPIN=P3^5;  

  15. /**-------------------------------------------------------------------------
  16. Name: SendBit_1621(送数据程序)
  17. ---------------------------------------------------------------------------*/
  18. void SendBit_1621(unsigned char sdata,unsigned char cnt) //sdata 的高cnt 位写入HT1621,高位在前
  19. {
  20.         unsigned char i;
  21.         for(i=0;i<cnt;i++)
  22.         {
  23.                 CLKPIN=0;         
  24.                 if(sdata&0x80)
  25.                         DIPIN=1;
  26.                 else DIPIN=0;
  27.                 CLKPIN=1;
  28.                 sdata<<=1;
  29.         }
  30. }
  31. /*-------------------------------------------------------------------------
  32. Name: SendCmd(送命令)
  33. 写入标志码"100"和9位comma命令,由于没有使用到更改时钟输出等命令
  34. 为了编程方便直接将command 的最高位写"0"
  35. ---------------------------------------------------------------------------*/
  36. void SendCmd_1621(unsigned char command)//写命令
  37. {//3位标志码 + 9位命令,共12位
  38.         CSPIN=0; //执行一个下降沿                                       
  39.         SendBit_1621(0x80,4);    //写入标志码"100"和9位comma命令的最高1位共4位
  40.         SendBit_1621(command,8); //写入9位comma命令的后8位,组成1000 xxxx xxxx
  41.         CSPIN=1;//送数完成后置高电平
  42. }

  43. /**-------------------------------------------------------------------------
  44. Name: Write_1621(送命令和数据程序)
  45. 写入标志码"101"和6位addr地址码和8位sdata显示数据。
  46. ---------------------------------------------------------------------------*/
  47. void Write_1621(unsigned char addr,unsigned char sdata,unsigned char len)//写数据
  48. {//3位标志码 + 6位写数据命令 + len(4/8)位数据,共13/17位
  49.         addr<<=2;//高6位有效
  50.         CSPIN=0; //执行一个下降沿
  51.         SendBit_1621(0xa0,3);                //写入标志码"101"    写数据命令101
  52.         SendBit_1621(addr,6);                //写入addr 的高6位   写数据命令xxxx xx
  53.         SendBit_1621(sdata,len);        //写入8/4位 sdata数据  len=8/4
  54.         CSPIN=1;//送数完成后置高电平
  55. }
  56. /**-------------------------------------------------------------------------
  57. Name: Init_1621(初始化1621)
  58. -------------------------------------------------------------------------*/
  59. void LCD_Init()                                                //初始化
  60. {//程序输入100 0+8=9位命令
  61.         SendCmd_1621(Sys_en);//Sys_en 0x02 系统振荡器开          100 0 0000 0010
  62.         SendCmd_1621(RCosc); //RCosc 0x30 内部RC振荡器(上电默认) 100 0 0011 0000
  63.         SendCmd_1621(ComMode);//4COM,1/3bias                     100 0 0101 0020
  64.         SendCmd_1621(LCD_on);//LCD_on 0x06 打开LCD显示 偏压发生器100 0 0000 0110
  65. }
  66. /*-------------------------------------------------------------------------
  67. Name: lcdwd1(点亮1621全部Seg)
  68. -------------------------------------------------------------------------*/
  69. void lcdwd1(unsigned char num)
  70. {
  71.         unsigned char i;
  72.         unsigned char addr=0;//寄存器起始地址0x00
  73.         for(i=0;i<num;i++)//num有效地址数
  74.         {
  75.                 Write_1621(addr,0xff,8);//addr为地址,0xff为数据,8为8位数据
  76.                 addr+=2;//顺延2个4位地址码
  77.         }
  78. }
  79. void main()
  80. {
  81.         LCD_Init();
  82.         while(1)
  83.         {
  84.                 lcdwd1(16); //全部点亮
  85.         }
  86. }
复制代码
回复

使用道具 举报

7#
ID:721297 发表于 2020-4-4 00:34 | 只看该作者
finezwl 发表于 2020-4-3 20:19
你移植过来的程序,用HT1621的屏点亮了么?我进行了IO口端口配置,用HT1621屏就是没有点亮

我不是用的HT1621的屏,是ST7567的12864屏移植到ST7032的1602屏上,现在配置一下IO口,都可以点亮。然后我的ADC还是不好用,接12864一切正常,接1602就不正常,都是一样的函数,就屏的驱动不一样,我就不明白了,明天再一段一段改,真蛋疼。
回复

使用道具 举报

8#
ID:394367 发表于 2020-4-13 20:20 | 只看该作者
刀刀杀猪 发表于 2020-4-2 21:30
我刚好正在研究这片子,也遇到点屏不亮的问题,后来仔细看官网手册发现一句很重要的话:
注意: 1、除 P3. ...

我也用了ADC,开始老是照搬STC15的ADC,不行。我老是想弄10位的ADC,不可以。后来,用8位的ADC可以了,但是采取的数值不是很准确,也算能用上了,毕竟我们采取的数值不要求精密。换DAC测试时,输出的电压老是偏低0.5V左右,没办法,不知道哪里问题,只好提高输出的电压来满足要求。
/**ADC初始化**/
void ADC_init()
{
    P3M0=0x04;          //设置P3.2口高四位为ADC口
        P3M1=0x04;
        P_SW2=0x80;
        CKSEL=0x00;
        P_SW2=0x00;
        ADCCFG=0x0f;        //设置ADC时钟为 系统时钟/2/16
        ADC_CONTR|=0x80; //开启AD转换电源
        _nop_();
        _nop_();
        _nop_();

}
uint GetAD(uchar ch)
{
    uint ADC_Value=0;       
        ADC_RES=0;
        ADC_CONTR|=ch;          //取频道号
        ADC_CONTR|=0x40;  //启动AD转换
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));

        ADC_CONTR &=~0x20;                  //清除完成标志       
        ADC_Value=ADC_RES;                  //读ADC高8位
        return ADC_Value;
}
..............
..............
     
                  OPA=GetAD(2);                //取P3.2口电压
                  OPA=OPA*5.15/256;
回复

使用道具 举报

9#
ID:721297 发表于 2020-4-14 08:37 | 只看该作者
FJ2018 发表于 2020-4-13 20:20
我也用了ADC,开始老是照搬STC15的ADC,不行。我老是想弄10位的ADC,不可以。后来,用8位的ADC可以了,但 ...

谢谢,我差不多找到原因了,5V供电下ADC有问题,不呈线性走,比如100、101、102然后突然跳到100,又跳到104,因为之前的12864屏用的3.3V供电,现在1602必须要5V供电,也是最近才想到电源问题,现在换成3.3V后ADC呈线性走了,但是现在还有低压时数据偏高,高压时数据偏低的问题,仍需努力解决。源码照搬STC15即可,STC15的ADC里有个P1ASF寄存器,我发现在STC8里没有,去掉后试了试,发现STC15也好使。ADCCFG更加玄学,不设置采样速度特别快(STC15里就没设置),设置0x0F速度慢,精度尚可,设置0x2F速度特别慢,而且采样的数据能飘到天上,比如100、101、104、108、113、然后又跌到106、107、110...,这东西真特么玄学。
回复

使用道具 举报

10#
ID:394367 发表于 2020-4-14 10:38 | 只看该作者
刀刀杀猪 发表于 2020-4-14 08:37
谢谢,我差不多找到原因了,5V供电下ADC有问题,不呈线性走,比如100、101、102然后突然跳到100,又跳到1 ...

我也测试到10位和12位的ADC采集了,只能精确到百分位,千分位还是有点跳动.
回复

使用道具 举报

11#
ID:80689 发表于 2020-4-15 20:50 | 只看该作者
STC8G1K08 自带LED驱动  你还用HT1621做什么呢?
回复

使用道具 举报

12#
ID:399111 发表于 2020-4-29 09:55 | 只看该作者
一样的情况
回复

使用道具 举报

13#
ID:770554 发表于 2020-6-10 14:53 | 只看该作者
finezwl 发表于 2020-3-21 23:57
#include "STC8G1K08.H"
#include
#define uchar unsigned char

#include "STC8G1K08.H"这个头文件怎么写的?
回复

使用道具 举报

14#
ID:303307 发表于 2021-11-7 09:19 | 只看该作者
你好楼主,我也遇到同样的问题,请问你这个问题解决了吗,STC8G1K17和STC8H3K64也不行,就是点不亮,用STC8A8k就没有问题,搞老好几天了,如果解决了分享一下,谢谢!
回复

使用道具 举报

15#
ID:624729 发表于 2023-4-18 13:56 | 只看该作者
wulin 发表于 2020-4-3 21:28
你的程序好像有点问题,给你一个示例参考:

多谢了,用你的代码点亮屏幕里, 非常感谢.
回复

使用道具 举报

16#
ID:1034262 发表于 2023-4-18 14:44 | 只看该作者
黑白LCD驱动都是简单的驱动,不管是HT1621,还是1602、12864,只要时序正确,没有驱动不了的,示波器看看信号、时序是否正常。
STC8系列的ADC的线性度非常高的,有抖动基本上是因为你的参考源或输入信号有纹波。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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