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

📄 led595.c.bak

📁 智能数字电流表。双CPU工作
💻 BAK
字号:
/******************************************************************
 程序名:LED595
 功能:接收主机发来的数据,在LED上显示数据。
 创建时间:2004-3-29
 作者:华明 
 ******************************************************************/

//#include <stdio.h>
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int
#define byte uchar
#define word uint

//定义输出引脚
sbit SER  = P3^4;   //输入的数据
sbit SCLK = P3^5;   //串行输入,上升延有效
sbit RCLK = P3^7;   //送锁存器信号,上升延有效
sbit TRG  = P3^2;
sbit CLK =  P3^1;
sbit DATA = P3^0;
sbit SMG5 = P1^7;   
sbit SMG4 = P1^6;
sbit SMG3 = P1^5;
sbit SMG2 = P1^4;
sbit SMG1 = P1^3;

typedef struct _LEDNODE
{
	uint utime;    //改LED点亮的延时
	uint utime2;
	uchar uCode;   //段码
	uchar uSelect; //段选
}LEDNODE, *PLEDNODE;

//段码0,1,2,3,4,5,6,7,8,9
uchar code uLEDChar[] = {0x3f, 0x06, 0x9b, 0x8f, 0xa6, 0xad, 0xbd, 0x07, 0xbf, 0xaf};
//段选择码,分别为1、2、3、4、5
uchar code uSelChar[] = {0x7F, 0xBF, 0xDF,0xEF, 0xF7};
//uchar bGetData[5];   //读取的显示数据
LEDNODE LedNode[5] = {{2, 1000, 0x3f, 0x7F},
                      {2, 1000, 0x3f, 0xBF}, 
                      {2, 1000, 0x7f, 0xDF}, 
              	      {2, 1000, 0x3f, 0xEF}, 
                      {2, 1000, 0x3f, 0xF7}};

uint sparkle = 10;  //闪烁控制
uint uCmd = 'N';   //显示控制命令
uchar uSelIndex, uDataIndex;

//延时
void Delay(uint utime, uint utime2)
{ 
	uint utimein;
	while (utime --)
	{
		 utimein = utime2;
	      while(utimein --);
	}
}

//接收主机发来的数据
byte I_Receive(void)
{
	 byte uData = 0;
	 register byte i;
	 for (i = 0; i<8; i++)
	 {
	 	while (!CLK);    //等待,阻塞
	 	uData *= 2;
	 	if (DATA)  
	 	    uData ++;
     }
     return uData; 	
}


//接受主机发来的数据中断函数
/************************************
 通信协议:
 1.静态显示
   命令:'N'要求静态显示, 使sparkle = 1; 
 2.指定片闪烁
   命令:'S'要求某一片闪烁, sparkle = 10; 
   数据:段码、片选码
 3.全部闪烁
   命令:'A'要求全部闪烁, sparkle = 10; 
 4.传输连续5片段码
   命令:'T'要求传送5个段码 
 ************************************/
 
void ReadData(void) interrupt 0 
{
     
     uchar bData;
	 //禁止中断
	 EA = 0; 
	 
	 //读取命令
	 bData = I_Receive();
	 //分析命令
	 switch (bData)
	 {
	 case 'N':
		 uCmd = bData;
		 break;
	 case 'S':
		 break;
	 case 'A':
		 sparkle = 10;
		 uCmd = bData;
		 break;
	 case 'T':
	 {
	     uchar i;
		 for (i=0; i<5; i++)
		 //I_Receive();
              LedNode[i].uCode = uLEDChar[I_Receive()];
              Delay(1, 5);     		 
      }       	
		 break;
	 }
	 //LedNode[] = bData;
	 /*
     sparkle = 10;
     uSelIndex ++;
     uSelIndex = uSelIndex % 5;
     
     if (CLK)
         uDataIndex = 0;
         //uCmd = 'N';
     else
         uDataIndex = 1;
        // uCmd = 'A';
     //uDataIndex ++;
     uDataIndex = uDataIndex % 10;*/
	 //开中断
	 EA = 1;
     return;
}

//显示一片LED
void DisplayData(PLEDNODE pNode)
{
	uchar i, uData, utime, utime2;
	uData = pNode->uCode;
	P1 = 0xff; //消隐
	for (i=0; i<8; i++)
	{
		 SER = uData & 0x80;
		 uData = uData << 1;        //左移1位
		 SCLK = 0;
		 SCLK = 1;
	}
	RCLK = 0;
	RCLK = 1;
	P1 = pNode->uSelect;
    utime = pNode->utime;
    utime2 = pNode->utime2;
	Delay(utime, utime2);
}

void main()
{
	bit flag = 1;
   	uSelIndex = 0;
    uDataIndex = 0;
    
    //开外部中断0
    IE  = 0x81;  //外部中断0
	IT0 = 1;     //边沿触发   
	while(1)
	{
		switch (uCmd)
		{
		case 'N':          //普通显示
			{
				DisplayData(&LedNode[0]);
		    	DisplayData(&LedNode[1]);
	     		DisplayData(&LedNode[2]);
		    	DisplayData(&LedNode[3]);
		    	DisplayData(&LedNode[4]);
			}
			break;
		case 'A':         //闪烁显示  
		{
			//LED显示
			uchar i;
			if (flag)
			{
				//LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];
				i = sparkle;
				while (i --)
				{
		    		DisplayData(&LedNode[0]);
		    		DisplayData(&LedNode[1]);
	     			DisplayData(&LedNode[2]);
		    		DisplayData(&LedNode[3]);
		    		DisplayData(&LedNode[4]);
	    		}
	    		flag = 0;
			}
			else
			{
				P1 = 0xFF;  //关闭所有LED
	    		i = sparkle;
				Delay(i, 1000);
	    		flag = 1;	
    		}
		}
			break;
		case 'S':
		{
			//LED显示
			uchar i;
			if (flag)
			{
				LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];
				i = sparkle;
				while (i --)
				{
		    		DisplayData(&LedNode[0]);
		    		DisplayData(&LedNode[1]);
	     			DisplayData(&LedNode[2]);
		    		DisplayData(&LedNode[3]);
		    		DisplayData(&LedNode[4]);
	    		}
	    		flag = 0;
			}
			else
			{
	    		LedNode[uSelIndex].uSelect =  0xFF;
	    		i = sparkle - 1;
	    		while (i --)
				{
		    		DisplayData(&LedNode[0]);
		    		DisplayData(&LedNode[1]);
	     			DisplayData(&LedNode[2]);
		    		DisplayData(&LedNode[3]);
		    		DisplayData(&LedNode[4]);
	    		}
	    		flag = 1;	
    		}
		}
			break;
		
		case 'T':
			{
				DisplayData(&LedNode[0]);
		    	DisplayData(&LedNode[1]);
	     		DisplayData(&LedNode[2]);
		    	DisplayData(&LedNode[3]);
		    	DisplayData(&LedNode[4]);
			}
			break;
		}
			
		
	}	
	return;
}

⌨️ 快捷键说明

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