⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51_hd7279a.txt

📁 基于51单片机的HD7279控制数码管及键盘
💻 TXT
字号:
#include <reg51.h>

#define uchar unsigned char
#define uint  unsigned int
#define jdsu  15     //极大频率
#define jxsu  150    //极小频率        频率与速度成正比
#define chusu 80    //初始频率
#define sulv  2     //速率
//频率从2*1000~38*1000   初始频率20*1000  加减速率6*1000
//频率从 20*100~380*100    初始频率200*100   加碱速率60*100        

uchar code zheng[8]={0x05,0x04,0x06,0x02,0x0a,0x08,0x09,0x01};//顺时针
uchar code fan  [8]={0x01,0x09,0x08,0x0a,0x02,0x06,0x04,0x05};//逆时针


#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88

//*** ***
void init();
void keyint();
void long_delay(void); //
void short_delay(void); //
void write7279(unsigned char cmd, unsigned char dta);// HD7279
unsigned char read7279(unsigned char command);// HD7279
void send_byte(unsigned char out_byte); //
unsigned char receive_byte(void); //
void display();
void zhengzhuan();
void fanzhuan();
void jiansu();
void jiasu();
void delay(uchar temp);
void yunsu();
void xianshi();

 //*** I/O ***
sbit cs=P1^1; // cs at P1.4
sbit clk=P1^0; // clk P1.5
sbit dat=P1^3; // dat P1.2
sbit key=P3^2; // key P1.3
//****** HD7279A ******
uchar chkey,z,f,ja,jan,zhouqi,tch=1;
uint sudu, m;
bit bNewKey;
uchar dispdata[6]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a};

main()
{
    bit bt;
	bt=dat;
	sudu=chusu;
    init();	   
	bNewKey=0;
	display();
	while(1)
	{
	   if(bNewKey)
		{
		    
			xianshi();
			bNewKey=0;			
		}
		switch(chkey)
		{
		   case 1:
		   write7279((DECODE0+5),2);
		   write7279((DECODE0+4),0x0a);
		   z=chkey;
		   zhengzhuan();
		   break;
		   case 2:
		   write7279((DECODE1+5),0x0f);
	       write7279((DECODE0+4),0x0a);
		   z=chkey;
		   fanzhuan();
		   break;
		   case 3:
		   jiasu();
		   if(tch==1)
		   {tch=0;break;}
		   if(z==1)
		   {chkey=1;}
		   if(z==2)
		   {chkey=2;}
		   
		   break;
		   case 4:
		   jiansu();
		   if(tch==1)
		   {tch=0;break;}
		   if(z==1)
		   {chkey=1;}
		   if(z==2)
		   {chkey=2;}
		   
		   break;
		   case 5:
		   yunsu();
		   break;
		  
		}
	}
}

void xianshi()
{
               zhouqi=4000/sudu;
			   dispdata[0]=zhouqi%1000%100%10;
			   dispdata[1]=zhouqi%1000%100/10;
			   dispdata[2]=zhouqi%1000/100;
			   dispdata[3]=zhouqi/1000;
			   display();
}

void zhengzhuan()
{  
      
      uint i;
      for(i=0;i<8;i++)
      {    
	    
   	    m=sudu;  
        P0=zheng[i];
 	    delay(sudu);
      }
	  
     
}

void fanzhuan()
{
    
      uint i; 
      for(i=0;i<8;i++)
      {
	  
	    m=sudu;
        P0=fan[i]; 
		delay(sudu);     
      }
	  
}

void jiasu()
{
     
      for(;m>jdsu;)
      {
	     xianshi();
		 write7279((DECODE0+4),0x0c);
	     sudu=m;
		 if(chkey==1)
		 {tch=1;break;}
		 if(chkey==2)
		 {tch=1;break;}
		 if(chkey==5)
		 {tch=1;break;}
		 if(chkey==4)
		 {tch=1;break;}
	     if(z==1)
		 {zhengzhuan();}
         if(z==2) 
		 {  fanzhuan();}  
  	     m=m-sulv;
      }
	  
}

void jiansu()
{
      for(;m<jxsu;)
      {
	     xianshi();
		 write7279((DECODE0+4),0x0d);
	     sudu=m;
		 if(chkey==1)
		 {tch=1;break;}
		 if(chkey==2)
		 {tch=1;break;}
		 if(chkey==5)
		 {tch=1;break;}
		 if(chkey==3)
		 {tch=1;break;}
	     if(z==1)
		 {zhengzhuan();}
         if(z==2) 
		  { fanzhuan();}
     	 m=m+sulv;
      }
	  
}

void yunsu()
{
   xianshi();
   sudu=80;
   write7279((DECODE0+4),0x0b);
   if(z==1)
   {zhengzhuan();}
   if(z==2) 
   { fanzhuan();}
   
}


void delay(uchar temp)
{
  uint i,j;
  for(i=0;i<temp;i++)
  {
     for(j=0;j<100;j++);
  }
}

void init()
{
	PX0=0;       /*外部中断0优先级*/
	IT0=0;        /*外部中断0,低电平触发*/
	IE0=0;    /*外部中断0中断申请标志位*/
	EX0=1;      /*允许外部中断0*/
	EA=1;
    send_byte(CMD_RESET);
}

void keyint() interrupt 0 using 1
{
	unsigned char temp;
    temp=read7279(0x15);
	switch(temp)
	{
	    case 0x04:
		    chkey=7;//
			break;
		case 0x05:
		    chkey=4;
		    break;
	    case 0x06:
		    chkey=1;
			break;
		case 0x0c:
		    chkey=8;//
		    break;
	    case 0x0d:
		    chkey=5;
			break;
		case 0x0e:
		    chkey=2;//
		    break;
	    case 0x14:
		    chkey=9;
			break;
		case 0x15:
		    chkey=6;
		    break;
 	    case 0x16:
		    chkey=3;//
			break;
		case 0x0b:
		    chkey=0;
		    break;
 	    case 0x03:
		    chkey=10;//  "-"
			break;
		case 0x13:
		    chkey=11;//  "E"
		    break;
	}
    bNewKey=1;
}

void display()
{
    unsigned char j;
	for(j=0;j<6;j++)
	{
	    write7279((0x80+j),dispdata[j]);
	}
}

void send_byte( unsigned char out_byte)
{
    unsigned char i;
   // EA=0;
    
	clk=0;
    long_delay();
    for (i=0;i<8;i++)
    {
        if (out_byte&0x80)
        {
            dat=1;
        }
        else
        {
            dat=0;
        }
        clk=1;
        short_delay();
        clk=0;
        short_delay();
        out_byte=out_byte*2;
    }
    dat=0;
 //   EA=1;
}

unsigned char receive_byte(void)
{
    unsigned char i, in_byte;

    dat=1; //
    long_delay();
    for (i=0;i<8;i++)
    {
        clk=1;
        short_delay();
        in_byte=in_byte*2;
        if (dat)
        {
            in_byte=in_byte|0x01;
        }
        clk=0;
        short_delay();
    }
    dat=0;
    return (in_byte);
}


void long_delay(void)
{
    unsigned char i;
    for (i=0;i<0x30;i++);
}

void short_delay(void)
{
    unsigned char i;
    for (i=0;i<8;i++);
}

void write7279(unsigned char cmd, unsigned char dta)
{
    cs=0;
	long_delay();
    send_byte(cmd);
    send_byte(dta);
	cs=1;
}
unsigned char read7279(unsigned char command)
{
    cs=0;
    send_byte(command);
    return(receive_byte());
	cs=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -