行线接P1.4-P1.7,列线接P1.0-P1.3。
*************************************************************************
功能:
根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。
开机时,数码管显示“-”。
当键按下时,数码管显示按下键的键值,蜂鸣器响一声。
*************************************************************************
******************************************************************** * * * 功能: * * 根据扫描键盘返回的键值编码查键值编码表,从而得到键值送数码管显示 * * 开机时,数码管显示“-”。 * * 当键按下时,数码管显示按下键的键值,蜂鸣器响一声。 * * * *******************************************************************/
以下为回复后可浏览的内容:
#include <reg52.h> #include <intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit BEEP = P3^7; //蜂鸣器驱动线
uchar key;
unsigned char code disp_code[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
unsigned char code key_code[]={ 0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7, 0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };
/**********************************************************
延时子函数
**********************************************************/ void delayms(uint ms) { uchar t; while(ms--) { for(t = 0; t < 120; t++); } }
/**********************************************************
x*0.14MS 延时子函数
**********************************************************/ void delay0(uchar x) { uchar i; while(x--) { for (i = 0; i<13; i++) {;} } }
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/ void beep() { uchar i; for (i=0;i<180;i++) { delay0(5); BEEP=!BEEP; //BEEP取反 } BEEP="1"; //关闭蜂鸣器 delayms(250); //延时 }
/**********************************************************
键盘扫描子函数
**********************************************************/ uchar keyscan() { uchar scan1,scan2,keycode,j;
P1=0xf0; scan1=P1; if((scan1&0xf0)!=0xf0) //判键是否按下 { delayms(30); //延时30ms scan1=P1; if((scan1&0xf0)!=0xf0) //二次判键是否按下 { P1=0x0f; scan2=P1; keycode=scan1|scan2; //组合成键编码
for(j=0;j<=15;j++) { if(keycode== key_code[j]) //查表得键值 { key=j; return(key); } } } } else P1=0xff;
return (16); }
/**********************************************************
判键是否按下子函数
**********************************************************/ void keydown() { P1=0x0f; if((P1&0x0f)!=0x0f) { keyscan(); P0=disp_code[key]; beep(); } }
/**********************************************************
主函数
**********************************************************/ main() { P0 = 0xbf; P2 = 0x7f; //数码管显示"-" P1 = 0xff;
while(1) { keydown(); } }
/*********************************************************/ |
文章评论(0条评论)
登录后参与讨论