×
单片机 > 单片机程序设计 > 详情

PIC单片机驱动TM1616源程序

发布时间:2020-08-21 发布时间:
|

/*本程序适用于没有SIP功能的单片机添加SIP发送功能*/

#include

__CONFIG(0x1832);        

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define clk P10                                        //定义时钟管脚

#define clk RC3         //定义时钟管脚

#define dio RC5        //定义数据管脚

#define stb RC2        //定义片选管脚

//#define nop _nop_();

#define uchar unsigned char

#define uint  unsigned int

const char TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

                    0x77,0x7c,0x39,0x5e,0x79,0x71,0xE0,0x5C,0x3E,0x78,

                    0x37, 0x76, 0x38, 0x01, 0x41, 0x49,0x00};


unsigned char store_bank[4];  //建立数据列队3

//初始化函数体

void init()

   {

     ADCON1=0X07;

     TRISA=0X30;

     TRISB=0X03;

     TRISC=0X10;

     TRISD=0X00;

     PORTD=0XFF;

//    SSPSTAT=0X80;

//    SSPCON=0X31;

     INTCON=0X00;

     PIR1=0X00;

     stb=0;

   }

//---------------------TM1616发送1字节数据子程序------------------------------------------

void tm1616write(uchar wr_date)

{

        uchar i;

        stb =0; //片选管脚

        NOP();

        NOP();

        for(i=0;i<8;i++)//循环运行8次

        {

                clk=0;  //时钟管脚

                NOP();

                NOP();

                if(wr_date&0x01!=0)//查看数据的最小位是否为0

                {

                        dio=1; //数据管脚

                }

                else

                {

                        dio=0;//数据管脚

                }

                NOP();

                NOP();

                clk=1;  //时钟管脚

                NOP();

                wr_date=wr_date>>1;//数据左移1位

        }        

}

//-------------------------TM1616采用固定地址显示数据子程序---------------------------------

void tm1616show(uchar data1,uchar data2,uchar data3,uchar data4)

{       uchar j;

        stb = 1;  //片选管脚

        clk = 1;  //时钟管脚

        dio = 1;  //数据管脚

        tm1616write(0x00); //显示模式设置,设置为4个GRID,7个SEG

        stb=1;      //片选管脚       //显示模式设置完毕,STB置1

        tm1616write(0x44); //数据命令设置,设置普通模式、固定地址、写数据到显示寄存器

        stb=1;   // 片选管脚//数据命令设置完毕,STB置1

                tm1616write(0xC0); //设置显示地址1

                tm1616write(data1);//传输显示数据1

                stb=1;     //片选管脚        //显示数据1发送完毕STB置1

                tm1616write(0xC2);//设置显示地址1

                tm1616write(data2);//传输显示数据1

                stb=1;     //片选管脚        //显示数据1发送完毕STB置1

                tm1616write(0xC4); //设置显示地址1

                tm1616write(data3);//传输显示数据1

                stb=1;     //片选管脚        //显示数据1发送完毕STB置1

                tm1616write(0xC6); //设置显示地址2

                tm1616write(data4);//传输显示数据1

                stb=1;      //片选管脚       //显示数据1发送完毕STB置1

        tm1616write(0x8F);         //控制命令设置,设置显示开、显示最亮

        stb=1;              //片选管脚      //显示数据发送完毕STB置1

}

//T毫秒延时程序'''''''''''''''''''''''''''''''''''''''''''

void  DELAY(unsigned int t )              //延时程序

    {unsigned int y;

     while(t)

     { 

     for(y=98;y--;);     //延时

     t--;

    }}

//运算------------------------------------

void count(uint y)

  {uchar ca;

   ca=y/0x64/0xa;    //求千位数/100=10数据/10等于一个千位数字 余数扔掉

   store_bank[3]=TABLE[ca];

   ca=(y/0x64)%0xa;    //千位数/100留下百位以下数据

   store_bank[2]=TABLE[ca];

   ca=(y%0x64)/0xa;     //求显示的个位

   store_bank[1]=TABLE[ca];

   ca=(y%0x64)%0xa;     //求显示的个位

   store_bank[0]=TABLE[ca];

  }           

//TM1616主函数体---------------------------------------------

void main(void)

{ uint k;

   init();

        while(1)

        { for(k=0;k<9999;k++)

              {count(k);

                tm1616show(store_bank[3],store_bank[2],store_bank[1],store_bank[0]);  //带数据 

                 DELAY(50);

              }   


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用PIC16F627制作的可调倒计时提醒器