人在江南 发表于 2024-9-30 14:14:07

Ai8H2K32U驱动HT1621再驱动段码LCD

本帖最后由 DebugLab 于 2024-9-30 21:14 编辑

问题:想让第一位数字显示8,结果显示 hhhh
1、原理图:



2、代码:
LCD.C代码

#include <STC8.H>
#include "LCD.h"
#include <intrins.h>
sbit HT1621_CS =P1^3;
sbit HT1621_WR =P1^6;
sbit HT1621_Data = P1^5;
void Delay10ms(void)      //@11.0592MHz
{
      unsigned char data i, j;

      _nop_();
      _nop_();
      i = 144;
      j = 157;
      do
      {
                while (--j);
      } while (--i);
}
void Delay10us(void)      //@11.0592MHz
{
      unsigned char data i;

      _nop_();
      _nop_();
      i = 1;
      while (--i);
}

void WriteDatatoHT1621(unsigned char dat,unsigned char num)
{
    unsigned char i;
    for(i = 0 ; i<num; i++)
    {
      HT1621_WR = 0;
      Delay10us();
      if(((dat & 0x80)>>7)==1)
      {
            HT1621_Data = 1;
      }
      else
      {
            HT1621_Data = 0;
      }
      Delay10us();
      HT1621_WR = 1;
      Delay10us();
      dat<<=1;
    }
}
void WritetoHT1621(unsigned char addr,unsigned char dat,unsigned char mode)
{
    HT1621_CS = 0;
    WriteDatatoHT1621(mode,3);
    WriteDatatoHT1621(addr<<2,6);
    WriteDatatoHT1621(dat<<4,4);
    HT1621_CS = 1;
   // Delay10us();
}
void WriteCmctoHT1621(unsigned char cmd)
{
   
   
    HT1621_CS = 0;
    //Delay10us();
    WriteDatatoHT1621(0x80,3);
    WriteDatatoHT1621(cmd,8);
    HT1621_CS = 1;
   // Delay10us();
}
void HT1621_Init()
{
      P1M0 &= ~0xe8; P1M1 &= ~0xe8;

    HT1621_CS = 1;
    HT1621_WR = 1;
    HT1621_Data = 1;
    Delay10ms();
    WriteCmctoHT1621(SYSEN);
    WriteCmctoHT1621(RC256K);
    WriteCmctoHT1621(BIAS);
    WriteCmctoHT1621(LCDON);
    //WriteCmctoHT1621();
   
   
}

main.c

#include <STC8.H>
#include <stdio.h>
#include "UART.h"
#include "LCD.h"
bit flag1s = 0;


void Timer0_Init(void)                //2毫秒@11.0592MHz
{
      AUXR |= 0x80;                        //定时器时钟1T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x9A;                              //设置定时初始值
      TH0 = 0xA9;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
    ET0 = 1;
}


void main()
{
    int a = 0;
    float b=3.14;
    EA = 1;
    Timer0_Init();
    Uart_Init();
    HT1621_Init();
    while(1)
    {
      if(flag1s)
      {
            flag1s = 0;
            a++;
            printf("hello word!%d,%f\r\n",a,b);
            WritetoHT1621(0x00, 0xff,0x80);
            WritetoHT1621(0x01, 0xff,0x80);
         
      }
      
   
    }
}


void timer0_interrupt() interrupt 1
{
    static unsigned int tmr1s = 0;
    tmr1s ++;
   
    if(tmr1s ==500)
    {
      tmr1s = 0;
      flag1s = 1;
    }
}

人在江南 发表于 2024-9-30 14:16:17

补充:效果图

邮箱 发表于 2024-9-30 16:31:03

{:4_250:}

DebugLab 发表于 2024-9-30 21:22:08

LCD因为ITO走线不能交叉的原因,段码和数码管不一样,可能是数据不对

qepuemc 发表于 2024-10-11 07:05:44

求单文件代码。谢谢谢谢。

haiyang201 发表于 2024-10-11 17:28:18

核对液晶的逻辑图,看看是不是和代码不匹配

qepuemc 发表于 2024-10-24 08:08:11

代码崩溃!!!
/*****************************************************************************
*版权信息:深圳天微电子有限公司
*文 件 名:TM1621D-V1.0
*当前版本:V1.0
*MCU 型号:STC12C5608AD
*开发环境:Keil uVision4
*晶震频率:11.0592MHZ      
*完成日期:2013-08-07
*程序功能:1.LCD驱动:LCD屏所接SEG显示0~5
*免责声明:1.此程序为TM1621D驱动LCD演示程序,仅作参考之用。
            2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任            
********************************************************************************/
#include <COMM/STC8H.h>                                       //MCU头文件
#include "intrins.h"                                       //包含nop指令头文件

