📄 led595.c.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 + -