📄 wkeyboard.c
字号:
//参考程序A: WKeyboard.c 六位数码管显示+键盘扫描
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
#define PORTA 0x8000 /*8255端口A*/
#define PORTB 0x8001 /*8255端口B*/
#define PORTC 0x8002 /*8255端口C*/
#define PORTCON 0x8003 /*8255控制口*/
sbit BUZ = P3^5;
unsigned char xdata *idata Pointm;
unsigned char number,ppp,dramb=0x0;
unsigned char data dram[7]={0x0,0x1,0x2,0x3,0x4,0x5};
ScanData=0xff;
void PORT_Init (void);
disply();
FF1();
void delay(unsigned int count) /*延时*/
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
void ff1() /*按下F1键时,清除数组dram[7]*/
{unsigned char ppp;
for(ppp=0;ppp<7;ppp++)
dram[ppp]=0x00;
number=0x00; /*按下F1键时,将显示指针指向数码管的第一位*/
dramb=0x00; /*清除F1键值(0xf1的存储单元dramb*/
ScanData=0xff;
}
void main (void) {
unsigned char ScanData,temp,k,number=0;
/*无效看门狗*/
WDTCN = 0xde;
WDTCN = 0xad;
PORT_Init ();
*Pointm=0x00;Pointm=PORTCON;
*Pointm=0x90; /*初始化8255,A口输入,B口,C口输出*/
Pointm=PORTC;
ScanData=0xff;
disply();
while(1){
BUZ=1;
do{
if(dramb==0xf1) /*dramb==0xf1,按过F1键,清除dram[7]*/
ff1();
disply();
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;
}
delay(20);
Pointm=PORTA;
temp=*Pointm; /*读是否有键按下*/
k=temp;
_nop_();
}while(temp==0xff);
BUZ=0; /*有键按下*/
delay(50);
BUZ=1;
ACC=temp;
temp = temp & 0xf0;
if(temp==0x00) temp = temp | 0xf0; /*PA4~PA7没加上啦*/
if(temp==0xf0){ /*0~F按下*/
/*换算成数字键值*/
k=~k; /*将键值求反*/
k=k&0x0f; /*只取低四位*/
k=k/2; /* K==0,对应0,1,2,3*/
if(k>=4) k=3; /* K==1,对应4,5,6,7*/
k=k*4; /* K==2,对应8,9,A,B*/
temp=ScanData; /* K==4,对应C,D,E,F*/
temp=temp+k;
dram[number]=temp;
number++;
if(number==0x06)number=0x00;
_nop_();
}
else{ /*F1~F4按下*/
switch(temp)
{
case 0xe0:
temp = 0x0f1; /*F1键按下*/
break;
case 0xd0:
temp = 0x0f2; /*F2键按下*/
break;
case 0xb0:
temp = 0x0f3; /*F3键按下*/
break;
case 0x70:
temp = 0x0f4; /*F4键按下*/
break;
default:
temp = 0x00;
}
_nop_();
dramb=temp; /*F1-F4键值的存储单元dramb*/
// ACC=temp;
}
}
}
void PORT_Init (void)
{
XBR2 = 0x40; /*使能交叉开关和弱上拉*/
P74OUT |= 0xcf; /*使能P4,P5,P6推挽输出,P7为漏极开路*/
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE*/
/*高/低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6D;/*地址建立/保持时间占1个SYSCLK周期,/WR和/RD占12个周期*/
// P3MDOUT |= 0x20; /*使能P3.5推挽输出*/
}
disply(void) /*显示dram[6]中的六位数码*/
{ unsigned char code F7SEG[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char ss,pp,hh=1;
unsigned char xdata * Pointn;
for(ss=0;ss<6;ss++)
{
Pointn=PORTC;
pp=dram[ss];
B=ss;
*Pointn=F7SEG[pp];
Pointn=PORTB;
*Pointn=hh;
ACC=pp;
B=F7SEG[pp];
hh=hh<<1;
delay(5);
}
Pointm=PORTC;
*Pointm=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -