• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

单片机IO直接驱动段式LCD详细说明+代码

武飞扬头像
对你不兼容
帮助1

常规原理说明可看其他博主,下面说一下调试过程遇到的问题点。

1.注意段式LCD的供电电压,选与供电电压接近的电压供电。驱动电压注意是是1/2偏压还是1/3偏压。

2.注意LCD的观察方向,12点方向还是6点方向,部分LCD有可能观察方向不同会有鬼影。

3.注意扫描频率,一般在50-250hz

4.COM口的上下拉电阻必须一致,不然可能出现鬼影

5.在SEG段不点亮的情况下,也要交替翻转盖引脚,用于消除鬼影。网上部分例程在不点亮时直接拉低,容易出现鬼影。

6.每个周期内的高低电平时间必须一样,因此在更新数据是切记在扫描完一轮周期以后。

下面附上  1/3Duty 1/2 BIAS的LED的调试代码
/*
MCU PIN        P17   P16   P15  P14 P13  P12  P11  P10  P27  P26  P25  P24   P23  P22  P21  P20

LCD PIN         1     2    3    4    5    6    7    8    9    10   11   12    13    14    15    
LCD PIN name   COM0 COM1  COM2 SEG1 SEG2 SEG3 SEG4 SEG5 SEG6 SEG7 SEG8 SEG9  SEG10 SEG11 SEG12 
               COM0   --   --   --   1D   --   --   2D  COL  --   3D    --    --    4D    --    
                     --   COM1   --   1E   1G   1C   2E   2G   2C   3E   3G   3C    4E    4G    4C         
                     --    --    COM2 1F   1A   1B   2F   2A   2B   3F   3A   3B    4F    4A    4B          


*/

/* 
  段码          //自定义每段的值            对应上述的PIN
  -    -A  --         //0x01  0x02  0x04         --   D   --     
    F      B       //0x08  0x10  0x20          E   G   C
  --   G  --         //0x40  0x80  0x100       F   A   B
    E      C
  --    D  --     
    
    
    
*/
#define  NUM0     0x01EF//A B C D E F    =  0x80 0x100 0x20 0x02 0x08 0x40
#define  NUM1     0x0120//B C   
#define  NUM2     0x019A//A B G E D 
#define  NUM3     0x01B2//A B G C D 
#define  NUM4     0x0170//F G B C 
#define  NUM5     0x00F2//A F G C D 
#define  NUM6     0x00ff//A F E D C G 
#define  NUM7     0x01A0//A B C
#define  NUM8     0x01FF//B C 
#define  NUM9     0x01F7//A B C D F G 

/*开启的位数
  1    2    3    4    5    6
 0x01 0x02 0x04 0x08 0x10 0x20
*/
#define WEI_NUM    0x03   //开启的位数//0x03=0x01 0x02  

//

unsigned int wei1_num=NUM0;
unsigned int wei2_num=NUM0;

