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