求助,有单片机程序不会画仿真,急求
时间:10-02
整理:3721RD
点击:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
uchar passw[8]={0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde};
uchar keyw[8]; //按键
uchar disp[8]; //按键显示代码
unsigned char const seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-f显示代码
unsigned char const keyd[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb, 0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//0-F 按键代码
bit f;//f为开、闭锁标志,
uchar m,n,j,x,d,key,del,t,k;
uchar keyscan();
void delay(uint i);
void main()/*主函数 */
{ t=3;
f=0;
m=8; //按键次数
while(1)
{ if(t==0)continue;
key=keyscan();
if(key!=0xff) //有按键按下,保存按键代码
{
for(j=0;j<15;j++)
{
if(key==keyd[j])
{
disp[m-1]=seg[j]; //显代码
keyw[m-1]=keyd[j]; //按代码
}
}
m--;
if(m==0)
{
m=8;
}
}
if(key==0x77) //确认键按下,判断密码是否正确
{
for(n=0;n<8;n++) disp[n]=0;//清显示
m=8;
for(d=0;d<8;d++)
if(keyw[d]!=passw[d]) f=1; //判断密码
if(f==1) //密码错,闭锁
{
led=1;
f=0;
t=t-1;
}
else led=0; //密码正确,开锁
}
for(x=0;x<8;x++) //按键显示
{
P2=x;
P0=disp[x];
delay(10);
}
}
}
uchar keyscan()//键盘扫描函数,使用行列反转扫描
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //列线输出全为0,扫描行
cord_h=P3&0x0f; //读入行线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
led=1; //有按键按下闭锁
cord_h=P3&0x0f; //读入行线值
P3=0xf0; //行线输出全为0,扫描列
cord_l=P3&0xf0; //读入列线值
do //等待键释放
{
P3=0x0f;
for(x=0;x<8;x++) //按键显示,延时
{
P2=x;
P0=disp[x];
delay(10);
}
del=P3;
}while(del!=0x0f);
return(cord_h+cord_l);//返回键盘最后组合码
}
}
return(0xff); //返回该值
}
void delay(uint i)//延时函数
{
while(i--);
}
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
uchar passw[8]={0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde};
uchar keyw[8]; //按键
uchar disp[8]; //按键显示代码
unsigned char const seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-f显示代码
unsigned char const keyd[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb, 0xbb,0x7b,0xe7,0xd7,0xb7,0x77};//0-F 按键代码
bit f;//f为开、闭锁标志,
uchar m,n,j,x,d,key,del,t,k;
uchar keyscan();
void delay(uint i);
void main()/*主函数 */
{ t=3;
f=0;
m=8; //按键次数
while(1)
{ if(t==0)continue;
key=keyscan();
if(key!=0xff) //有按键按下,保存按键代码
{
for(j=0;j<15;j++)
{
if(key==keyd[j])
{
disp[m-1]=seg[j]; //显代码
keyw[m-1]=keyd[j]; //按代码
}
}
m--;
if(m==0)
{
m=8;
}
}
if(key==0x77) //确认键按下,判断密码是否正确
{
for(n=0;n<8;n++) disp[n]=0;//清显示
m=8;
for(d=0;d<8;d++)
if(keyw[d]!=passw[d]) f=1; //判断密码
if(f==1) //密码错,闭锁
{
led=1;
f=0;
t=t-1;
}
else led=0; //密码正确,开锁
}
for(x=0;x<8;x++) //按键显示
{
P2=x;
P0=disp[x];
delay(10);
}
}
}
uchar keyscan()//键盘扫描函数,使用行列反转扫描
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //列线输出全为0,扫描行
cord_h=P3&0x0f; //读入行线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
led=1; //有按键按下闭锁
cord_h=P3&0x0f; //读入行线值
P3=0xf0; //行线输出全为0,扫描列
cord_l=P3&0xf0; //读入列线值
do //等待键释放
{
P3=0x0f;
for(x=0;x<8;x++) //按键显示,延时
{
P2=x;
P0=disp[x];
delay(10);
}
del=P3;
}while(del!=0x0f);
return(cord_h+cord_l);//返回键盘最后组合码
}
}
return(0xff); //返回该值
}
void delay(uint i)//延时函数
{
while(i--);
}
大神们,应该怎么画,这个是关于单片机密码锁的