📄 myboard.c
字号:
musicKeyFlag=~musicKeyFlag;
}
s_tableCounter=0x00;
break;
case 0x0e: if(LEDKeyFlag==1) /*按*键:开始/停止流水灯自动演示*/
{
AutoShow();
LEDKeyFlag=~LEDKeyFlag;
}
else
{
StopAutoShow();
LEDKeyFlag=~LEDKeyFlag;
}
break;
case 0x0f: if(++LEDFlag>5) /*按#键:流水灯方案循环切换*/
{
LEDFlag=1;
}
break;
default:
break;
}
}
/*************************************************************************/
void LEDHandle(void) /*流水灯方案选择*/
{
switch(LEDFlag) /*判断该演示的流水灯方案*/
{
case 0x01: DropDown(); break; /*水滴方案*/
case 0x02: CircleFlash(); break; /*环扫方案*/
case 0x03: GradualFlash(); break; /*渐明渐暗方案*/
case 0x04: SlowFlash(); break; /*慢闪方案*/
case 0x05: FastFlash(); break; /*快闪方案*/
}
}
/*************************************************************************/
void AutoShow(void) /*开始流水灯自动循环演示*/
{
LEDFlag=1;
LEDAutoFlag=1;
}
/*************************************************************************/
void StopAutoShow(void) /*停止流水灯自动循环演示*/
{
LEDAutoFlag=0;
}
/*************************************************************************/
void DropDown(void) /*水滴方案*/
{
static uchar s_dropdownCounter=0,s_dropdown_i=7,s_dropdown_OverCounter;
uchar rest;
if(LEDCycle100msFlag==1) /*判断100ms是否到*/
{
LEDCycle100msFlag=0;
rest=s_dropdownCounter%8;
P2=~(0x01<<rest) & (0xff>>(7-s_dropdown_i));/*使水滴流到某个灯并且让流到底的灯常亮*/
if(s_dropdownCounter>=(8-s_dropdown_i)*7) /*判断一个水滴流程是否完成*/
{
s_dropdownCounter+=8-s_dropdown_i; /*每流完一个流程下一个水滴的流程就要相应减少一个灯*/
s_dropdown_i--;
if(s_dropdown_i==0) /*整个水滴流程完了吗*/
{
s_dropdown_i=7;
s_dropdownCounter=0;
if(++s_dropdown_OverCounter>=1) /*一个完整水滴流程完了之后如果自动演示功能打开则跳到下一方案*/
{
s_dropdown_OverCounter=0;
if(LEDAutoFlag==1)
{
LEDFlag++;
}
}
}
}
else
{
s_dropdownCounter++;
}
}
}
/*************************************************************************/
void GradualFlash(void) /*渐明渐暗方案*/
{
static uchar s_gradualFlash_i=10,s_flashCounter,s_gradualFlash_OverCounter;
static bit s_gradualFlash_i_Flag=0;
if(LEDCycle500usFlag==1) /*判断500us是否到*/
{
LEDCycle500usFlag=0;
if(((++s_flashCounter)%10)!=0) /*PWM周期为10*500us=5ms,判断PWM周期到否*/
{
if((s_flashCounter%10)<s_gradualFlash_i) /*在PWM周期内按设定占空比调节灯的亮灭*/
{
P2=0xff;
}
else
{
P2=0x00;
}
}
else /*PWM周期到了*/
{
P2=0xff;
if((s_flashCounter/10)>=10) /*改变PWM占空比前先判断延时10*5ms=50ms到否*/
{ /*没到在此周期内占空比保持不变*/
s_flashCounter=0;
if(s_gradualFlash_i_Flag==0) /*需要渐明则调高占空比*/
{
s_gradualFlash_i--;
}
else /*需要渐暗则调低占空比*/
{
s_gradualFlash_i++;
}
if(s_gradualFlash_i==0 || s_gradualFlash_i>=10) /*如果渐明或渐暗完毕则交换*/
{
s_gradualFlash_i_Flag=~s_gradualFlash_i_Flag;
if(++s_gradualFlash_OverCounter>=6) /*渐明渐暗6/2=3个周期后如果自动演示功能打开则跳到下一方案*/
{
s_gradualFlash_OverCounter=0;
if(LEDAutoFlag==1)
{
LEDFlag++;
}
}
}
}
}
}
}
/*************************************************************************/
void CircleFlash(void) /*环扫方案*/
{
static uchar s_circleFlashCounter,s_circle_OverCounter;
if(LEDCycle100msFlag==1) /*判断100ms是否到*/
{
LEDCycle100msFlag=0;
P2=~(0x01<<s_circleFlashCounter); /*让某个灯亮应该令相应引脚为低*/
if(++s_circleFlashCounter>=8) /*8个灯都亮过以后再重新开始*/
{
s_circleFlashCounter=0;
if(++s_circle_OverCounter>=5) /*循环5遍后如果自动演示功能打开则跳到下一方案*/
{
s_circle_OverCounter=0;
if(LEDAutoFlag==1)
{
LEDFlag++;
}
}
}
}
}
/*************************************************************************/
void SlowFlash(void) /*慢闪方案*/
{
static uchar s_slowFlashCounter;
if(LEDCycle100msFlag==1) /*判断100ms是否到*/
{
LEDCycle100msFlag=0;
if((++s_slowFlashCounter%5)==0) /*判断5*100ms=500ms是否到*/
{
P2=~P2; /*每500ms灯亮灭改变一次*/
}
if(s_slowFlashCounter/5>=6) /*慢闪6/2=3个周期以后如果自动演示功能打开则跳到下一方案*/
{
s_slowFlashCounter=0;
if(LEDAutoFlag==1)
{
LEDFlag++;
}
}
}
}
/*************************************************************************/
void FastFlash(void) /*快闪方案*/
{
static uchar s_fashFlashCounter;
if(LEDCycle100msFlag==1) /*判断100ms是否到*/
{
LEDCycle100msFlag=0;
P2=~P2; /*每100ms灯亮灭改变一次*/
if(++s_fashFlashCounter>=30) /*快闪30/2=15个周期以后如果自动演示功能打开则跳到下一方案*/
{
s_fashFlashCounter=0;
if(LEDAutoFlag==1)
{
LEDFlag=1;
}
}
}
}
/*************************************************************************/
void ScrShift(uchar keyIndex) /*六位数码管顺序左移*/
{
uchar i;
for(i=5;i>0;i--)
{
DisplayArray[i]=DisplayArray[i-1];
}
DisplayArray[0]=c_keyCode[keyIndex];
}
/*************************************************************************/
void ClearScr(void) /*清屏*/
{
uchar i;
for(i=0;i<6;i++)
{
DisplayArray[i]=0x00;
}
}
/*************************************************************************/
void ReadPassword() /*从24C02中读取密码*/
{
uchar i;
IICRead(0xa0,0,password,6);
for(i=0;i<6;i++)
{
DisplayArray[i]=password[i];
}
}
/*************************************************************************/
void WritePassword() /*将屏幕的六位数字作为密码存入24C02中*/
{
IICWrite(0xa0,0,DisplayArray,6);
}
/*************************************************************************/
void StatusSend(void) /*下位机状态反馈(串口)*/
{
uchar i;
IE&=0xef;
for(i=6;i>0;i--)
{
SBUF=DisplayArray[i-1];
while(TI!=1);
TI=0;
}
SBUF=s_musicCounter;
while(TI!=1);
TI=0;
SBUF=LEDFlag;
while(TI!=1);
TI=0;
IE|=0x10;
}
/*************************************************************************/
void Delay (unsigned int value) /*10us延时*/
{
while (value!=0)
{
value--;
}
}
/*************************************************************************/
void ModifyTime(void) /*调整时间*/
{
uchar ucharTemp;
ucharTemp=sec;
sec%=60; /*秒除60取余数为sec*/
min+=ucharTemp/60; /*分加上秒的进位先暂存于min*/
ucharTemp=min;
min%=60; /*分再除60取余数为min*/
hour=(hour+ucharTemp/60)%24; /*时加上分的进位除24取余数为hour时*/
DisplayArray[0]=(sec%10); /*将时间存入显示缓冲区*/
DisplayArray[1]=(sec/10);
DisplayArray[2]=(min%10);
DisplayArray[3]=(min/10);
DisplayArray[4]=(hour%10);
DisplayArray[5]=(hour/10);
}
/*************************************************************************/
void ScanSeg7() /*数码管扫描显示*/
{
static uchar s_scanCounter;
s_scanCounter++;
if(s_scanCounter>5) s_scanCounter=0; /*ptr1>5表示6个数码管都已经扫描过*/
P0=s_scanCounter|(DisplayArray[s_scanCounter]<<4);
}
/*************************************************************************/
void IICClockDelay() /*IIC总线时钟电平延时*/
{
nop;nop;nop;nop;nop;nop;
}
/*************************************************************************/
void IICAck(bit ackValue) /*MCU对24C02的应答/不应答函数*/
{
if(ackValue==0) /*ackValue=0表示不应答*/
SDA=0;
else /*ackValue=1表示应答*/
SDA=1;
IICClockDelay();
SCL=1;
IICClockDelay();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -