[应用相关]

stm32和1621驱动液晶显示不全的问题

[复制链接]
2605|25
手机看帖
扫描二维码
随时随地手机跟帖
zyf6095|  楼主 | 2017-11-18 13:46 | 显示全部楼层 |阅读模式
请教一下解决问题思路,我检查了硬件电路和程序,实在不知道哪里出了问题,希望大神指导一下我用是stm32配合1621芯片,1621供电电压是5V,1621的初始化和写数据函数都写好了,下载程序后进行调试发现段2显示不完整,如下图,进而发现规律:只要是com4上的段,必须点亮com3才可以显示。我的0到9都能正常显示,只有2显示不完整(因为2的D段前是C,C在2的时候不点亮),检查了2的字库,确定没错。1621的波形我不知道正常的是什么样子,但是我测得是梯度方波。不知道问题出在哪,怎么办
zyf6095|  楼主 | 2017-11-18 13:47 | 显示全部楼层
本帖最后由 zyf6095 于 2018-10-18 16:57 编辑

如图
显存.png
1.png

使用特权

评论回复
zyf6095|  楼主 | 2017-11-18 13:49 | 显示全部楼层
现在的状态
状态.jpg

使用特权

评论回复
airwill| | 2017-11-18 14:24 | 显示全部楼层
会不会是硬件问题, COM3/4 短路了?

使用特权

评论回复
zyf6095|  楼主 | 2017-11-18 14:46 | 显示全部楼层
airwill 发表于 2017-11-18 14:24
会不会是硬件问题, COM3/4 短路了?

应该不是,我单独点亮COM3时,com4不亮。。。玄学?不能把

使用特权

评论回复
airwill| | 2017-11-19 07:10 | 显示全部楼层
做技术的, 不能相信玄学.
一切问题都是有原因的.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zyf6095 + 1 很给力!
弓长月月鸟| | 2017-11-19 08:52 | 显示全部楼层
楼主可以通过一段一段的点亮,看看对应的段有没有操作。接下来你就好找原因了

使用特权

评论回复
junpeng324| | 2017-11-19 11:39 | 显示全部楼层
先排除是硬件的问题,然后就是你自己代码的优化。

使用特权

评论回复
zyf6095|  楼主 | 2017-11-19 18:45 | 显示全部楼层
弓长月月鸟 发表于 2017-11-19 08:52
楼主可以通过一段一段的点亮,看看对应的段有没有操作。接下来你就好找原因了 ...

唯独所有com4的位点不亮

使用特权

评论回复
zyf6095|  楼主 | 2017-11-19 18:46 | 显示全部楼层
airwill 发表于 2017-11-19 07:10
做技术的, 不能相信玄学.
一切问题都是有原因的.

您说得对,我再查查,肯定是某个地方出问题了 ,谢谢

使用特权

评论回复
734774645| | 2017-11-20 15:29 | 显示全部楼层
可能你这片子坏了呢?

使用特权

评论回复
zyf6095|  楼主 | 2017-11-20 18:21 | 显示全部楼层
734774645 发表于 2017-11-20 15:29
可能你这片子坏了呢?

重新焊了一片,无效。两个液晶都是一样的问题

使用特权

评论回复
caijie001| | 2017-11-20 19:29 | 显示全部楼层
这样子啊,可能是程序问题,先一个个调试啊

使用特权

评论回复
dzfansman| | 2017-11-20 22:17 | 显示全部楼层

地址定义的重复了吗?

使用特权

评论回复
dzfansman| | 2017-11-20 22:23 | 显示全部楼层

以前碰到过,起始地址定义重复擦出了。

使用特权

评论回复
zyf6095|  楼主 | 2017-11-21 14:32 | 显示全部楼层
dzfansman 发表于 2017-11-20 22:23
以前碰到过,起始地址定义重复擦出了。

#include "stm32f4xx.h"
#include "delay.h"
#include "usart2.h"
#include "usart1.h"
#include "HT1621.h"
/******************端口定义********************/
#define DATA1 PAout(4)
#define WR1   PAout(2)
#define RD1   PAout(1)
#define CS1   PAout(0)
u8 buffer1[20];    //接收串口缓冲寄存器
u16 USART_Sta;    //接收计数
int seg[11]={0x0a0f,0x0006,0x060d,0x040f,0x0c06,0x0c0b,0x0e0b,0x000e,0x0e0f,0x0c0f,0x0a0f};
/**************段码真值表****************/
void Seg1(void);
void Seg2(void);
void Seg3(void);
void Seg4(void);
void Seg5(void);
void Seg6(void);

void My_USART1_Init(void);  //串口1初始化

void DelayMS(unsigned int iMs);
void HT1621_Init(void);    //1621初始化

void Delay(unsigned char  us);
void HT1621_Port_Init(void);   //1621的GPIO初始化
void Ht1621Wr_Data(u8 Data,u8 cnt);   //向1621写 cnt个  位
void Ht1621WrOneData(u8 Addr,u8 Data);  //向1621的某地址写四个数据
void Ht1621WrAllData(void);    //点亮所有的显示段
void Ht1621WrCmd(u8 Cmd);    //1621写命令函数

//void read_data(u8 data,u8 len);
//u8 read_OneData(u8 addr);
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        My_USART1_Init();
        My_USART2_Init();
        My_USART3_Init();
        HT1621_Port_Init();
        HT1621_Init();
        while(1);
}

void Delay(unsigned char  us) //5,7,9
    {
     while(--us);
    }
               
void DelayMS(unsigned int iMs)
    {
     unsigned int i,j;
     for(i=0;i<iMs;i++)
     for(j=0;j<65;j++)
     {
      Delay(1);
     }
    }
               
void HT1621_Port_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_100MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}

void Ht1621Wr_Data(u8 Data,u8 cnt)
{
          
     u8 i;
           CS1=0;
     for (i=0;i<cnt;i++)
     {
       WR1=0;
       DelayMS(3);
      if((Data & 0x80)==0x80)
      {
         DATA1=1;
      }
      else
      {
         DATA1=0;
      }
      WR1=1;   
      DelayMS(3);
      Data<<=1;
     }
    }
void Ht1621WrOneData(uc8 Addr,u8 Data)       
{
     CS1=0;  
     DelayMS(1);
     Ht1621Wr_Data(0xa0,3); //D′è?êy?Y±ê??101
     Ht1621Wr_Data(Addr<<2,6); //D′è?μ??·êy?Y
     Ht1621Wr_Data(Data<<4,4); //D′è?êy?Y
     CS1=1;//
}
void Ht1621WrAllData()
{
     u8 i;
     CS1=0;//
     Ht1621Wr_Data(0xa0,3); //D′è?êy?Y±ê??101
     Ht1621Wr_Data(0x00<<2,6); //D′è?μ??·êy?Y
     for (i=0;i<16;i++)
     {
      Ht1621Wr_Data(0xff ,8);//0x00,8); //D′è?êy?Y
     }
     CS1=1;//
}
void Ht1621WrCmd(u8 Cmd)
{
     CS1=0;//HT1621_CS=0;
     DelayMS(1);
     Ht1621Wr_Data(0x80,4); //??????100
     Ht1621Wr_Data(Cmd,8); //??????
     CS1=1;//HT1621_CS=1;
}
void HT1621_Init(void)
{
        CS1=1;
        WR1=1;
        DATA1=1;
        DelayMS(20);
        Ht1621WrCmd(0x52);                        //BIAS
  Ht1621WrCmd(0x30); //?ú2?ê±?ó256K
  Ht1621WrCmd(0x00);                //SYDIS
  Ht1621WrCmd(0x0A);                //WDTDIS
  Ht1621WrCmd(0x02);                //SYSEN
  Ht1621WrCmd(0x06);                //LCDON
  DelayMS(20); //?óê±20ms
  Ht1621WrAllData();
       
}


void My_USART1_Init(void)
{
        GPIO_InitTypeDef a;
        USART_InitTypeDef  USRAT_Structure;                   //?????
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);                        //????2??
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);                //??GPIOA??
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);  //??2???UART2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);                //??3???UART2
       
        a.GPIO_Pin =GPIO_Pin_9|GPIO_Pin_10;
        a.GPIO_Mode=GPIO_Mode_AF;
        a.GPIO_OType =GPIO_OType_PP;
        a.GPIO_PuPd =GPIO_PuPd_UP;
        a.GPIO_Speed =GPIO_Speed_100MHz;
        GPIO_Init(GPIOA,&a);
       
       
        USRAT_Structure.USART_BaudRate =115200;//?????
        USRAT_Structure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//?????
        USRAT_Structure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//?????
        USRAT_Structure.USART_Parity=USART_Parity_No;//?????
        USRAT_Structure.USART_StopBits=USART_StopBits_1;//?????
        USRAT_Structure.USART_WordLength =USART_WordLength_8b;//?????
       
        USART_Init(USART1,&USRAT_Structure);//?????
        USART_Cmd(USART1, ENABLE);
       
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =1; //
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
        NVIC_Init(&NVIC_InitStructure); //       
       
       
}

