#include "reg52.h" //頭文件
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P3^7; //蜂鳴器對應(yīng)的IO口
sbit LSA=P2^2; //138譯碼器A口輸入
sbit LSB=P2^3; //138譯碼器B口輸入
sbit LSC=P2^4; //138譯碼器C口輸入
sbit K1=P3^1; //獨立按鍵K1,用于模擬護士的"響應(yīng)"操作
#define GPIO_KEY P1 //定義P1口,用于矩陣按鍵掃描
#define GPIO_DIG P0 //定義P0口,用于數(shù)碼管顯示
u8 KeyValue; //全局變量病房號
u8 code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管0-9的數(shù)字顯示
void delay(u16 i) //延時子程序
{
while(i--);
}
void KeyDown() //矩陣按鍵掃描子程序
{
/* 由于開發(fā)板的矩陣按鍵是4*4,按鍵掃描先是列掃描,設(shè)置為每一列的第一行,然后再行掃描,如果是第一行就保持原值,若是第2行,與第1行相差4
,則在原值的基礎(chǔ)上再加4,得到最終結(jié)果,依次類推第3、4行 */
u8 a=0;
GPIO_KEY=0x0f; //高4位置0,低4位置1,進行列掃描
if(GPIO_KEY!=0x0f) //有按鍵按下
{
delay(1000); //消除按鍵抖動
if(GPIO_KEY!=0x0f) //再次檢測是否有按鍵按下
{
GPIO_KEY=0x0f; //高4位置0,低4位置1,列掃描
switch(GPIO_KEY)
{
case(0x07):KeyValue=1;break; //檢測到第1列有按鍵按下,令KeyValue=1
case(0x0b):KeyValue=2;break; //檢測到第2列有按鍵按下,令KeyValue=2
case(0x0d):KeyValue=3;break; //檢測到第3列有按鍵按下,令KeyValue=3
case(0x0e):KeyValue=4;break; //檢測到第4列有按鍵按下,令KeyValue=4
}
GPIO_KEY=0xf0; //高4位置1,低4位置0,行掃描
switch(GPIO_KEY)
{
case(0x70):KeyValue=KeyValue;break; //檢測到第1行有按鍵按下,則令KeyValue=KeyValue
case(0xb0):KeyValue=KeyValue+4;break; //檢測到第2行有按鍵按下,則令KeyValue=KeyValue+4
case(0xd0):KeyValue=KeyValue+8;break; //檢測到第3行有按鍵按下,則令KeyValue=KeyValue+8
case(0xe0):KeyValue=KeyValue+12;break; //檢測到第4行有按鍵按下,則令KeyValue=KeyValue+12
}
while((a<50)&&(GPIO_KEY!=0xf0)) //按鍵消抖
{
delay(1000);
a++;
}
}
}
}
void main()
{
while(1) //死循環(huán),令系統(tǒng)一直工作
{
KeyDown(); //調(diào)用矩陣按鍵掃描子程序
if((KeyValue>0)&&(KeyValue<10)) //掃描得到的結(jié)果小于10時
{
LSA=0;
LSB=0;
LSC=0; //輸入138譯碼器,選中/Y0,第一個數(shù)碼管(個位)
GPIO_DIG=smg[KeyValue]; //顯示數(shù)值,即病房號
delay(1000); //延時
beep=~beep;
delay(100); //給蜂鳴器一個脈沖,使其工作,進行呼叫
}
if((KeyValue>=10)) //掃描得到的結(jié)果大于等于10時
{
LSA=0; //數(shù)碼管動態(tài)顯示結(jié)果
LSB=0;
LSC=0; //輸入138譯碼器,選中/Y0,第一個數(shù)碼管(個位)
GPIO_DIG=smg[KeyValue%10]; //得到結(jié)果與10相除,取余數(shù),即個位數(shù)
delay(100);
GPIO_DIG=0x00; //消除殘影
LSA=1;
LSB=0;
LSC=0; //輸入138譯碼器,選中/Y1,第二個數(shù)碼管(十位)
GPIO_DIG=smg[KeyValue/10]; //得到結(jié)果與10相除,取商,即十位數(shù)
delay(100);
GPIO_DIG=0x00; //消除殘影
delay(1000);
beep=~beep;
delay(100); //給蜂鳴器一個脈沖,使其工作,進行呼叫
}
if(K1==0) //獨立按鍵K1按下,即護士"響應(yīng)"
{
delay(1000); //消除按鍵抖動
if(K1==0)
{
KeyValue=0; //確定K1按下,護士"響應(yīng)",使數(shù)碼管顯示數(shù)值置零,恢復初始狀態(tài)
}
while(!K1); //按鍵松開,進行系統(tǒng)重置操作
LSA=1; //恢復開始狀態(tài)
LSB=1;
LSC=1;
GPIO_DIG=smg[KeyValue]; //選中最后一個數(shù)碼管置0,表示初始狀態(tài)
}
}
}
|