LJMP START
KEY3:MOV P3,#0B0H
LJMP START
KEY4:MOV P3,#99H
LJMP START
KEY5:MOV P3,#92H
LJMP START
KEY6:MOV P3,#82H
LJMP START
KEY7:MOV P3,#0F8H
LJMP START
KEY8:MOV P3,#80H
LJMP START
KEY9:MOV P3,#90H
LJMP START
KEY10:MOV P3,#88H
LJMP START
KEY11:MOV P3,#83H
LJMP START
KEY12:MOV P3,#0C6H
LJMP START
KEY13: MOV P3,#0A1H
LJMP START
KEY14:MOV P3,#86H
LJMP START
KEY15:MOV P3,#8EH
C51程序:
#include
LJMP START END
#include
void KEY15(); void main() {
unsigned char K_CODE; while(1); {
K_CODE=key(); switch(K_CODE)
{
case 0: KEY0();break; case 1: KEY1();break; ……
case 15: KEY15();break; default: break; } }
}
unsigned char key( ) {
unsigned char KEY=0xFF,col=0,temp, i; P1=0x0F;
//将所有列清零,行置1
temp=0xEF; delay_1μs( );
i=P1;
//读回P1口数值
if ((i & 0x0F)!=0x0F) //如果条件成立,则有按键按下 {
//延时15ms去抖动
delay_15ms( );
i=P1;
if((i & 0x0F)!=0x0F) //再次判断是否有键按下 {
while(col<4) //col为列号 {
P1=temp|0x0F; delay_1μs( ); i=P1;
switch(i & 0x0F) {
case 0x0E: {
KEY=col;
}
do{i=P1;} //重新读回P1口数值,等待按键释放
while((i & 0x0F)!=0x0F); delay_15ms( ); col=0xFE;
//延时15ms去抖动
break;
case 0x0D:
{
KEY=4+col; //KEY=1×4+col
do{i=P1;}
//重新读回P1口数值,等待按键释放
while((i & 0x0F)!=0x0F); delay_15ms( ); col=0xFE; }
//延时15ms去抖动
break;
case 0x0B:
{
KEY=8+col; //KEY=2×4+col
}
break;
do{i=P1;}
//重新读回P1口数值,等待按键释放
while((i & 0x0F)!=0x0F); delay_15ms( ); col=0xFE;
//延时15ms去抖动
case 0x07:
{
KEY=12+col; //KEY=3×4+col
do{i=P1;} //重新读回P1口数值,等待按键释放
while((i & 0x0F)!=0x0F); delay_15ms( ); col=0xFE;
//延时15ms去抖动
}
break;
default: }
col++;
temp =_crol_(temp,1); //将temp中数值左移1位;
break;
}
}
}
}
return(KEY);
void delay_15ms( ) //略 { }
void delay_1μs( ) //略 { }
void KEY0( ) //按下K0键应执行的任务函数 {P3=0XC0} void KEY1( ) { P3=0XF9 }
…… //省略了KEY2()等函数的定义 void KEY15( ) { P3=0X8E }
11-11 简述LED数码管动态显示和静态显示的驱动原理,两种方法各有什么特点? 静态扫描法需要用一组I/O口驱动一位LED显示,若显示的内容不变,则I/O口输出的数值就要稳定不变。特点是:各位数码管可以同时显示,显示亮度大,不闪烁。单片机送出显示段码后,可以处理其他工作,系统的运行效率高。缺点在于数码管占用了太多I/O口。所以静态显示法适合于显示位数少,或者软件负担重而无法承担动态扫描显示任务的场合。
动态扫描法的原理:多个数码管共用一个数据口,每一个轮流选通工作,利用了人眼的视觉惰性,使每一个数码管看上去都是常亮的。
特点:动态显示法简化了电路,节约了I/O口线,但是每隔一定时间就要重新发送出数码管的段码值,占用了单片机的执行时间。
11-12如图11-48所示,STC12C5A60S2单片机驱动4个7段数码管,分别显示千位、百位、十位、个位。请编写程序,使这四个数码管显示数值5678。