📄 keyboard.c
字号:
//程序说明: 此程序动态扫描键盘,当有按键按下时,将此键转换成对应的数字键值,同时
// 蜂鸣器响一声
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define PORTA 0x8000 /*8255端口A*/
#define PORTB 0x8001 /*8255端口B*/
#define PORTC 0x8002 /*8255端口C*/
#define PORTCON 0x8003 /*8255控制口*/
sbit BUZ = P3^5;
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
void PORT_Init (void);
/***************************************************************************************
函数名称: void sleep_ms(WORD count)
功能描述: 延时
输入: WORD count(所要延时的长度)
输出: 无
全局变量: 无
调用模块: _nop_()
***************************************************************************************/
void sleep_ms(unsigned int count)
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {
unsigned char ScanData,temp,k;
unsigned char xdata *idata Pointm;
/*无效看门狗*/
WDTCN = 0xde;
WDTCN = 0xad;
PORT_Init ();
Pointm=PORTCON; /*8255控制口*/
*Pointm=0x90; /*A口输入,B口输出*/
ScanData=0xff; /*置键盘扫描初值*/
while(1){
BUZ=1;
do{ /*关蜂鸣器*/
Pointm=PORTB;
ScanData++;
if(ScanData>=0x04) ScanData=0x00;
switch(ScanData)
{
case 0x00:
*Pointm=0xfe; /*扫描第一列*/
break;
case 0x01:
*Pointm=0xfd; /*扫描第二列*/
break;
case 0x02:
*Pointm=0xfb; /*扫描第三列*/
break;
case 0x03:
*Pointm=0xf7; /*扫描第四列*/
break;
default:
*Pointm=0xff;
}
sleep_ms(100);
Pointm=PORTA;
temp=*Pointm; /*读是否有键按下*/
k=temp;
}while(temp==0xff);
BUZ=0; /*有键按下*/
sleep_ms(200);
BUZ=1;
temp = temp & 0xf0;
if(temp==0x00) temp = temp | 0xf0; /*PA4~PA7没加上啦*/
if(temp==0xf0){ /*0~F按下*/
/*换算成数字键值*/
k=~k;
k=k&0x0f;
k=k/2;
if(k>=4) k=3;
k=k*4;
temp=ScanData;
temp=temp+k;
_nop_();
}
else{ /*F1~F4按下*/
switch(temp)
{
case 0xe0:
temp = 0xf1; /*F1键按下*/
break;
case 0xd0:
temp = 0xf2; /*F2键按下*/
break;
case 0xb0:
temp = 0xf3; /*F3键按下*/
break;
case 0x70:
temp = 0xf4; /*F4键按下*/
break;
default:
temp = 0x00;
}
_nop_();
}
}
}
/***************************************************************************************
函数名称: void PORT_Init(void)
功能描述: 初始化I/O
输入: 无
输出: 无
全局变量: XBR2,P74OUT,EMI0CF,EMI0TC,P3MDOUT
调用模块: _nop_()
***************************************************************************************/
void PORT_Init (void)
{
XBR2 = 0x40; /*使能交叉开关和弱上拉*/
P74OUT |= 0xff; /*使能P6,P7推挽输出*/
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6c; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
P3MDOUT |= 0xdf; /*使能P3.5推挽输出*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -