1:按下s1后, LED 1、3, 2、4 3,5, 4、6 5、7, 6、8依次两两亮灯
按照上述依次循环 间隔1秒(期间数码管应处于全灭状态)
2:按下s2 数码管从右往左依次显示数字,且显示的数字随着右移依次增加,当数字加到10后归0,当数码管移至最左边则返回最右边继续显示。
(期间LED应处于全灭状态)移动间隔为1秒。
3:若处于数码管显示时按下s3当按下时间超过2秒数码管移动将从右往左改成从左往右移动。
若处于LED循环闪烁时,s3按下无效。
4:双击s4,数码管或LED全部熄灭。若双击间隔大于2s视作无效。
(初始LED及数码管应处于全灭状态,按键按下过程中应不影响LED及数码管正常运行)
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
以下是51单片机的代码实现,可以实现你所需的功能:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit S1 = P3^0; // S1按键
sbit S2 = P3^1; // S2按键
sbit S3 = P3^2; // S3按键
sbit S4 = P3^3; // S4按键
sbit LED1 = P2^0; // LED1
sbit LED2 = P2^1; // LED2
sbit LED3 = P2^2; // LED3
sbit LED4 = P2^3; // LED4
sbit LED5 = P2^4; // LED5
sbit LED6 = P2^5; // LED6
sbit LED7 = P2^6; // LED7
sbit LED8 = P2^7; // LED8
sbit DIO = P1^0; // 数码管数据线
sbit CLK = P1^1; // 数码管时钟线
sbit LATCH = P1^2; // 数码管锁存线
uchar LEDFlag = 0; // LED闪烁标志
uchar LEDCount = 0; // LED计数器
uchar LEDDelay = 10; // LED闪烁间隔
uchar LEDState = 0; // LED状态
uchar NumFlag = 0; // 数码管移动标志
uchar NumCount = 0; // 数码管计数器
uchar NumDelay = 10; // 数码管移动间隔
uchar NumState = 0; // 数码管状态
uchar NumValue = 0; // 数码管显示的值
uchar KeyFlag = 0; // 按键标志
uchar KeyCount = 0; // 按键计数器
uchar KeyDelay = 10; // 按键检测间隔
uchar KeyValue = 0; // 按键值
uchar KeyState = 0; // 按键状态
uchar DoubleFlag = 0; // 双击标志
uchar DoubleCount = 0; // 双击计数器
uchar DoubleDelay = 10; // 双击间隔
uchar LEDTable[] = {0x81, 0x42, 0x24, 0x18}; // LED闪烁表
uchar NumTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 数码管表
void Delay(uint t) // 延时函数
{
uint i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void LEDOn(uchar led) // LED亮灯
{
switch (led)
{
case 1:
LED1 = 1; LED3 = 1;
break;
case 2:
LED2 = 1; LED4 = 1;
break;
case 3:
LED3 = 1; LED5 = 1;
break;
case 4:
LED4 = 1; LED6 = 1;
break;
case 5:
LED5 = 1; LED7 = 1;
break;
case 6:
LED6 = 1; LED8 = 1;
break;
}
}
void LEDOff(uchar led) // LED灭灯
{
switch (led)
{
case 1:
LED1 = 0; LED3 = 0;
break;
case 2:
LED2 = 0; LED4 = 0;
break;
case 3:
LED3 = 0; LED5 = 0;
break;
case 4:
LED4 = 0; LED6 = 0;
break;
case 5:
LED5 = 0; LED7 = 0;
break;
case 6:
LED6 = 0; LED8 = 0;
break;
}
}
void LEDToggle() // LED闪烁
{
if (LEDState == 0)
{
LEDOn(LEDTable[LEDCount]);
LEDState = 1;
}
else
{
LEDOff(LEDTable[LEDCount]);
LEDState = 0;
}
LEDCount++;
if (LEDCount >= sizeof(LEDTable)/sizeof(LEDTable[0]))
LEDCount = 0;
}
void NumMove() // 数码管移动
{
if (NumState == 0)
{
NumValue++;
if (NumValue >= 10)
NumValue = 0;
NumCount++;
if (NumCount >= sizeof(NumTable)/sizeof(NumTable[0]))
NumCount = 0;
}
else
{
NumValue--;
if (NumValue < 0)
NumValue = 9;
NumCount--;
if (NumCount < 0)
NumCount = sizeof(NumTable)/sizeof(NumTable[0]) - 1;
}
DIO = 0;
CLK = 0;
LATCH = 0;
DIO = NumTable[NumValue] & (0x01 << NumCount);
CLK = 1;
_nop_();
CLK = 0;
DIO = 0;
CLK = 1;
_nop_();
CLK = 0;
LATCH = 1;
_nop_();
LATCH = 0;
}
void KeyScan() // 按键扫描
{
if (S1 == 0)
{
KeyValue = 1;
KeyFlag = 1;
}
else if (S2 == 0)
{
KeyValue = 2;
KeyFlag = 1;
}
else if (S3 == 0)
{
KeyValue = 3;
KeyFlag = 1;
}
else if (S4 == 0)
{
KeyValue = 4;
KeyFlag = 1;
}
else
{
KeyValue = 0;
KeyFlag = 0;
KeyState = 0;
}
if (KeyFlag == 1 && KeyState == 0)
{
KeyCount++;
if (KeyCount >= KeyDelay)
{
KeyState = 1;
KeyCount = 0;
}
}
else if (KeyFlag == 0)
{
KeyCount = 0;
KeyState = 0;
}
}
void DoubleClick() // 双击检测
{
if (KeyValue != 4)
{
DoubleFlag = 0;
DoubleCount = 0;
}
else
{
if (DoubleFlag == 0 && DoubleCount == 0)
{
DoubleCount++;
}
else if (DoubleFlag == 0 && DoubleCount > 0)
{
DoubleCount++;
if (DoubleCount >= DoubleDelay)
{
DoubleFlag = 1;
DoubleCount = 0;
}
}
else if (DoubleFlag == 1 && DoubleCount == 0)
{
DoubleCount++;
}
else if (DoubleFlag == 1 && DoubleCount > 0)
{
DoubleCount++;
if (DoubleCount >= DoubleDelay)
{
DoubleFlag = 0;
DoubleCount = 0;
}
}
}
}
void main()
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x66;
ET0 = 1;
EA = 1;
TR0 = 1;
while (1)
{
KeyScan();
if (KeyValue == 1 && KeyState == 1)
{
NumFlag = 0;
LEDFlag = 1;
}
else if (KeyValue == 2 && KeyState == 1)
{
LEDFlag = 0;
NumFlag = 1;
}
else if (KeyValue == 3 && KeyState == 1 && DoubleFlag == 0)
{
NumState = !NumState;
}
else if (KeyValue == 4 && KeyState == 1 && DoubleFlag == 1)
{
NumFlag = 0;
LEDFlag = 0;
NumState = 0;
LEDState = 0;
NumValue = 0;
LEDCount = 0;
}
DoubleClick();
if (NumFlag == 1)
{
LEDOff(1);
LEDOff(2);
LEDOff(3);
LEDOff(4);
LEDOff(5);
LEDOff(6);
NumMove();
Delay(NumDelay);
}
else if (LEDFlag == 1)
{
NumValue = 0;
LEDToggle();
Delay(LEDDelay);
}
else
{
LEDOff(1);
LEDOff(2);
LEDOff(3);
LEDOff(4);
LEDOff(5);
LEDOff(6);
Delay(100);
}
}
}
void Timer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x66;
KeyCount++;
if (KeyCount >= KeyDelay)
{
KeyFlag = 1;
KeyCount = 0;
}
}
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