/********头文件区域*********/
#include <STC15.H>
/*********常量定义区********/
#define P2_INIT 0xFF
#define P2M1_INIT 0x00
#define P2M0_INIT 0x00
#define P0_INIT 0x0F
#define P0M1_INIT 0x00
#define P0M0_INIT 0x00
//设置P32 P33 P34为输入脚
#define P3_INIT 0x1C
#define P3M1_INIT 0x00
#define P3M0_INIT 0x00
#define ENA P30
#define ENB P31
#define IN1 P14
#define IN2 P15
#define IN3 P16
#define IN4 P17
#define STEVO P36
/*********变量定义区********/
unsigned char Cnt_2ms=0,Cnt_10ms=0,Cnt_1s=0,Second=0,Minute=0;
unsigned char Scan_Cnt=0; //片选变量,该变量为0显示数码管第0位 为1显示数码管第1位 为2显示数码管第2位 为3显示数码管第3位
unsigned char const Dsp_Seg[17]={0x05,0xDD,0x46,0x54,0x9C,0x34,0x24,0x5D,0x04,0x14,0x0C,0xA4,0xE6,0xC4,0x26,0x2E,0xFF}; //数码管显示数组定义
unsigned char const Scan_Table[4]={0xF7,0xFB,0xFD,0xFE}; //显示片选端口表 按照
unsigned char Dsp_Table[4]={0,0,0,0}; //显示片选端口组织表
unsigned char Duty_Stevo=6,Cnt_Stevo_PWM=0;
//按键变量定义
unsigned char Key_Buffer=1; //按键缓冲变量
unsigned char Key_Effect=1; //有效按键变量
unsigned char Key_Cnt=0; //按键消抖变量
unsigned char Key_Code=0; //键码
struct
{
unsigned char dsp_flg :1; //显示标记
unsigned char read_key :1; //按键标记
unsigned char dsp_power :1;
unsigned char timer_switch :1;
unsigned char moto_dir :1;
unsigned char :3;
}TimeFlg={0,0,1,1};
/*********函数声明区********/
void MCU_Init();
void Delay(unsigned char);
void Dsp_LED();
void ReadKey(void);
void KeyOpt(void);
void MotoCtr(void);
void main()
{
/****初始化区****/
MCU_Init();
/******主循环*******/
while(1)
{
if(TimeFlg.read_key==1) //2ms扫描按键
{
ReadKey();
TimeFlg.read_key=0;
}
if(TimeFlg.dsp_flg==1)
{
TimeFlg.dsp_flg=0;
Dsp_LED();
}
MotoCtr();
}
}
void MotoCtr(void)
{
if(Cnt_Stevo_PWM<=Duty_Stevo)
{
STEVO=1;
}
else STEVO=0;
}
//初始化函数
void MCU_Init()
{
P0=P0_INIT;
P0M1=P0M1_INIT;
P0M0=P0M0_INIT;
P2=P2_INIT;
P2M1=P2M1_INIT;
P2M0=P2M0_INIT;
P3=P3_INIT;
P3M1=P3M1_INIT;
P3M0=P3M0_INIT;
//定时器0初始化
AUXR &=~0x80; // 定时器0为12T模式
TMOD = 0x00; // 模式0,16位自动重载
TL0 = 0x83; //设置定时初值
TH0 = 0xFF; //设置定时初值
TR0 = 1; // 开始计时
ET0 = 1; // Enable Timer0 interrupt
IE |= 0x80; //开总中断
TimeFlg.timer_switch=1;
TimeFlg.dsp_power=1;
}
//显示函数
void Dsp_LED()
{
/*
if(TimeFlg.dsp_power==1 )
{
Dsp_Table[2]=Dsp_Seg[Minute%10]&0xFB; //显示秒的个位和点
Dsp_Table[3]=Dsp_Seg[Minute/10]; //显示秒的十位
Dsp_Table[0]=Dsp_Seg[Second%10]; //显示微秒的百位
Dsp_Table[1]=Dsp_Seg[Second/10]; //显示微秒的十位
}
else
{
Dsp_Table[1]=Dsp_Seg[16];
Dsp_Table[3]=Dsp_Seg[16];
Dsp_Table[2]=Dsp_Seg[16];
Dsp_Table[0]=Dsp_Seg[16];
}
*/
Dsp_Table[1]=Dsp_Seg[Duty_Stevo/10];
Dsp_Table[3]=Dsp_Seg[16];
Dsp_Table[2]=Dsp_Seg[16];
Dsp_Table[0]=Dsp_Seg[Duty_Stevo%10];
}
void ReadKey(void) //读键函数
{
Key_Buffer = P3&0x1C; //读端口状态 00011100 P34 P33 P32
if(Key_Buffer == Key_Effect) //按键不放不处理
{
Key_Cnt=0;
return;
}
else
{
Key_Cnt++;
if(Key_Cnt==5) //读键5次消抖
{
Key_Cnt=0;
Key_Effect=Key_Buffer; //送有效键值,后续处理
KeyOpt(); //有效键处理
}
}
}
void KeyOpt(void) //按键处理函数
{
switch(Key_Effect) // 00011100 没有按键按下 00011000 S1 00010100 S2 00001100 S3
{
case 0x1C: //没有按下按键
{
Key_Code=0; break;
}
case 0x18: //按下按键S1
{
TimeFlg.timer_switch=~TimeFlg.timer_switch;
Key_Code=1; break;
}
case 0x14: //按下按键S2
{
Second=0;Minute=0;
Key_Code=2; break;
}
case 0x0C: //按下按键S3
{
TimeFlg.dsp_power=~TimeFlg.dsp_power;
Key_Code=3; break;
}
}
}
//中断函数 2ms 200ms 1s平台
void INT_Timer0() interrupt 1 //中断函数
{
Cnt_Stevo_PWM++;
if(Cnt_Stevo_PWM>=160) Cnt_Stevo_PWM=0;
Cnt_2ms++;
if(Cnt_2ms==16)
{
//2ms平台
Cnt_2ms=0;
TimeFlg.read_key=1;
//LED 片选切换
Scan_Cnt++;
if(Scan_Cnt>=4) Scan_Cnt=0;
P1=P1|0x0F; //关闭所有片选
P2=~Dsp_Table[Scan_Cnt]; //送段码
P1=P1&Scan_Table[Scan_Cnt]; //开启相应片选
//计时
Cnt_10ms++;
if(Cnt_10ms==5)
{
//10ms平台
Cnt_10ms=0;
TimeFlg.dsp_flg=1;
if(TimeFlg.timer_switch==1)
{
Cnt_1s++;
if(Cnt_1s==100)
{
//1s平台
Cnt_1s=0;
Second++;
if(Second==60)
{
Second=0;
Minute++;
if(Minute>=60) Minute=0;
}
}
}
}
}
}