原创 用 STM32 来驱动ZLG7289(多键盘数码管驱动芯片)

2009-10-8 13:58 7633 5 6 分类: MCU/ 嵌入式

利用STM32来驱动ZLG7289(最多驱动8位数码管,64个独立键盘),驱动代码如下:


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


硬件连接:


PB12-> INT(浮空输入), PB13-> CS(出),PB14-> CLK(出), PB15-> DAT(出+输入浮空)


 


STM32端口配置:


GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15 ;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


  GPIO_Init(GPIOB, &GPIO_InitStructure);


 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  GPIO_Init(GPIOB, &GPIO_InitStructure);


 


ZLG7289驱动:


 


//**************** 7289读写相关操作 SPI通信程序驱动程序)*******************


 


void short_delay(void)             //确定SPI读写函数中数据延时,不得轻易更改


{


       u8 i;


       for (i=0;i<250;i++);


}


 


void send_byte( u8 out_byte)


{


       u8 i;


       GPIO_ResetBits(GPIOB, GPIO_Pin_13);  //7289失能cs=0


 


       for (i=0;i<8;i++)


       {


              if (out_byte&0x80)


              {


                     GPIO_SetBits(GPIOB, GPIO_Pin_15);     // dat="1";


              }


              else


              {


                     GPIO_ResetBits(GPIOB, GPIO_Pin_15);      //dat=0;


              }


                  GPIO_SetBits(GPIOB, GPIO_Pin_14);        // clk="1";


              short_delay();


                  GPIO_ResetBits(GPIOB, GPIO_Pin_14);      //clk=0;


              short_delay();


              out_byte=out_byte*2;    //实现左移


       }


 


       GPIO_ResetBits(GPIOB, GPIO_Pin_15);      //dat=0;


}


 


void write7279(u8 cmd, u8 dta)


{


       send_byte (cmd);


       send_byte (dta);


    GPIO_SetBits(GPIOB, GPIO_Pin_13); 


}


 


u8 read7279(u8 command)


{


    u8 temp;


       send_byte(command);


    temp = receive_byte();


    GPIO_SetBits(GPIOB, GPIO_Pin_13);  //细分器失能cs=1


       return(temp);


}


 


u8 receive_byte(void)


{


       u8 i,j, in_byte;


       GPIO_SetBits(GPIOB, GPIO_Pin_15);     // dat="1";


       short_delay();


       for (i=0;i<8;i++)


       {


               GPIO_SetBits(GPIOB, GPIO_Pin_14);        // clk="1";


              short_delay();


              in_byte=in_byte*2;


                j= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);


              if (j)


              {


                     in_byte=in_byte|0x01;


              }


              GPIO_ResetBits(GPIOB, GPIO_Pin_14);      //clk=0;


              short_delay();


       }


       GPIO_ResetBits(GPIOB, GPIO_Pin_15);      //dat=0;


       return (in_byte);


}


 


 


//********************** 7289驱动数码管程序(这些和具体项目相关)***********//


void DisplayData(u16 disData)             //最多显示5位数,取消高位零显示


{


       Bit flag = ZERO;


       u8 temp;


       


        //4位显示


       temp = disData/10000;


       if(temp!=0)


       {


              flag = ONE;


       }


       if(flag != 0)


       {


              write7279(DECODE0+4,temp);   //+4使指令码后三位加4,实现数码管位选


       }


       else


       {


              write7279(DECODE0+4,0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0f);      //无显示


       }


      


       


         //3位显示


       temp = disData/1000%10;


       if(temp!=0)


       {


              flag = ONE;


       }


       if(flag != 0)


       {


              write7279(DECODE0+3,temp);


       }


       else


       {


              write7279(DECODE0+3,0x0f);


       }


      


         //2位显示


       temp = disData/100%10;


       if(temp!=0)


       {


              flag = ONE;


       }


       if(flag != 0)


       {


              write7279(DECODE0+2,temp);


       }


       else


       {


              write7279(DECODE0+2,0x0f);


       }


      


         //1位显示


       temp = disData/10%10;


       if(temp!=0)


       {


              flag = ONE;


       }


       if(flag != 0)


       {


              write7279(DECODE0+1,temp);


       }


       else


       {


              write7279(DECODE0+1,0x0f);


       }


       


         //0位显示


       temp = disData%10;


       write7279(DECODE0,temp);


 


}


 


 


void DisplayDirection(DIRECTION dir)                                   //显示方向


{


       if(dir == RIGHT)                               //显示"BAC"


       {


              write7279(DECODE0+4,0x0f);               //无显示(清除该位数值)


              write7279(DECODE0+3,0x0f);               //无显示(清除该位数值)


              write7279(DECODE1+2,0x0b);              //B


              write7279(DECODE1+1,0x0a);              //A


              write7279(DECODE1,0x0c);                //C


       }


       else                                            //显示"FOR"


       {


              write7279(DECODE0+4,0x0f);               //


              write7279(DECODE0+3,0x0f);


              write7279(DECODE1+2,0x0f);


              write7279(DECODE1+1,0x00);


              write7279(DECODE1,0x0a);


       }


 


}


 


 


void display_common(void)                //状体标示图形显示


    {


      write7279(UNDECODE+7,0x4e);              


      write7279(UNDECODE+6,0x48);


      write7279(UNDECODE+5,0xf8);


    }


void display_steps(void)


    {


      write7279(UNDECODE+7,0x77);             


      write7279(UNDECODE+6,0x77);


      write7279(UNDECODE+5,0xf7);


    }


void display_direction(void)


    {


      write7279(UNDECODE+7,0x1f);             


      write7279(UNDECODE+6,0x1f);


      write7279(UNDECODE+5,0x9f);


    }


void display_position(void)


    {


      write7279(UNDECODE+7,0x3d);             


      write7279(UNDECODE+6,0x3d);


      write7279(UNDECODE+5,0xbd);


    }


void display_subdivision(void)


    {


      write7279(UNDECODE+7,0x4e);             


      write7279(UNDECODE+6,0x4e);


      write7279(UNDECODE+5,0xce);


    }

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1633888 2013-11-21 22:40

在nios里下载软件程序时,会出现 assertion "m_state == STATE_DEBUG" failed: file "nios2oci.cpp", line 157 Using cable "USB-Blaster [USB-0]", device 1, instance 0x00 Pausing target processor: not responding. Resetting and trying again: D:\altera\81\nios2eds\bin\nios2-download: line 594: 6300 Hangup nios2-gdb-server --instance 0 --tcpport none --wri te-pid ./Debug/nios2-download.pid ./Debug/GigaCard.elf.srec   这个问题在我调试的过程中偶尔会出现,而且是没有规律的,也正是这个问题,总是阻碍着我们前进的脚步,后来我们发现一个程序本来是可以下到onchip-memory中的,后来同样的程序无论如何都下不进去了,于是我们基本可以确定问题出在了硬件。对于有控制器的系统,晶振肯定是非常重要的,于是我们测晶振的输出是不是正常的,结果是有时正常有时不正常,这说明晶振虚焊了,经过我们小宝同学精心补焊,上面那个问题就再也没有出现过了。 你也太能扯了吧!你说晶振有问题我下载之前流水灯好好的,怎么可能呢?

用户377235 2012-10-15 18:22

在读取PIN15的时候好像没有从输出方式切换到输入方式。

用户234619 2010-4-25 20:17

写得好,有档次!

用户237194 2009-12-19 23:33

best

用户377540 2009-11-29 19:09

学习了

用户1397278 2009-10-11 19:09

好经验,值得投一票!

huli184_389376486 2009-9-27 01:07

好经验,值得投一票!

bitao1983_395643617 2009-5-22 08:54

我现在也在做3c25的调试,谢谢你分享的东西!!! 有机会可以聊一下:45952144

用户1579481 2009-5-14 16:48

不错不错

用户1103462 2009-5-14 11:13

能不能详细讲一下SDRAM的调试过程,特别是PLL配置部分?
相关推荐阅读
用户187843 2009-10-08 20:57
基于STM32芯片环形缓冲区的构建(IAR EWARM环境)
除了通信协议以外,设置数据缓冲区是完善不同速率,或不同系统之间通信的解决方案之一。本文设置了一个环形缓冲区,来接收PC上位机通过串口(COM口)发往STM32下位机的数据,具体代码如下:<?xm...
用户187843 2009-10-08 13:44
STM32芯片的时钟和端口配置
对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自...
用户187843 2009-10-08 13:19
电子类专业课程 中英问对照
https://static.assets-stash.eet-china.com/album/old-resources/2009/10/8/cce31911-8444-4259-a1b8-84aa...
用户187843 2009-10-08 12:52
vc++ 串口开发代码
应用程序中串口相关代码摘录如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> v...
用户187843 2009-10-08 12:37
VC++应用程序中 一种全局变量的实现方式
这是应用程序的公有数据类部分,变量的名具有针对性,若需要基于这个方式构造你所需要的公有类,将变量名或函数名替换即可。<?xml:namespace prefix = o ns = "urn:sc...
EE直播间
更多
我要评论
1
5
关闭 站长推荐上一条 /3 下一条