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

📄 8255+lcd矩阵键盘ok(me).c

📁 通过8255拓展矩阵键盘
💻 C
字号:
#include<AT89X51.h>
#include<absacc.h>
#include<intrins.h>

#define   uchar        unsigned char
#define   uint         unsigned int
#define   nop()        _nop_()
#define   DATA_PORT    P0


#define  COM8255  XBYTE[0x8003]              //命令口地址
#define  PA       XBYTE[0x8000]              //PA口地址
#define  PB       XBYTE[0x8001]              //PB口地址
#define  PC1      XBYTE[0x0002]              //PC口地址       //读操作
#define  PC2      XBYTE[0x8002]              //PC口地址       //写操作
#define  AB       P2_7
/********************************************************
                     LCD函数声明
********************************************************/
uchar scan_key(void);
void delay(uchar n);

/********************************************************
                     LCD函数声明
********************************************************/
void      WriteCom(uchar CMD);
void      WriteDat(uchar DAT);
void      Delay(uint ms);
uchar     CheckBusy(void);
void      Picture_Set_XY(uchar x, uchar y);
void      Char_Set_XY(uchar x, uchar y, uchar *p);
void      Lcd_Init(void);
void      clear(void);

/********************************************************
                    LCD引脚定义
********************************************************/
#define       RS   P1_5  
#define       RW   P1_6     
#define       EN   P1_7 


 
/*
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39*/
/***************************主函数*********************************/
                              
void main(void) 
{   
    uchar k=0;
	COM8255=0x81;
    Lcd_Init();
    Char_Set_XY(0,0,"4*4 矩阵键盘测试");
    Char_Set_XY(1,1,"--电气工程系");
	Delay(5000);

     clear();
	 Char_Set_XY(0,0,"4*4 矩阵键盘测试");
	 Char_Set_XY(1,1,"你按下的键是:");
	while(1)
	{
	  k=scan_key();
      WriteCom(0x9e);
      WriteDat((k/10)+0x30);
      WriteDat((k%10)+0x30);
	}
	//while(1);                            //使程序停在此
} 


/****************************键盘扫描程序区****************************/

/************************************************
              键盘扫描子程序
************************************************/
uchar scan_key(void)
{
 
  uchar i,j,temp_i,temp_j,key_value;
  uchar a,b;                            //中间变量    
  temp_i=0x10;
  temp_j=0x01;
  //AB=1;
  //AB=1;
  //_nop_();
  PC2=0x0f;
  //AB=0;
  //AB=0;
  //_nop_();
  a=PC1;
  if(a!=0x0f)
   {
    Delay(15);
    //AB=0;
    //AB=0;
    //_nop_();
	a=PC1;
    if(a!=0x0f)
	 for(i=0;i<4;i++)
	  for(j=0;j<4;j++)
	   { 
		 b=~(temp_i<<i);
		 //AB=1;
        // AB=1;
         //_nop_();
		 PC2=b;
		 //AB=0;
         //AB=0;
         //_nop_();
		 a=PC1;
		 if((a&(temp_j<<j))==0)
		  key_value=i*4+j;
       }
	 }
     return key_value;
}


/*******************************LCD程序区****************************/
                    
/*************************************************
                   初始化函数
*************************************************/
void Lcd_Init(void)
{
 WriteCom(0x30);             //写指令:功能设置 8位数据,基本指令              
 WriteCom(0x0c);             //写指令:显示状态 ON,游标OFF,反白OFF                
 WriteCom(0x01);             //写指令:清除显示              
 WriteCom(0x02);             //写指令:地址归位                  
 WriteCom(0x80);             //写指令:设置DDRAM地址
 Delay(100);                 //延时
}


/*************************************************
                    延时函数
*************************************************/
void Delay(uint ms)             //延时ms毫秒
{
    uchar j;
    for(; ms>0; ms--)
     for(j=100; j>0; j--)
      {
       nop();
       nop();
      } 
}

/*************************************************
                  写控制字函数
*************************************************/
void WriteCom(uchar CMD)
{
 while(CheckBusy());            //测忙,若忙则等待
 RS = 0;                        //写控制字
 RW = 0;                        //写操作
 DATA_PORT = CMD;
 EN = 1;
 nop();
 nop();
 EN = 0;               //下降沿写入
}


/*************************************************
                    写数据函数
*************************************************/
void WriteDat(uchar DAT)
{
 while(CheckBusy());            //测忙,若忙则等待
 RS = 1;                        //写数据
 RW = 0;                        //写操作
 DATA_PORT = DAT;
 EN = 1;
 nop();
 nop();
 EN = 0;                 //下降沿写入
}

/*************************************************
                    测忙函数
*************************************************/
uchar CheckBusy(void)
{
 uchar temp;
 DATA_PORT =0xff;             //P0口置高,准备接收数据
 RS = 0;                      //读控制字
 RW = 1;                      //读操作
 EN = 1;
 nop();
 nop();
 temp = DATA_PORT;
 nop();
 nop();
 EN = 0;                      //下降沿读入
 temp &= 0x80;
 return(temp);                //若忙则返回1
}

/*************************************************
              置x,y坐标函数——写汉字
*************************************************/
void Char_Set_XY(uchar x, uchar y, uchar *p)
{
   if(y == 0)
 {
   WriteCom((0x80+x)); 
 }
 if(y == 1)
 {
  WriteCom((0x90+x));
 }
 if(y == 2)
 {
  WriteCom((0x88+x));
 }
 if(y == 3)
 {
  WriteCom((0x98+x));
 }
 while(*p != 0)
 {
  WriteDat(*p++);
 }
}


/*************************************************
                    清屏函数
*************************************************/
void clear(void)
{
  WriteCom(0x01);             //写指令:清除显示  
}





 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -