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

📄 0-9.c

📁 在LED点阵上循环显示0到9
💻 C
字号:
#include <at89x52.h>
#include <stdio.h>
#define uchar unsigned char

uchar i=0x00;
uchar j=0x00;
uchar k=0x00;
uchar t=0x00;	//计数初值
uchar keytemp;
uchar x; 
uchar pDisplay=0x00;    //扫描指针 

uchar count=0x00;
const uchar b[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//逐列扫描码 
const uchar c[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //逐行扫描码
char code a[3][24] = {
							 0x00,0x00,0x00,0x00,0x3F,0x00,0xE0,0xC0,
							 0x01,0x10,0x00,0x06,0x08,0x00,0x08,0x0C,
							 0x00,0x10,0xC2,0x03,0x20,0x42,0x02,0x60,
						 	 0x41,0x02,0x42,0x41,0x02,0x45,0xC1,0x73,
							 0x87,0x01,0x50,0x85,0x01,0x50,0x87,0x01,
							 0x50,0x85,0xC1,0x73,0x47,0x41,0x02,0x45,
							 0x41,0x02,0x42,0x42,0x02,0x20,0xC2,0x03,
						 	 0x20,0x0C,0x00,0x10,0x08,0x00,0x08,0x10,
							 0x00,0x06,0xE0,0xC0,0x01,0x00,0x3F,0x00
							 };
void device_init();
void display();
void next();

/****************************************************************************** 
名称:device_init 
功能:初始化端口、状态寄存器。打开定时器0,按方式1工作,设计数初值为0x3caf 
参数:无 
******************************************************************************/ 
void device_init()
{
   TL0=0xbf;                       //置定时器初值0xf0bf 
   TH0=0xf0; 
   TMOD=0x01;                      //设定定时器/计数器0工作方式为1 
   IE=0x82;                        //允许全局中断,允许定时器/计数器0溢出中断 
   TR0=0x01;                       //启动定时器/计数器0   
}


/****************************************************************************** 
名称:Base_Send 
功能:发送8bit到1个74HC595中  P1_5 控制线 P1_6 数据线 P1_7 时钟线 
参数:send_data,为欲发送的数据 
****************************************************************************** 
void base_send(uchar send_data)
{
	uchar index = 0x00;
	for (index=0x00; index<0x08; index++)
	{
		P1_7 = 0;
		P1_6 = send_data & (0x80 >> index);
		P1_7 = 1;
	}
}

 
/****************************************************************************** 
名称:display 
功能:将要显示的数码发送到缓冲区,等待扫描显示 
参数:无 
******************************************************************************/ 
void display() 
{ 
    //扫描的片选和数码发送出去 
    Transport(c[pDisplay%8],a[pDisplay]);  
    pDisplay++;     //扫描下一位 
    if(pDisplay==0x48) 
    { 
        pDisplay=0; 
    }     
} 
/****************************************************************************
名称:Transport 															
功能:发送3个字节到级联的6个74HC595中 										
参数:first,second 分别为欲发送到2个74HC595中的数据 						
*****************************************************************************/
void Transport(uchar first,uchar second,uchar third,uchar four,uchar five,uchar six) 									*	
{ 																			
    uchar i;

//发送第一个数据 															
    P3_5=0x00; 												
for(i=0x00;i<0x08;i++) 													
 { 																		
     P3_7=0x00; 															
  	 P3_6=first&(0x80>>i); 												
 	 P3_7=0x01; 															
 } 	
	 P3_5=0x01;	
																
 //发送第二个数据 
	 P3_2=0x00; 													
 for(i=0x00;i<0x08;i++) 													
 { 																			
     P3_4=0x00; 															
  	 P3_3=second&(0x80>>i); 												
	 P3_4=0x01; 															
 } 	
 	 P3_2=0x01; 

//发送第三个数据 
	 P2_7=0x00; 															
 for(i=0x00;i<0x08;i++) 												
 { 																			
     P3_1=0x00; 															
  	 P3_0=third&(0x80>>i); 												
	 P3_1=0x01; 															
 } 		
 	 P2_7=0x01;	

//发送第四个数据 
	 P2_4=0x00															
 for(i=0x00;i<0x08;i++) 												
 { 																			
     P2_6=0x00; 															
  	 P2_5=four&(0x80>>i); 												
	 P2_6=0x01; 															
 } 
 	 P2_4=0x01;

 //发送第五个数据 
	 P2_1=0x00;															
 for(i=0x00;i<0x08;i++) 												
 { 																			
     P1_3=0x00; 															
  	 P1_2=five&(0x80>>i); 												
	 P1_3=0x01; 															
 } 
 	 P2_1=0x01;

 //发送第六个数据 
	 P1_6=0x00;															
 for(i=0x00;i<0x08;i++) 												
 { 																			
     P2_0=0x00; 															
  	 P1_7=six&(0x80>>i); 												
	 P2_0=0x01; 															
 } 
	P1_6=0x01; 	
															
} 
																			
//******************************************************************************/

// --------------------------------------
void display()
{
      if(j>t%24)
       x=i;
      else
	  // x=(i+1)%0x15;
       x=(i+1)%0x18;

	  send(c[k],a[x][j]);

      j++;
      if(j==0x08)
      {
          j=0x00;
      }
      k++;
      if(k==0x08)
      {
          k=0x00;
      }
}
//---------------------------------------
void next()		//字符移动  
{
      t++;
      //if(t==(0x15)*8)
	  if(t==(0x03)*24) 
     	 {
      		t=0x00;	// 循环显示控制
      	  }
      i=t/24;    //行
      j=t%24;	//列
}

/****************************************************************************** 
名称:timer0_over 
功能:定时器/计数器0溢出中断服务程序,每1秒钟更新显示一次 
参数:无 
******************************************************************************/ 
void timeover()   interrupt 1
{
      count++;
      if(count==0x40)//0.1秒移动一次 
      {
       count=0x00;
       next();
      }

      display(); 	//调用显示函数 
      TL0=0xbf;  	//置初值0xf0bf 
      TH0=0xf0;
}



//---------------------------------------
void main()
{
      device_init();
      while(1)
      {
      }
}

⌨️ 快捷键说明

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