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

📄 ledhex.c

📁 嵌入式arm2104
💻 C
字号:
/****************************************************************************
* File:LEDHEX.C
* 功能:LED数码管显示0-F字符,同时控制LED1、LED2、LED3、LED4显示对应的16进行值。
* 说明:将跳线器JP8、JP9、JP11短接。
****************************************************************************/
#include  "config.h"


/* PWM周期及占空比设置值 */
#define  CYCLE_DATA				256 //256
#define  DUTY_CYCLE_DATA		128 //1

/* 设置 LED 长和宽*/
#define  W						32
#define  H						16

#define  CLK					(0x1<<0)
#define  STR					(0x1<<1)
#define  DR 					(0x1<<2)
#define  DG 					(0x1<<3)

#define	 THEGPIO  				0x000000ff
 /*
 void turarray(ObjLed,ResLed,aa) 
 uint32 *ResLed,*ObjLed,aa;
 {
    uint32 *pt,*qt,k,m,n;
      pt=ObjLed;
      qt=ResLed;
      n=aa;
  for(k=0,m=0;k<4;k++,m++)
     *(pt+(n+k)) = *(qt+(n+22-2*m));
  for(k=4,m=0;k<8;k++,m++)
     *(pt+(n+k)) = *(qt+(n+23-2*m));
  for(k=8,m=0;k<12;k++,m++)
     *(pt+(n+k)) = *(qt+(n+6-2*m));
  for(k=12,m=0;k<16;k++,m++)
     *(pt+(n+k)) = *(qt+(n+7-2*m));
     
  for(k=16,m=0;k<20;k++,m++)
     *(pt+(n+k)) = *(qt+(n+30-2*m));
  for(k=20,m=0;k<24;k++,m++)
     *(pt+(n+k)) = *(qt+(n+31-2*m));
  for(k=24,m=0;k<28;k++,m++)
     *(pt+(n+k)) = *(qt+(n+14-2*m));
  for(k=28,m=0;k<32;k++,m++)
     *(pt+(n+k)) = *(qt+(n+15-2*m));
  return;   
 }  
 
  void turarray(ObjLed,ResLed,n) 
   int ObjLed[],ResLed[],n;
  {
   int k,m;
   for(k=0,m=0;k<4;k++,m++)
     ObjLed[k+n] = ResLed[22+n-2*m]; 
   for(k=4,m=0;k<8;k++,m++)
     ObjLed[k+n] = ResLed[23+n-2*m]; 
   for(k=8,m=0;k<12;k++,m++)
     ObjLed[k+n] = ResLed[6+n-2*m]; 
   for(k=12,m=0;k<16;k++,m++)
     ObjLed[k+n] = ResLed[7+n-2*m]; 
     
   for(k=16,m=0;k<20;k++,m++)
     ObjLed[k+n] = ResLed[30+n-2*m]; 
   for(k=20,m=0;k<24;k++,m++)
     ObjLed[k+n] = ResLed[31+n-2*m]; 
   for(k=24,m=0;k<28;k++,m++)
     ObjLed[k+n] = ResLed[14+n-2*m]; 
   for(k=28,m=0;k<32;k++,m++)
     ObjLed[k+n] = ResLed[15+n-2*m]; 
   return;   
 } */
/****************************************************************************
* 名称:main()
* 功能:控制LED数码管显示,并控制LED1、LED2、LED3、LED4显示。
****************************************************************************/
int  main(void)
{  
   uint32 i,j,kk,k,m,p,q,nn,Temp,TempA,TempB,TempC;
   uint32 PTMP,PTMPH,LEDPIN[512],LEDP[512];
   static int LedTempA[64], LedTemp[64],LedTempB[64];
   static int LedData[64]={ 
/*中*/   0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,
         0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,        
/*文*/   0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,
         0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00,
          
/*测*///  0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
      //  0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,
/*试*///  0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
      //  0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00
      //    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
      //    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
      //    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
      //    0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
                           };                   
                         
     // 显示为16*16
   
   PLLCFG = 0x24;				//设置60MHz
   PLLCON = 0x03;
   PLLFEED = 0xaa;
   PLLFEED = 0x55;
   
   VPBDIV = 0x01;				// 全速(不分频)
	
   PINSEL0 = 0x00080000;        // 设置PWM6连接到P0.9管脚
   PINSEL1 = 0x00000000;		// 设置PWM5连接到P0.21管脚 0x00000400;
   PWMPR = 0x00;			    // 不分频,计数频率为Fpclk
   PWMMCR = 0x02;			    // 设置PWMMR0匹配时复位PWMTC
   PWMMR0 = CYCLE_DATA;    		// 设置PWM周期
   PWMMR6 = DUTY_CYCLE_DATA;	// 设置PWM占空比
   
   PWMLER = 0x41;			    // PWMMR0、PWMMR6锁存
   PWMPCR = 0x4000;				// 允许PWM6输出,单边PWM
   PWMTCR = 0x09;			    // 启动定时器,PWM使
   
   IODIR = THEGPIO; 				// I/O 端口的方向选择
   IOCLR = THEGPIO; 
  
   kk = 0;
   p = 0;

  
  IOSET = DG;
  IOSET = DR;
  for(k=0;k<64;k++)
  {  
       LedTempA[k]=0x00;
       LedTempB[k] = LedData[k];
  }
  
  while(1)
  {    
    for(k=0;k<64;k++)
      LedTempB[k] = LedData[k]; 
    for(nn=0;nn<36;nn++) 
    { 
      for(kk=0;kk<32;kk+=2)   //循环左移
      { 
         TempA=LedTempB[kk];     //0
         TempC=TempA;
         TempB=LedTempB[kk+1];
         Temp=TempA<<0x01;        
         if((TempB & 0x80)==0x80) 
           LedTempB[kk] = Temp|0x01; 
         else LedTempB[kk] = Temp;
         
         TempA=LedTempB[kk+1];   //1 
         TempB=LedTempB[kk+32];
         Temp =TempA << 1;     
         if((TempB & 0x80) ==0x80)    
           LedTempB[kk+1] = Temp|0x01;    
         else LedTempB[kk+1] = Temp;
         
         TempA=LedTempB[kk+32];  //32
         TempB=LedTempB[kk+33];
         Temp =TempA << 1;     
         if((TempB & 0x80) ==0x80)    
           LedTempB[kk+32] = Temp|0x01;    
         else LedTempB[kk+32] = Temp;
         
         TempA=LedTempB[kk+33];  //33
         Temp =TempA << 0x01;     
         LedTempB[kk+33] = Temp;     
              
        
         TempA=LedTempA[kk+33];  // 移入
         TempB=TempA;
         Temp =TempA<<0x01;
         if((TempC & 0x80)==0x80)
            LedTempA[kk+33]=Temp|0x01;
         else LedTempA[kk+33]=Temp;
         
         TempA=LedTempA[kk+32];
         TempC=TempA;
         Temp =TempA << 0x01;     
         if((TempB & 0x80) ==0x80)    
           LedTempA[kk+32] = Temp|0x01;    
         else LedTempA[kk+32] = Temp;
         
         TempA=LedTempA[kk+1];
         TempB=TempA;
         Temp =TempA << 0x01;     
         if((TempC & 0x80)==0x80)    
           LedTempA[kk+1] = Temp|0x01;    
         else LedTempA[kk+1] = Temp;
         
         TempA=LedTempA[kk];
         Temp =TempA << 0x01;     
         if((TempB & 0x80)==0x80)    
           LedTempA[kk] = Temp|0x01;    
         else LedTempA[kk] = Temp;
                         
         Temp = TempA = TempB = TempC =0;
      }  
   /*
      for(kk=0;kk<32;kk+=2)  //循环右移
      { 
         TempA=LedTempB[kk];
         TempC=TempA;
         Temp=TempA>>0x01;
         LedTempB[kk] = Temp;
         
         TempA=LedTempB[kk+1];
         TempB=TempA;
         Temp =TempA >> 0x01;     
         if((TempC & 0x01)==1)    
           LedTempB[kk+1] = Temp|0x80;    
         else LedTempB[kk+1] = Temp;
         
         TempA=LedTempB[kk+32];
         TempC=TempA;
         Temp =TempA >> 0x01;     
         if((TempB & 0x01)==1)    
           LedTempB[kk+32] = Temp|0x80;    
         else LedTempB[kk+32] = Temp;
         
         TempA=LedTempB[kk+33];
         TempB=TempA;
         Temp =TempA >> 0x01;     
         if((TempC & 0x01)==1)    
           LedTempB[kk+33] = Temp|0x80;    
         else LedTempB[kk+33] = Temp;
         
         TempA=LedTempA[kk];  // 移入
         TempC=TempA;
         Temp =TempA>>0x01;
         if((TempB & 0x01)==1)
            LedTempA[kk]=Temp|0x80;
         else LedTempA[kk]=Temp;
         
         TempA=LedTempA[kk+1];
         TempB=TempA;
         Temp =TempA >> 0x01;     
         if((TempC & 0x01)==1)    
           LedTempA[kk+1] = Temp|0x80;    
         else LedTempA[kk+1] = Temp;
         
         TempA=LedTempA[kk+32];
         TempC=TempA;
         Temp =TempA >> 0x01;     
         if((TempB & 0x01)==1)    
           LedTempA[kk+32] = Temp|0x80;    
         else LedTempA[kk+32] = Temp;
         
         TempA=LedTempA[kk+33];
         TempB=TempA;
         Temp =TempA >> 0x01;     
         if((TempC & 0x01)==1)    
           LedTempA[kk+33] = Temp|0x80;    
         else LedTempA[kk+33] = Temp;                  
         Temp = TempA = TempB = TempC =0;
     } 
   */
     for(k=0,m=0;k<4;k++,m++)
        LedTemp[k] = LedTempA[22-2*m]; 
     for(k=4,m=0;k<8;k++,m++)
        LedTemp[k] = LedTempA[23-2*m]; 
     for(k=8,m=0;k<12;k++,m++)
        LedTemp[k] = LedTempA[6-2*m]; 
     for(k=12,m=0;k<16;k++,m++)
        LedTemp[k] = LedTempA[7-2*m]; 
     
     for(k=16,m=0;k<20;k++,m++)
        LedTemp[k] = LedTempA[30-2*m]; 
     for(k=20,m=0;k<24;k++,m++)
        LedTemp[k] = LedTempA[31-2*m]; 
     for(k=24,m=0;k<28;k++,m++)
        LedTemp[k] = LedTempA[14-2*m]; 
     for(k=28,m=0;k<32;k++,m++)
        LedTemp[k] = LedTempA[15-2*m];  
 
     for(k=32+0,m=0;k<32+4;k++,m++)
        LedTemp[k] = LedTempA[32+22-2*m]; 
     for(k=32+4,m=0;k<32+8;k++,m++)
        LedTemp[k] = LedTempA[32+23-2*m]; 
     for(k=32+8,m=0;k<32+12;k++,m++)
        LedTemp[k] = LedTempA[32+6-2*m]; 
     for(k=32+12,m=0;k<32+16;k++,m++)
        LedTemp[k] = LedTempA[32+7-2*m]; 
     
     for(k=32+16,m=0;k<32+20;k++,m++)
        LedTemp[k] = LedTempA[32+30-2*m]; 
     for(k=32+20,m=0;k<32+24;k++,m++)
        LedTemp[k] = LedTempA[32+31-2*m]; 
     for(k=32+24,m=0;k<32+28;k++,m++)
        LedTemp[k] = LedTempA[32+14-2*m]; 
     for(k=32+28,m=0;k<32+32;k++,m++)
        LedTemp[k] = LedTempA[32+15-2*m];
    /*
     turarray(LedTemp,LedData,0); 
     turarray(LedTemp,LedData,32);  */     
     
     for(kk=0;kk<33;kk+=32)
     { 
        for(i=kk,p=0;i<kk+16;i++)  //H i<16 // for(i=k,p=0;i<k+8;i++)  //H i<16
	    {
	     
	       PTMP = LedTemp[i];
	       PTMPH = LedTemp[i+16];
	       if(p>=16) 
	          p = 0;
	       for(j=0;j<8;j++) //W 
	       {
	          q=j;   	   	    
	          LEDPIN[p] = ((PTMP & (0x1 << q) ) >> q) << 3;
	          if(LEDPIN[p]== 0x00)
	             IOSET = DG;
	          else	
	             IOCLR = DG;
	          LEDP[p] = ((PTMPH & (0x1 << q) ) >> q) << 2;
	          if(LEDP[p]== 0x00) 
	             IOSET = DR;
	          else
	             IOCLR = DR;
	          IOSET = CLK;
	          for(k=0;k<10;k++);
	          IOCLR = CLK;
	          p++;
	       }	      
	    }
     }   
	 IOSET = STR;
     for(k=0;k<10;k++);
	 IOCLR = STR;
	 	
	 PWMMR6 = 128;
	 PWMLER = 0x41;			    // PWMMR0、PWMMR6锁存
	 PWMPCR = 0x4000;				// 允许PWM6输出,单边PWM
	 PWMTCR = 0x09;			    // 启动定时器,PWM使
	 for(k=0;k<4000000;k++);
     } //nn++   	
  } //while
  return(1);
}

⌨️ 快捷键说明

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