|
/*******************************************************************************
* 实 验 名 : 动态数码管按键移动显示试验
* 实验说明 :
* 连接方式 : 用排线将P0口和74H573旁边的J12连接起来
* * 将138译码器的A、B、C端分别接P2.2、P2.3、P2.4
* * 用排线将P1口和矩阵键盘旁边的JP4连接起来
* 注 意 :
*******************************************************************************/
#include<reg51.h>
//--定义使用的IO口--//
#define GPIO_DIG P0
#define GPIO_KEY P1
#define GPIO_DIGG P2
sbit LED1=P3^4;
sbit LED2=P3^5;
sbit JDQ=P3^6;
sbit beep=P3^7;
//--定义全局变量--//
unsigned char code DIG_CODE[18]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X40};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char KeyValue;
unsigned char KeyValue1,KeyValue2,k=0;
//用来存放读取到的键值
unsigned char KeyState; //记录按键的状态,0没有,1有
unsigned char DisplayData[8];
unsigned char DisplayData1[8]={0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F};
unsigned char DisplayData2[8];
//unsigned char DisplayData3[8];
//用来存放要显示的8位数的值
//--声明全局变量--//
void Delay10ms(unsigned int c); //误差 0us
void KeyDown(); //检测按键函数
void DigDisplay(); //动态显示函数
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{ unsigned char i,j=0,y=0;
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[16];
}
LED1=0;
DigDisplay();
KeyState=0;
while(1)
{
KeyDown();
if(KeyState==1)
{
if(KeyValue2==0)
{
if(j==7)
{j=0;}
else
{
DisplayData[j]=DIG_CODE[KeyValue1];j++;}
DisplayData2[7]=DisplayData[7];
DisplayData2[6]=DisplayData[6];
DisplayData2[5]=DisplayData[5];
DisplayData2[4]=DisplayData[4];
DisplayData2[3]=DisplayData[3];
DisplayData2[2]=DisplayData[2];
DisplayData2[1]=DisplayData[1];
DisplayData2[0]=DisplayData[0];
}
else if(KeyValue2==3)
{
DisplayData[j]=DIG_CODE[16];
DisplayData2[7]=DisplayData[7];
DisplayData2[6]=DisplayData[6];
DisplayData2[5]=DisplayData[5];
DisplayData2[4]=DisplayData[4];
DisplayData2[3]=DisplayData[3];
DisplayData2[2]=DisplayData[2];
DisplayData2[1]=DisplayData[1];
DisplayData2[0]=DisplayData[0];
DisplayData2[j]=DisplayData[j];
j--;
}
else if(KeyValue2==1)
{
// if(DisplayData1[0]==DisplayData2[0])
// {k++;}
if(DisplayData1[1]==DisplayData2[1])
{k++;}else{k=0;}
if(DisplayData1[2]==DisplayData2[2])
{k++;} else{k=0;}
if(DisplayData1[3]==DisplayData2[3])
{k++;} else{k=0;}
if(DisplayData1[4]==DisplayData2[4])
{k++;} else{k=0;}
if(DisplayData1[5]==DisplayData2[5])
{k++;} else{k=0;}
// if(DisplayData1[6]==DisplayData2[6])
// {k++;} else{k=0;}
if(k==5)
{LED1=1;
LED2=0;
JDQ=0;
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
}
else {k=0;}
}
else if(KeyValue2==2)
{
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[16];
}
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
}
else if(KeyValue2==4)
{
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[16];
DisplayData2[i]=DisplayData[i];
}
LED1=0;
LED2=1;
j=0;
JDQ=1;
}
else if(KeyValue2==5)
{
for(i=0;i<6;i++)
{ DisplayData[i]=DIG_CODE[0];}
y=6;
while(y)
{KeyDown();
if(KeyValue2==0&&KeyState==1)
{DisplayData[y]=DisplayData1[y]=DIG_CODE[KeyValue1];
y--; KeyState=0;}
DigDisplay();
}
j=0;
}
else if(KeyValue2==6)
{
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[16];
}
JDQ=0;
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
beep=0; Delay10ms(10);
beep=1; Delay10ms(10);
}
KeyState=0;
}
DigDisplay();
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 使用数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<6;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
GPIO_DIGG=0x7f; break;//显示第0位
case(1):
GPIO_DIGG=0xbf; break;//显示第1位
case(2):
GPIO_DIGG=0xdf; break;//显示第2位
case(3):
GPIO_DIGG=0xef; break;//显示第3位
case(4):
GPIO_DIGG=0xf7; break;//显示第4位
case(5):
GPIO_DIGG=0xdb; break;//显示第5位
// case(6):
// GPIO_DIGG=0xfd; break;//显示第6位
// case(7):
// GPIO_DIGG=0xfe; break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void KeyDown(void)
{
unsigned int a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
Delay10ms(1);
a++;
a=0;
if(GPIO_KEY!=0x0f)
{
KeyState=1;//有按键按下
//测试列
GPIO_KEY=0X0F;
// Delay10ms(1);
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
// default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉。
}
//测试行
GPIO_KEY=0XF0;
// Delay10ms(1);
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+3;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0): KeyValue=KeyValue;break;
// default: KeyValue=17;
}
switch(KeyValue)
{
case(0X00): KeyValue1=0X0E;KeyValue2=5;break;
case(0X01): KeyValue1=0X0D;KeyValue2=4;break;
case(0X02): KeyValue1=0X0C;KeyValue2=3;break;
case(0X03): KeyValue1=0X0B;KeyValue2=2;break;
case(0X04): KeyValue1=0X09;KeyValue2=0;break;
case(0X05): KeyValue1=0X06;KeyValue2=0;break;
case(0X06): KeyValue1=0X03;KeyValue2=0;break;
case(0X07): KeyValue1=0X0A;KeyValue2=1;break;
case(0X08): KeyValue1=0X08;KeyValue2=0;break;
case(0X09): KeyValue1=0X05;KeyValue2=0;break;
case(0X0A): KeyValue1=0X02;KeyValue2=0;break;
case(0X0B): KeyValue1=0X00;KeyValue2=0;break;
case(0X0C): KeyValue1=0X07;KeyValue2=0;break;
case(0X0D): KeyValue1=0X04;KeyValue2=0;break;
case(0X0E): KeyValue1=0X01;KeyValue2=0;break;
case(0X0F): KeyValue1=0X0F;KeyValue2=6;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //按键松手检测
{
Delay10ms(1);
a++;
}
a=0;
}
}
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
|
-
-
密码锁.zip
41.94 KB, 下载次数: 12, 下载积分: 黑币 -5
|