⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wkeyboard.c

📁 C8051F.rar
💻 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 + -