按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验
按键输入和LED数码管扫描显示实验

按键输入和LED数码管扫描显示实验

设计内容:

给8个按键键盘的每个键定义一个功能,从左到右按键一次按下时,分别显示数字1-8,当有两个及以上的按键按下时,显示数字9。LCD初始显示个人学号,当有按键按下时,最后一位显示对应的数字。

实验程序:

#include

sbit key=P0^6; //键盘公共线,见原理图

sbit ls1=P0^2; //千位公共极

sbit ls2=P0^3; //百位公共极

sbit ls3=P0^4; //十位公共极

sbit ls4=P0^5; //个位公共极

unsigned char keyval; //读取的键值

#define Dat P1 //数据输出端

char a;

char b[4]={0,3,3,0}; //初始值为学号后四位

unsigned char tab[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//延时----------------------------

Delay(unsigned int t)

{ while(t--); }

//显示----------------------------

void Display(unsigned char mun)

{ unsigned char j;

for(j=0;j<50;j++)

{ Dat=a;

Dat=tab[b[0]]; //把得到7段显示码数据送P1端口

ls1=0; //点亮千位

Delay(100); //显示一会

ls1=1; //关闭,显示下一位

Dat=tab[b[1]];

ls2=0; //点亮百位

Delay(100);

ls2=1;

Dat=tab[b[2]];

ls3=0; //点亮十位

Delay(100);

ls3=1; //个位

Dat=tab[b[3]];

ls4=0;

Delay(100);

ls4=1;

}

}

Dat=0xff; //P1恢复为0xff

}

//--键盘扫描程序-------------------------------------- Scankey()

{ unsigned char i;

key=0; //拉低键盘公共线

if(Dat!=0xff) //有键按下

{ Delay(1000); //消抖动

if(Dat!=0xff) //有键按下

{ i=~Dat;

a=Dat; //读取键盘状态,

switch(i)

{ case 0x01: keyval=0x01;break; //K1

case 0x02: keyval=0x02;break; //K2

case 0x04: keyval=0x03;break; //K3

case 0x08: keyval=0x04;break; //K4

case 0x10: keyval=0x05;break; //K5

case 0x20: keyval=0x06;break; //K6

case 0x40: keyval=0x07;break; //K7

case 0x80: keyval=0x08;break; //K8

default: keyval=0x09;break; } //其它双键按下不处理,均为9 b[3]=b[2];

b[2]=b[1];

b[1]=b[0];

b[0]=keyval;

while(Dat!=0xff)

{key=1; //暂时关闭键盘,不干扰显示

Display(keyval); //等待按键抬起

key=0; //开启键盘检测

}

}

}

key=1; //释放键盘公共线

}

//--主程序--------------------------------------------------------- main()

{

while(1)

{ Display(keyval); //显示

Scankey(); //键盘扫描

}

}

相关主题
相关文档
最新文档