_long
1
#include <REGX52.H>
#include <seg.h>
#include <key.h>
#include <intrins.h>
/*变量*/
unsigned char key_slow_down; //按键等待变量
unsigned char key_val,key_old,key_down; //按键消抖变量
unsigned int seg_slow_down; //数码管等待变量
unsigned char seg_buf[]={10,10,10,10,10,10};
unsigned char seg_pos;//数码管扫描变量
unsigned char system_mode = 1;
unsigned char ucled_1 = 0xfe;
unsigned char ucled_2 = 0x7f;
unsigned int led_slow_down;
unsigned char flag = 0;
unsigned char ucled_3[]={0x7e,0xbd,0xdb,0xe7};
unsigned char ucled_4[]={0xe7,0xdb,0xbd,0x7e};
unsigned char ucled_3_index;
unsigned char ucled_4_index;
/*按键函数*/
void key_proc()
{
if(key_slow_down) return;
key_slow_down = 1;//键盘减速程序
key_val = key_read();
key_down = key_val & (key_old ^ key_val);
key_old = key_val;
switch(key_down)
{
case 1:
flag = 0;
break;
case 2:
flag = 1;
break;
case 3:
if(++system_mode == 5) system_mode = 1;
break;
case 4:
if(--system_mode == 0) system_mode = 4;
break;
}
}
/*数码管函数*/
void seg_proc()
{
if(seg_slow_down) return;
seg_slow_down = 1;
}
/*其他函数*/
void led_proc()
{
if(led_slow_down) return;
led_slow_down = 1;
if(flag == 0)
{
if(system_mode == 1)
{
P1 = ucled_1;
ucled_1 = _crol_(ucled_1,1);
ucled_4_index = 0;
}
if(system_mode == 2)
{
P1 = ucled_2;
ucled_2 = _cror_(ucled_2,1);
ucled_1 = 0xfe;
}
if(system_mode == 3)
{
P1 = ucled_3[ucled_3_index];
if(++ucled_3_index == 4) ucled_3_index = 0;
ucled_2 = 0x7f;
}
if(system_mode == 4)
{
P1 = ucled_4[ucled_4_index];
if(++ucled_4_index == 4) ucled_4_index = 0;
ucled_3_index = 0;
}
}
}
/*定时器0初始化函数*/
void Timer0Init(void) //1毫秒@12MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
/*定时器0中断服务函数*/
void timer0server() interrupt 1
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(++key_slow_down == 10) key_slow_down = 0;
if(++seg_slow_down == 500) seg_slow_down = 0;
if(++seg_pos == 6) seg_pos = 0;
seg_disp(seg_pos,seg_buf[seg_pos]);
if(++led_slow_down == 500) led_slow_down = 0;
}
void main()
{
Timer0Init();
while(1)
{
key_proc();
seg_proc();
led_proc();
}
}