TM1638 DataSheet的样例接了10个共阳数码管,以下是TM1638驱动10个数码管的程序,当然C文件会议附件的形式上传,请自行下载。

附件:TM1638驱动共阳极数码管

#include <reg52.h>               //MCU头文件
#include <intrins.h>             //包含nop指令头文件

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

/********************定义控制端口**********************/
sbit DIO=P1^0;                     //定义DIO  
sbit CLK=P1^1;                     //定义CLK  
sbit STB=P1^2;                     //定义STB

/***********************
        定义数据
***********************/
unsigned char Key[5]={0};        //为存储按键值定义的数组  
const unsigned char BCD_LABLE_ALL[]={0xbf,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};

unsigned char BCD_LABLE_anode[16] = {0}; //用于保存共阳显示数据  TM1628显示寄存器中的数据 就是数组中的值

unsigned char cmd_dis_mode = 0x8f;  
/***************延时函数**************/
void delay_nms(unsigned int n)  
{
  unsigned int i;
  while(n--) 
    for(i=0;i<550;i++);
}
void delay_nus(unsigned int n)  
{
  unsigned int i;
  while(n--) 
    for(i=0;i<50;i++);
}

/***************发送8bit数据,从低位开始**************/
void send_8bit(unsigned char dat)  
{
  unsigned char i;
  for(i=0;i<8;i++)
  {    
    CLK=0;
    if(dat&0x01) 
      DIO=1;
    else 
      DIO=0;
     _nop_();
     _nop_();
     _nop_();

     CLK=1;
     dat>>=1;

  }
    CLK=0;
    DIO=0;
}

/******************发送控制命令***********************/
void send_command(unsigned char word)  
{
 STB=1;
 _nop_();

 STB=0;
 send_8bit(word);

}

void Write_String(unsigned char *p,unsigned char cnt) //cnt最大14byte  
{ 
 unsigned char i; 

 for(i=0;i<cnt;i++)    //连续写入数据 
 { 
    send_8bit(*p++);
 }  
}

/***************************************************
8段数码显示的共阴数据到共阳数据的转换 外加数码位移  
--  实质是一个数组的转置 并且只改变位
****************************************************/
void NE_C(unsigned char ydata,unsigned char cnt)  
{
    char i=0,j=0;
    if(cnt>0)
    {
       if(cnt>8)
       {
           //myflag |= 0x01;
               cnt = cnt -9;
                 for(i=1;i<16;i=i+2)
                {

                    if(ydata&0x01 == 0x01)
                    {
                        BCD_LABLE_anode[i] |=  (0x01<<cnt);        
                    }
                    else
                    {
                        BCD_LABLE_anode[i] &= ~(0x01<<cnt); //清零
                    }
                    ydata = (ydata>>1);
                }  

       }
       else
       {
          cnt = cnt -1;
           for(i=0;i<16;i=i+2)
            {

                if((ydata&0x01) == 0x01)
                {
                    BCD_LABLE_anode[i] |=  (0x01<<cnt);        
                }
                else
                {
                    BCD_LABLE_anode[i] &= ~(0x01<<cnt);//清零
                }
                ydata = (ydata>>1);
             }  
       } 
    }       
}

/************************************************************************************
按照SEG1-SEG8 分别表示1-8位数码管,函数参数含义如下:
cnt1 :表示第cnt1个数码管;  
number: 表示要显示的数据,如number=1 显示数字1;  
display(0,1): 表示在第1位数码管上显示0.  
BCD_LABLE_ALL[0]:表示0x3f, 即共阴极数据0,客户可以根据需要建立数组填入自己所需数据即可  
************************************************************************************/
void display(unsigned char number,unsigned char cnt1)  
{

         NE_C(BCD_LABLE_ALL[number],cnt1);                  //数据变换
         send_command(0x40);                                               //设置数据命令:普通模式、地址自增1,写数据到显存
         send_command(0xc0);                                               //设置显示地址命令:从00H开始
         Write_String(BCD_LABLE_anode,16);                 //连续写入 16个字节 因为1629系列总共有16个显存  
         STB=1;
        send_command(cmd_dis_mode);
}   


void display_fixedadd(unsigned char number,unsigned char cnt1)  
{    
         NE_C(BCD_LABLE_ALL[number],cnt1);
         send_command(0x44);   //设置数据命令:普通模式、地址固定模式,写数据到显存
        send_command(0xc2);
         send_8bit(0x00);//在02地址写00
         STB=0;
         send_command(cmd_dis_mode);
         STB=0;

}                                        

/****************读取按键值并存储*******************/
void read_key()  
{
    unsigned char i,j;
    send_command(0x42);
    DIO=1;                  //释放DIO
    for(j=0;j<4;j++)
    {
        for(i=0;i<8;i++)
        {
            CLK=0;
            Key[j]=Key[j]>>1;
            CLK=1;
            if(DIO)
                Key[j]=Key[j]|0x80;
                nop;
        }
        nop;
        nop;
    }
    CLK=0;
    DIO=0;

    STB=1;
}

void key_process()  
{  
   if(Key[0]!=0x00)
   { 
    if((Key[0]==0x08)){display(1,1);} //K0与SEG1按键按下,数码管显示数字1
    if((Key[0]==0x04)){display(2,1);} //K1与SEG1按键按下,数码管显示数字2
   }
    if(Key[1]!=0x00)
   { 
    if((Key[1]==0x08)){display(3,1);} //K0与SEG3按键按下,数码管显示数字3
    if((Key[1]==0x04)){display(4,1);} //K1与SEG3按键按下,数码管显示数字4
   } 
}

void main()  
{
//  //从第一个到第八个数码管一次 显示 1 2 3 4 5 6 7 8  
    for(i=1;i<=8;i++)
    {   
        display(i%10,i);   
    }  
    //读按键
    while(1);
    {       
            read_key();
            key_process();
            delay_nms(5);   
    }
}