打印

译码器CH452驱动LED数码管

[复制链接]
4063|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CH452是数码管显示驱动和键盘扫描控制芯片。
51单片机外围扩展CH452驱动位数码管动态显示如下电路图,主要器件为单片机,显示驱动芯片CH452,8个LED数码管。

基于CH452的数码显示电路驱动及显示部分

程序流程图

程序
*******************************************************************************
程序功能为51单片机通过三线串口操作CH452,CH452驱动8位数码管正常显示以及显示数据的更新。51单片机通过模拟CH452串口操作时序向CH452发送12位的标准格式数据,CH452根据接收到的12位数据执行相应功能操作以及数据更新。
*******************************************************************************
#define  uchar  unsigned char
#define  uint   unsigned  int
sbit  DIN=P0^0;                    //数据线
sbit  CLK= P0^1;                   //时钟信号线
sbit  LOAD= P02^2;                //数据加载控制线
uchar   subf[8]= {0x80, 0x80, 0x80, 0x80, 0x88, 0x88, 0x88, 0x88};     //显示数字缓冲区
//初始化数据定义区
#define  start0  0x02;
#define  start1   0x01;
#define  sysper0  0x04;
#define  sysper1  0x01;
#define  dspper0  0x05;
#define  dspper1  0x08;
#define  ficntr0   0x06;
#define  ficntr1   0x0f;
void delay(uint t)                    //延时函数,
{
uint i;
while(t--)
{
  for (i=0;i<125;i++)        /* 对于12M时钟,约延时1ms */
   {}
}
}
/* 主函数 */
void main(void)
{
    SP=0x70;
     EA=0
     start()
     display()
      while(1)
         {
           delay(1000);
           send12bit(0x03,0x03);     //显示数据右循环
           delay(10000);
send12bit(0x01,0x03);     //显示数据左循环
           delay(10000);
           send12bit(0x02,0x03);     //显示数据右移,空余位显“0”
           delay(10000)
           send12bit(0x00,0x03);     //显示数据左移,空余位显“0”
           delay(10000);
           newnum();              //数据更新
display();               //显示更新后的数据
           delay(10000);           //延时10s
}
}
//发送一个字节数据到CH452   
void  sendcode(uchar data)            
      uchar i, code
      _nop_( );
      for (i=0; i<8; i++)                //发送8个数据位
        {
          code=data&0x80;
          data=data>>1;
          if(code!=0)                   //待发送数据为1
              {
              DIN=1;                 //数据线为1
              CLK=0;                 //时钟正脉冲
              CLK=1;
}
          else
{
DIN=0;                 //数据线为0
              CLK=0;                 //时钟正脉冲
              CLK=1;
}
     }
    }
//发送字节低4位到CH452子程序
void  sen4bit (uchar data)            
   {
      uchar i, code
      _nop_( );
      for (i=0; i<4; i++)                //发送4个数据位
        {
          code=data&0x80;
          data=data>>1;
          if(code!=0)                   //待发送数据为1
              {
              DIN=1;                 //数据线为1
              CLK=0;                 //时钟正脉冲
              CLK=1;
}
          else
{
DIN=0;                 //数据线为0
              CLK=0;                 //时钟正脉冲
              CLK=1;
}
       }     
    }
//向CH452发送12位数据函数
void  send12bit(uchar addr, uchar num )
{
   LOAD=0;                       //数据传输开始
   _nop_( );
   sendcode(num);                 //发送数据
   _nop_( );
   send4bit(addr);                 //发送寄存器4位地址
_nop_( );
LOAD=1                      //数据加载
}
//CH452初始化子程序
void  start(void)
{
send12bit(start0,start1);                           
send12bit(sysper0,sysper1);
send12bit(dspper0,dspper1);
send12bit(ficntr0,ficntr1);   
}
//CH452数据寄存器更新子程序,即待显示数据缓冲区更新
void newnum(void)
{
for(i=0; i<8; i++)                   8次更新
{
subf=I                       //8个数据缓冲单元按顺序更新为01234567
}
}
//数据更新显示子程序
void display(void)                  
{
  uchar  addr  
  addr=0x08                                //8位数据寄存器地址从08开始
  for(i=0; i<8; i++)                            //8次数据更新
    {
    send12bit(addr,subf)                    //更新1位数据寄存器内容
    addr=addr+1                            //数据寄存器指向下一个
}

相关帖子

沙发
tianli1980| | 2012-4-13 16:42 | 只看该作者
串口器件为单片机的使用提供了极大的便利。不错

使用特权

评论回复
板凳
huangfeng33| | 2012-4-14 13:13 | 只看该作者
单片机通过占用3个I/O端口就可以实现8位数码管数据的显示输出。
学习了。:handshake

使用特权

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

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4194

帖子

31

粉丝