#define uchar unsigned char                                 //数据类型宏定义
#define uint unsigned int                                 //数据类型宏定义

#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义


/******************TM1621D模块命令定义*********************/
#define SYSDIS   0x00         //关系统振荡器和LCD偏压发生器      
#define SYSEN    0x02    //打开系统振荡器      

#define LCDOFF   0x04   //关LCD偏压
#define LCDON    0x06   //开LCD偏压
                                                         
#define RC       0x30   //内部RC振荡      

#define BIAS   0x52   //1/3偏压 4公共口      

/********************定义控制端口**********************/
sbit CS=P1^7;
sbit WRITE=P1^5;
sbit DATA=P1^6;

/********************定义数据*************************/
uchar code Smg={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e};//0~F字型码

uchar code Tab0={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏


/********************延时函数*************************/
void delay_nms(uint n)
{
   uint i;
   while(n--)
   for(i=0;i<500;i++);
}

/********************从高位写入数据*************************/
void Write_Data_H(uchar Data, uchar Cnt)         //Data的高cnt位写入TM1621D,高位在前
{
uchar i;
for(i=0;i<Cnt;i++)
{
WRITE=0;
if(Data&0x80)                                 //从最高位发送
    DATA=1;               
else
    DATA=0;
nop;
nop;
WRITE=1;
Data<<=1;
}
WRITE=0;
DATA=0;
}

/********************从低位写入数据*************************/
void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621D,低位在前
{
unsigned char i;
for(i=0;i<Cnt;i++)
{
   WRITE=0;
   if(Data&0x01)                                 //从低位发送
   DATA=1;
   else
   DATA=0;
      nop;
      nop;
      WRITE=1;
      Data>>=1;
}
WRITE=0;
DATA=0;
}

/********************写入控制命令*************************/
void WriteCmd(uchar Cmd)
{
CS=0;
nop;
Write_Data_H(0x80,4);   //写入命令标志100
Write_Data_H(Cmd,8);      //写入命令数据
CS=1;
nop;
}

/*********指定地址写入数据,实际写入后4位************/
void WriteOneData(uchar Addr, uchar Data)
{
CS=0;
Write_Data_H(0xa0,3);   //写入数据标志101
Write_Data_H(Addr<<2,6);//写入地址数据
Write_Data_L(Data,4);   //写入数据
CS=1;
nop;
}

/*********连续写入方式,每次数据为8位,写入数据************/
void WriteAllData(uchar Addr,uchar *p,uchar cnt)
{
uchar i;
CS=0;
Write_Data_H(0xa0,3);          //写入数据标志101
Write_Data_H(Addr<<2,6);      //写入地址数据
for(i=0;i<cnt;i++)                //写入数据
{
   Write_Data_L(*p,8);            
   p++;
}
CS=1;
nop;
}

/*******************TM1621D初始化**********************/
void TM1621D_init()
{
CS=1;
WRITE=1;
DATA=1;
nop;
delay_nms(1);                        
WriteCmd(BIAS);               //1/3偏压 4公共口
WriteCmd(RC);                         //内部RC振荡
WriteCmd(SYSDIS);               //关系统振荡器和LCD偏压发生器
WriteCmd(SYSEN);               //打开系统振荡器
WriteCmd(LCDON);               //开LCD偏压
}

void main()
{
                P1M0 &= ~0xe0; P1M1 &= ~0xe0; // P1.5 1.6 1.7准双向口用于操作1621

       
       
       
       
       
       
       
       
       
       
       

TM1621D_init();                //开机初始化
delay_nms(1);
WriteAllData(0,Tab0,16);         //LCD清显存
while(1)
{
WriteAllData(0xF8,Smg,0xAA);        //LCD SEG10到SEG21显示0~5
       
}
}






人在江南 发表于 2024-10-24 11:00:11

谢谢

qepuemc 发表于 2024-10-28 16:58:07

这个功能代码我已经调试了一周多了。是显示出来之后一周多了。依然不能改变显示效果。分不清是单片机的问题还是。1621的问题。还是屏幕的问题。单片机的问题吧,单片人已经把数据给了1621。1621这边只显示一种。感觉1621的问题比较大,但是怎么会呢?崩溃崩溃崩崩溃了。

zhaoliang3399 发表于 2024-10-31 20:54:17

段码LCD 占空比 偏压 工作电压 都对不
页: [1] 2
查看完整版本: Ai8H2K32U驱动HT1621再驱动段码LCD