|
/*******************************************************************************
* 實 驗 名 : 動態數碼管按鍵移動顯示試驗
* 實驗說明 :
* 連接方式 : 用排線將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
2018-2-26 09:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
41.94 KB, 下載次數: 12, 下載積分: 黑幣 -5
|