|
|
/*************************名称:矩阵式键盘的典型应用*********************************
**************************设计:黄龙松*******************************************
**************************日期:2006年7月23日于南京******************************/
#include \"include.h\"
sbit sclk = Port3^1; //定义P3.1为CP脉冲信号
sbit dat = Port3^0; //定义P3.0为数据信号
sbit beep = Port3^7;
//******************************************************************************
void Send_data (uchar dat1); //发送键值至74LS164
uchar Key_Scan(void); //键码扫描
void delay(uchar t); //延时
void Display(uchar Led_dat); //字符显示
void Key_Display(void); //发送键值至LED
void Speaker (void);
//******************************************************************************
uchar Key_Scan(void)
{
uchar code_h;
uchar code_l;
Port1=0xf0;
if((Port1&0xf0)!=0xf0)
{
delay(20);
if((Port1&0xf0)!=0xf0)
{
code_h = 0xfe;
while((code_h&0x10)!=0)
{
Port1=code_h;
if((Port1&0xf0)!=0xf0)
{
code_l=(Port1&0xf0|0x0f);
return(~code_l+~code_h);
}
else code_h=(code_h<<1)|0x01;
}
}
}
return(0);
}
//******************************************************************************
void delay(uchar t)
{
uchar i;
for(;--t;)
{
for(i=0;i<100;i++);
}
}
//******************************************************************************
void Speaker (void)
{
beep = 0;
delay(250);
delay(250);
delay(250);
beep = 1;
}
//******************************************************************************
void Send_data (uchar dat1)
{
uchar j;
for(j=0;j<8;j++)
{
if((dat1<<j)&0x80) //识别位状态
dat = 1;
else dat = 0;
sclk = 1; //产生脉冲信号,上升沿有效
sclk = 0;
}
}
//******************************************************************************
void Display(uchar Led_dat)//字符显示,基于74LS164
{
sclk = 0;
Send_data(Led_dat);
Speaker ();
}
//******************************************************************************
void Key_Display(void)
{
switch(Key_Scan())
{
case 0x88:
Display(ZK[0]);break;
case 0x48:
Display(ZK[1]);break;
case 0x28:
Display(ZK[2]);break;
case 0x18:
Display(ZK[3]);break;
case 0x84:
Display(ZK[4]);break;
case 0x44:
Display(ZK[5]);break;
case 0x24:
Display(ZK[6]);break;
case 0x14:
Display(ZK[7]);break;
case 0x82:
Display(ZK[8]);break;
case 0x42:
Display(ZK[9]);break;
case 0x22:
Display(ZK[10]);break;
case 0x12:
Display(ZK[11]);break;
case 0x81:
Display(ZK[12]);break;
case 0x41:
Display(ZK[13]);break;
case 0x21:
Display(ZK[14]);break;
case 0x11:
Display(ZK[15]);break;
// case 0x00:
// Display(0xff);break;
}
}
void main (void)
{
while(1)
{
Key_Display();
}
}
//************************************END********************************* |
|