/*头文件区域*/
#include <REGX52.H>
#include <intrins.h>
/*变量声明区域*/
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键控制变量
unsigned char Seg_Dula[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f,0x00};//数码管段码储存函数数组
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//数码管位码储存组
unsigned char Seg_Pos = 0;//定时器扫描变量
unsigned char Seg_Buf[] = {10,10,10,10,10,10};
unsigned char Led_Mode = 0;//彩灯模式
unsigned char ucLed = 0xfe;//Led状态
unsigned char ucLed_Double[4]= {0x7e,0xbd,0xdb,0xe7};//
unsigned char ucLed_Index;
bit System_Flag = 1;//系统标志位
/*延时函数*/
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/*按键读取函数*/
unsigned char Key_Read()
{
unsigned char Temp = 0;
if(P3_4 == 0)Temp = 1;
if(P3_5 == 0)Temp = 2;
if(P3_6 == 0)Temp = 3;
if(P3_7 == 0)Temp = 4;
return Temp;
}
/*数码管处理函数*/
void Seg_Disp(unsigned char Wela,Dula)
{
/*消隐*/
P0 = 0x00;
P2_6 = 1;
P2_6 = 0;
/*位选*/
P0 = Seg_Wela[Wela];
P2_7 = 1;
P2_7 = 0;
/*段选*/
P0 = Seg_Dula[Dula];
P2_6 = 1;
P2_6 = 0;
}
/*定时器初始化函数*/
void Timer0_Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //打开闹钟模式
EA = 1; //开始计时
}
/*定时器0中断服务函数*/
void Timer0Sever() interrupt 1
{
/*闹钟响之后,闹钟赋初始值*/
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
if(++Seg_Pos == 6)Seg_Pos = 0;
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
}
/*Main*/
void main()
{
Timer0_Init();
while(1)
{
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
Key_Old = Key_Val;//扫描辅助沿
switch(Key_Down)
{
case 1:
System_Flag = 1;
break;
case 2:
System_Flag = 0;
break;
case 3:
if(++Led_Mode == 4)Led_Mode = 0;
break;
case 4:
if(--Led_Mode == 255)Led_Mode = 3;
break;
}
if(System_Flag == 1)
{
switch(Led_Mode)
{
case 0:
P1 = ucLed;
Delay(500);
ucLed = _cror_(ucLed,1);
break;
case 1:
P1 = ucLed;
Delay(500);
ucLed = _crol_(ucLed,1);
break;
case 2:
P1 = ucLed_Double[ucLed_Index];
Delay(500);
if(++ucLed_Index == 4)ucLed_Index = 0;
break;
case 3:
P1 = ucLed_Double[ucLed_Index];
Delay(500);
if(--ucLed_Index == 255)ucLed_Index = 3;
break;
}
Seg_Buf[0] = Led_Mode + 1;
}
}
}