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

📄 led595.c

📁 智能数字电流表。双CPU工作
💻 C
字号:
/******************************************************************
 程序名: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] = {{1, 1000, 0x3f, 0x7F},
                      {1, 1000, 0x3f, 0xBF}, 
                      {1, 1000, 0x7f, 0xDF}, 
              	      {1, 1000, 0x3f, 0xEF}, 
                      {1, 1000, 0x3f, 0xF7}};

uchar sparkle = 10;  //闪烁控制
uchar 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'要求静态显示; 
 2.指定片闪烁
   命令:'S'要求某一片闪烁; 
   数据:(1)片选下标(0-4), 如果超过了4,
           表示主机不再发送短码,
		   并将片选下标减去4,
	       表示当前要求闪烁的LED片;
		(2)若下标在0-4之间,则发送段码过来; 
 3.全部闪烁
   命令:'A'要求全部闪烁, sparkle = 10; 
 4.传输连续5片段码
   命令:'T'要求传送5个段码的编号;
 5.设置小数点
   命令:'P'要求在指定位置上加小数点
   数据:指定位置下标     
 ************************************/
 
void ReadData(void) interrupt 0 
{
     
     uchar bData, i;
	 //禁止中断
	 EA = 0; 
	 
	 //读取命令
	 bData = I_Receive();
	 //分析命令
	 switch (bData)
	 {
	 case 'N':
	 	 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
	     uCmd = bData;
		 break;
	 case 'S':
	 {
	 	 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
	 	 uSelIndex = I_Receive();    //得到位码 
	 	 if (uSelIndex > 4)   //超过了位数,表示不要求传送数据
	 	 	uSelIndex = uSelIndex - 4;
 	     else
 	     	LedNode[uSelIndex].uCode = I_Receive();  //得到段码
	 	 uCmd = bData;
	 }
		 break;
	 case 'A':
	 	 LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];  //恢复当前片为静止显示
	     sparkle = 10;
		 uCmd = bData;
		 break;
	 case 'T':
	 {
	 	 for (i=0; i<5; i++)
	          LedNode[4-i].uCode = I_Receive();	 
     }       	
		 break;
	 case 'P':
	     uSelIndex = I_Receive();    //得到位码
	     for (i=0; i<5; i++)
	          LedNode[i].uCode &= 0xBF;    //取消小数点
		 LedNode[uSelIndex].uCode |= 0x40;    //设置小数点 
		 break;
	 }
	 //开中断
	 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, 500);
	    		flag = 1;	
    		}
		}
			break;
		case 'S':
		{
			//LED显示
			uchar i;
			if (flag)
			{
				LedNode[uSelIndex].uSelect = 0xFF;
				i = 10;
				while (i --)
				{
		    		DisplayData(&LedNode[0]);
		    		DisplayData(&LedNode[1]);
	     			DisplayData(&LedNode[2]);
		    		DisplayData(&LedNode[3]);
		    		DisplayData(&LedNode[4]);
	    		}
	    		flag = 0;
			}
			else
			{
	    		LedNode[uSelIndex].uSelect = uSelChar[uSelIndex];
	    		i = 10;
	    		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 + -