void LCD_deal(void)     //定时器配置5ms扫描一次即可
{

    switch(ScanCoun)    //动态扫描
    {
      case 0:    //COM0     正向驱动

            COM1_F=1|(1<<6)|(1<<7);
            COM2_F=1|(1<<6)|(1<<7);        
            COM0_P=0;          //数据
          COM0_F=2;          
        
          if(WEI_NUM&0x01)  //第一位
            {
                if(wei1_num&0x01)   SEG1=1; else SEG1=0;
                if(wei1_num&0x02)   SEG2=1; else SEG2=0;
                if(wei1_num&0x04)   SEG3=1;    else SEG3=0;    
            }
          if(WEI_NUM&0x02)  //第二位
            {
                if(wei2_num&0x01)   SEG4=1;   else SEG4=0;
                if(wei2_num&0x02)   SEG5=1;   else SEG5=0;
                                    SEG6=1;        //对应的冒号常开
            }            

                
    break;
        
        case 3:    //COM0     反向驱动    
            COM1_F=1|(1<<6)|(1<<7);
            COM2_F=1|(1<<6)|(1<<7);    
            COM0_P=1;          
          COM0_F=2;          
          if(WEI_NUM&0x01)
            {
                if(wei1_num&0x01)   SEG1=0;else SEG1=1;
              if(wei1_num&0x02)   SEG2=0;else SEG2=1;
                if(wei1_num&0x04)   SEG3=0;else SEG3=1;
            }
          if(WEI_NUM&0x02)
            {
                if(wei2_num&0x01)   SEG4=0;else SEG4=1;
                if(wei2_num&0x02)   SEG5=0;else SEG5=1;
                //if(wei2_num&0x04)   
                                    SEG6=0;        //冒号
            }            
        
    break;        
         
            
        case 1:    //COM1     正向驱动    
            COM0_F=1|(1<<6)|(1<<7);  //除COM1输出外,其余COM设为输入    
            COM2_F=1|(1<<6)|(1<<7);    
            COM1_P=0; 
          COM1_F=2;        

          if(WEI_NUM&0x01)
            {
                if(wei1_num&0x08)   SEG1=1; else SEG1=0;
                if(wei1_num&0x10)   SEG2=1; else SEG2=0; 
                if(wei1_num&0x20)   SEG3=1;    else SEG3=0;
            }
          if(WEI_NUM&0x02)
            {
                if(wei2_num&0x08)   SEG4=1;else SEG4=0;
                if(wei2_num&0x10)   SEG5=1;else SEG5=0;
                if(wei2_num&0x20)   SEG6=1;else SEG6=0;
            }                
                        
    break;
        

        case 4:    //COM1     反向驱动
            COM0_F=1|(1<<6)|(1<<7);  //除COM1输出外,其余COM设为输入            
            COM2_F=1|(1<<6)|(1<<7);    
            COM1_P=1;          
          COM1_F=2;  

          if(WEI_NUM&0x01)
            {
                if(wei1_num&0x08)   SEG1=0;else SEG1=1;
                if(wei1_num&0x10)   SEG2=0;else SEG2=1;
                if(wei1_num&0x20)   SEG3=0;else SEG3=1;    
            }
          if(WEI_NUM&0x02)
            {
                if(wei2_num&0x08)   SEG4=0;else SEG4=1;
                if(wei2_num&0x10)   SEG5=0;else SEG5=1;
                if(wei2_num&0x20)   SEG6=0;else SEG6=1;        
            }    
                
    break;        
        

        case 2:
            COM0_F=1|(1<<6)|(1<<7);  //除COM2输出外,其余COM设为输入
            COM1_F=1|(1<<6)|(1<<7);
            COM2_P=0;      
          COM2_F=2;            
          if(WEI_NUM&0x01)
            {
                if(wei1_num&0x40)    SEG1=1;else SEG1=0;
                if(wei1_num&0x80)    SEG2=1;else SEG2=0;
                if(wei1_num&0x100)   SEG3=1;else SEG3=0;    
            }
          if(WEI_NUM&0x02)
            {
                if(wei2_num&0x40)    SEG4=1;else SEG4=0;
                if(wei2_num&0x80)    SEG5=1;else SEG5=0;
                if(wei2_num&0x100)   SEG6=1;else SEG6=0;    
            }            

        break;

        case 5: 
            COM0_F=1|(1<<6)|(1<<7);  //除COM2输出外,其余COM设为输入
            COM1_F=1|(1<<6)|(1<<7);
            COM2_P=1;                      
          COM2_F=2;        
          if(WEI_NUM&0x01)
            {
                if(wei1_num&0x40)    SEG1=0;else SEG1=1;
                if(wei1_num&0x80)    SEG2=0;else SEG2=1;
                if(wei1_num&0x100)   SEG3=0;else SEG3=1;        
            }
          if(WEI_NUM&0x02)
            {
                if(wei2_num&0x40)    SEG4=0;else SEG4=1;
                if(wei2_num&0x80)    SEG5=0;else SEG5=1;
                if(wei2_num&0x100)   SEG6=0;else SEG6=1;        
            }                
            
    break;                

        

    }
    
    ScanCoun ;//     下一位
  if(ScanCoun>5)    //扫描完一轮才更新数值,否则会出现鬼影
    {        
        ScanCoun=0;            
         switch(timer_value0/10)  
         {     
             case 0:  wei1_num=NUM0; break;
             case 1:  wei1_num=NUM1; break;
             case 2:  wei1_num=NUM2; break;
             case 3:  wei1_num=NUM3; break;
             case 4:  wei1_num=NUM4; break;
             case 5:  wei1_num=NUM5; break;
             case 6:  wei1_num=NUM6; break;
             case 7:  wei1_num=NUM7; break;
             case 8:  wei1_num=NUM8; break;
             case 9:  wei1_num=NUM9; break;
         }
         switch(timer_value)
         {     
             case 0:  wei2_num=NUM0; break;
             case 1:  wei2_num=NUM1; break;
             case 2:  wei2_num=NUM2; break;
             case 3:  wei2_num=NUM3; break;
             case 4:  wei2_num=NUM4; break;
             case 5:  wei2_num=NUM5; break;
             case 6:  wei2_num=NUM6; break;
             case 7:  wei2_num=NUM7; break;
             case 8:  wei2_num=NUM8; break;
             case 9:  wei2_num=NUM9; break;
         }         
         switch(timer_value00/100)
         {     
             case 0:  wei3_num=NUM0; break;
             case 1:  wei3_num=NUM1; break;
             case 2:  wei3_num=NUM2; break;
             case 3:  wei3_num=NUM3; break;
             case 4:  wei3_num=NUM4; break;
             case 5:  wei3_num=NUM5; break;
             case 6:  wei3_num=NUM6; break;
             case 7:  wei3_num=NUM7; break;
             case 8:  wei3_num=NUM8; break;
             case 9:  wei3_num=NUM9; break;
         }    
         switch(timer_value)
         //switch(timer_value/1000)
         {     
             case 0:  wei4_num=NUM0; break;
             case 1:  wei4_num=NUM1; break;
             case 2:  wei4_num=NUM2; break;
             case 3:  wei4_num=NUM3; break;
             case 4:  wei4_num=NUM4; break;
             case 5:  wei4_num=NUM5; break;
             case 6:  wei4_num=NUM6; break;
             case 7:  wei4_num=NUM7; break;
             case 8:  wei4_num=NUM8; break;
             case 9:  wei4_num=NUM9; break;
         }            
        
    }
    
    
}

只做记录,不足之处请指出,谢谢!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkkghb
系列文章
更多 icon
同类精品
更多 icon
继续加载