52单片机吧 关注:68贴子:132
  • 0回复贴,共1

谁帮我改下这个程序?万分感谢啊

只看楼主收藏回复

#include<REG52.H>
typedef unsigned char uchar;
typedef unsigned int uint;///键盘子程序相关说明?
#define BLANKCHAR 10 //定义空白常量
#define PCHAR 11//定义字符P常量
#define OPENCHAR 12//定义开锁字符┣常量
#define ALARMCHAR 13 //定义字符A常量
#define LINECHAR 14//定义字符-常量
#define SETCHAR 15//定义字符B常量
#define BACKKEY 0X0D //定义退格键常量
#define ENTERKEY 0X0F//定义确定键常量
#define LOCKKEY 0X0E//定义闭锁键常量
#define SETKEY 0X0C//定义设定键常量
#define NO_KEY 20//定义无按键返回常量
#define KEYPORT P2//定义键盘端口
uchar KeyPre;//保存上次扫描按键的键值
uchar KeyUp;//用于控制按键去抖动操作
#define LEDPORT P0//定义显示器段码输出端口
#define LEDCON P1//定义显示器位码输出端口
uchar code SEGCODE[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,//0……9的共阳极段码
0XFF,//不显示的共阳极段码
0x73.,//字符P的共阳极段码
0X8F,//┣的共阳极段码
0X88,//字符A的共阳极段码
0XBF,//字符-的共阳极段码
0X00};
//LED位码
uchar code wei[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
uchar DispBuf[6];//保存显示的字符
bit DispNormal;//控制显示时是正常显示还是闪烁显示
uchar DispCnt;//控制闪烁显示的频率
#define LONG_TIME 200//蜂鸣器响2s
#define SHORT_TIME 20//蜂鸣器响200ms
#define LONGER_TIME 18000//蜂鸣器响3min
sbit ALARMCON=P3^4;//定义报警控制引脚
bit AlarmEnable;//定义是否报警或声音提示
uint AlarmTime;//定义报警时间长度
sbit LOCKCON=P3^3;//定义电子锁控制引脚
uchar PassWord[]={1,2,2,2,1};//定义初始密码表
uchar PassInBuf[6];//保存输入的密码字符
uchar PassInBuf1[6];//设定密码时保存第一次输入的密码
uchar PassPosi=1;//用户输入的密码字符在PassInBuf[6]中的位置
bit TimerBit;//20ms定时时间到标志
uchar SysMode;//系统所处的模式:0输入密码模式 1报警模式 2开锁模式
uchar ErrorCnt;//用户连续输入密码出错次数
long int j;
char i=0;
char h=0;//密码重新输入错误标志位
char q;
char p=0;//重置密码输入次数标志
char SET=0;//设定密码标志位
////////显示子程序///////////////////////////////////////////////////////////
//信息填充函数
void Fill_Buf(uchar FillChar)//将字符FillChar写入缓冲区
{
uchar t;
for(t=0;t<6;t++)
{
DispBuf[t]=FillChar;
PassInBuf[t]=FillChar;
}
}
void Fill_Buf_P()//将系统闭锁时的信息写入缓冲区
{
Fill_Buf(BLANKCHAR);
DispBuf[0]=PCHAR;
}
void Fill_Buf_O()//将系统开锁时的信息写入缓冲区
{Fill_Buf(BLANKCHAR);
DispBuf[0]=OPENCHAR;}
void Fill_Buf_A()//将系统报警时的信息写入缓冲区
{Fill_Buf(LINECHAR);
DispBuf[0]=ALARMCHAR;}
void Fill_Buf_B()//将系统设定密码时的信息写入缓冲区
{
Fill_Buf(BLANKCHAR);
DispBuf[0]=SETCHAR;}
//缓冲区显示函数
void Disp_Led_Sin(uchar DispChar,uchar DispPosi)//在某个LED上显示字符
{
LEDPORT=SEGCODE[DispChar];
LEDCON=wei[DispPosi];
}
void Disp_Led_OFF()//关闭显示器
{
uchar T;
LEDCON|=0X3F;
for(T=0;T<6;T++)
Disp_Led_Sin(BLANKCHAR,T);
}
void Disp_LED(uchar i)//当系统处于不同模式下时显示某个显示器
{DispCnt++;
DispCnt%=10;
if(DispCnt==0)
{
DispNormal=~DispNormal;
}
if(SysMode==1)
{
if(!DispNormal)
{
Disp_Led_OFF();
return;
}
}
Disp_Led_Sin(DispBuf[i],i);
}
////////报警子程序////////////////////////////////////////////////////////////
void Sys_Speaker(uint stime)//设置报警时间及报警标志位
{
AlarmEnable=1;
AlarmTime=stime;
}
void Sys_Alarm()//控制蜂鸣器鸣叫
{
if(AlarmEnable==1)
{
ALARMCON=0;
AlarmTime--;
if(AlarmTime==0)
{
AlarmEnable=0;
ALARMCON=1;
if(SysMode==1)
{
SysMode=0;
Fill_Buf_P();
}
}
}
}
////////键盘子程序////////////////////////////////////////////////////////////
uchar Find_Key()//扫描一次键盘返回按键值
{
uchar KeyTemp,i,j;
KEYPORT=0XF0;
KeyTemp=KEYPORT;
if(KeyTemp==0XF0)
return NO_KEY;
switch(KeyTemp)
{
case 0x70:
j=4;break;
case 0xb0:
j=3;break;
case 0xd0:
j=2;break;
case 0xe0:
j=1;break;
default:
break;
}
KEYPORT=0x0f;
KeyTemp=KEYPORT;
switch(KeyTemp)
{
case 0x07:
i=4;break;
case 0x0b:
i=3;break;
case 0x0d:
i=2;break;
case 0x0e:
i=1;break;
default:
break;
}
return (4*(i-1)+j-1);
}
uchar Scan_Key()//负责按键去抖动等操作
{
uchar KeyTemp;
KeyTemp=Find_Key();
if(KeyTemp==NO_KEY)
{
if(KeyUp<2)
{
KeyUp=0;
return
NO_KEY;
}
if(KeyUp==2)
{
KeyUp=3;
return NO_KEY;
}
if(KeyUp==3)
{
KeyUp=0;
return KeyPre;
}
}
else
{
if(KeyUp==0)
{
KeyUp=1;
KeyPre=KeyTemp;
}
else
if(KeyUp==1)
{
if(KeyPre==KeyTemp)
KeyUp=2;
else
KeyPre=KeyTemp;
}
else
if(KeyUp==3)
{
KeyUp=2;
}
}
return NO_KEY;
}
void Key_Process(uchar Key)//按键处理函数
{
uchar i;
if(Key==NO_KEY)
return;
switch(SysMode)
{
case 0:
switch(Key)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
DispBuf[PassPosi]=LINECHAR;
PassInBuf[PassPosi]=Key;
if(PassPosi<5)
PassPosi++;
Sys_Speaker(SHORT_TIME);
break;
case BACKKEY:
DispBuf[PassPosi]=BLANKCHAR;
PassInBuf[PassPosi]=BLANKCHAR;
if(PassPosi>1)
PassPosi--;
Sys_Speaker(SHORT_TIME);
break;
case ENTERKEY:
for(i=0;i<5;i++)
{
if(PassInBuf[i+1]!=PassWord[i])
break;
}
if(i>=5)
{
Fill_Buf_O();
PassPosi=1;
LOCKCON=1;
ErrorCnt=0;
Sys_Speaker(LONG_TIME);
SysMode=2;
}
else
{
ErrorCnt++;
if(ErrorCnt>2)
{
ErrorCnt=0;
Fill_Buf_A();
PassPosi=1;
Sys_Speaker(LONGER_TIME);
SysMode=1;
}
else
{
Fill_Buf_P();
PassPosi=1;
Sys_Speaker(LONG_TIME);
}
}
break;
case LOCKKEY:
Fill_Buf_P();
PassPosi=1;
Sys_Speaker(SHORT_TIME);
break;
}
break;
case 2:
if(Key==LOCKKEY)
{
Fill_Buf_P();
SysMode=0;
LOCKCON=0;
Sys_Speaker(SHORT_TIME);
break;
}
if(Key==SETKEY)//密码重置
{
if(SET==0)
{
Fill_Buf_B();
SET=1;
break;
}
break;
}
if(SET==1)
{
switch(Key)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
DispBuf[PassPosi]=LINECHAR;
PassInBuf[PassPosi]=Key;
if(PassPosi<5)
PassPosi++;
Sys_Speaker(SHORT_TIME);
break;
case BACKKEY:
DispBuf[PassPosi]=BLANKCHAR;
PassInBuf[PassPosi]=BLANKCHAR;
if(PassPosi>1)
PassPosi--;
Sys_Speaker(SHORT_TIME);
break;
case ENTERKEY:
if(PassPosi<5)
break;
if(p==0)
{
p=1;
Fill_Buf_B();
PassPosi=1;
for(i=0;i<5;i++)
(PassInBuf1[i]=PassInBuf[i+1]);
break;
}
else
{
for(i=0;i<5;i++)
{
if(PassInBuf[i+1]!=PassInBuf1[i])
{
h=1;
break;
}
}
if(h==1)
{
h=0;
Fill_Buf_A();
PassPosi=1;
LOCKCON=0;
Sys_Speaker(LONG_TIME);
SysMode=1;
break;
}
for(q=0;q<5;q++)
PassWord[q]=PassInBuf[q+1];
Fill_Buf_P();
SysMode=0;
LOCKCON=0;
PassPosi=1;
p=0;
SET=0;
Sys_Speaker(LONG_TIME);
}
}
}
break;
}
}
////////初始化程序///////////////////////////////////////////////////////////
void Ini_Timer0()//初始化T0
{
TMOD&=0XF0;
TMOD|=0X01;
TR0=0;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
}
void Timer0()
interrupt 1//T0中断函数
{
TR0=0;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
TimerBit=1;
}
void Ini_System()//系统初始化
{
PassPosi=1;
LOCKCON=0;
Ini_Timer0();
Fill_Buf_P();
EA=1;
}
////////主程序////////////////////////////////////////////////////////////////
void main()
{
uchar KeyTemp;
Ini_System();
while(1)
{
if(TimerBit==1)
{
Disp_LED(i);
i++;
if(i>5)
i=0;
Sys_Alarm();
KeyTemp=Scan_Key();
Key_Process(KeyTemp);
TimerBit=0;
}
}
}
共阴极。89c52单片机。6位数码管,8位LED。急求大神啊


IP属地:上海1楼2014-11-17 22:22回复