void USART1_IRQHandler(void)
{

        u8 Res;

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //?óê??D??(?óê?μ?μ?êy?Y±?D?ê?0x0d 0x0a?á?2)
        {
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //?áè??óê?μ?μ?êy?Y
               
                if(Res==0x3b)                         //?óê?μ?á?0x3b
                {
                  USART_Sta=0;
                        Seg1();
                        Seg2();
                        Seg3();
                        Seg4();
                        Seg5();
                        Seg6();
                }
                else
                {
                        buffer1[USART_Sta]=Res;
                        USART_Sta++;
                }
        }
}

void Seg1(void)
{
    int Data,num1,num2;
          u8 m,n;
    Data=buffer1[0];
    num1=Data/10;
          num2=Data%10;
                m=(seg[num1]>>8)&0xff;
                n=(seg[num1]&0x00ff)&0xff;
                Ht1621WrOneData(0x00,m);
          Ht1621WrOneData(0x01,n);
       
          m=(seg[num2]>>8)&0xff;
                n=(seg[num2]&0x00ff)&0xff;
                Ht1621WrOneData(0x02,m);
          Ht1621WrOneData(0x03,n);
       
}
void Seg2(void)
{
    int Data,num1,num2;
          u8 m,n;
    Data=buffer1[1];
    num1=Data/10;
          num2=Data%10;
                m=(seg[num1]>>8)&0xff;
                n=(seg[num1]&0x00ff)&0xff;
                Ht1621WrOneData(0x04,m);
          Ht1621WrOneData(0x05,n);
       
          m=(seg[num2]>>8)&0xff;
                n=(seg[num2]&0x00ff)&0xff;
                Ht1621WrOneData(0x06,m);
          Ht1621WrOneData(0x07,n);
       
}

void Seg3(void)
{
    int Data,num1,num2;
          u8 m,n;
    Data=buffer1[2];
    num1=Data/10;
          num2=Data%10;
                m=(seg[num1]>>8)&0xff;
                n=(seg[num1]&0x00ffd)&0xff;
                Ht1621WrOneData(0x08,0x00);
          Ht1621WrOneData(0x09,0x00);
       
          m=(seg[num2]>>8)&0xff;
                n=(seg[num2]&0x00ff)&0xff;
                Ht1621WrOneData(0x0a,m);
          Ht1621WrOneData(0x0b,n);
       
}
void Seg4(void)
{
        int data,h,l;
       
        data=buffer1[4];
       
        h=(data&0xf0)>>4;
        if(buffer1[4]&0x01)
         l=l|0x08;
        else l=l&0x07;
        if(buffer1[3]&0x01)
                l=l|0x04;
        else l=l&0x0b;
        if(buffer1[3]&0x20)
                l=l|0x02;
        else l=l&0x0d;
        if(buffer1[3]&0x10)
                l=l|0x01;
        else l=l&0x0e;
       
        Ht1621WrOneData(0x0c,h);
        Ht1621WrOneData(0x0d,l);
}
void Seg5(void)
{
        int data,h,l;
       
        data=buffer1[3];
       

        if(buffer1[3]&0x08)
                h=h|0x02;
        if(buffer1[3]&0x02)
                h=h|0x08;
  if(buffer1[3]&0x04)
          h=h|0x04;
        if(buffer1[4]&0x08)
          h=h|0x01;
       
         l=l|0x08;
       
        if(buffer1[4]&0x02)
                l=l|0x04;
        else l=l&0x0b;
        if(buffer1[4]&0x04)
                l=l|0x02;
        else l=l&0x0d;

                l=l|0x01;
       
       
        Ht1621WrOneData(0x0e,h);
        Ht1621WrOneData(0x0f,l);
}
void Seg6(void)
{
        int data,h,l;
       
        data=buffer1[5];
       
        h=(data&0xf0)>>4;
        l=data&0x0f;

       
       
        Ht1621WrOneData(0x10,h);
        Ht1621WrOneData(0x11,l);
}







使用特权

评论回复
zyf6095|  楼主 | 2017-11-21 14:34 | 显示全部楼层
dzfansman 发表于 2017-11-20 22:23
以前碰到过,起始地址定义重复擦出了。

我自己没检查到您说的问题,写地址应该没错,程序我复制到一个文件里如上,您可以看一下吗

使用特权

评论回复
Brand2| | 2017-11-21 16:54 | 显示全部楼层
能不能单独点亮com4的位点

使用特权

评论回复
zyf6095|  楼主 | 2017-11-22 10:06 | 显示全部楼层
搞定了老铁们,是data信号传输后没有加1ms延时,导致com4无法成为高电平

使用特权

评论回复
zyf6095|  楼主 | 2017-11-22 10:06 | 显示全部楼层
在data置位后,加上dealyms(1);就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

0

粉丝