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

📄 a.c

📁 用8255扩展键盘
💻 C
字号:
/*-------------说明--------------------------*/
//P0液晶数据
//P1矩阵键盘
//P2液晶功能端
/*-----------------------------------------------*/
#include <stdio.h>
#include <reg51.h>
#include<absacc.h>
#include<intrins.h>
unsigned char k=' '; 

sbit rs = P1^0;   //1=数据; 0=指令;
sbit rw = P1^1;   //1=读; 0=写;
sbit  e = P1^2;   //1=使能;

#define PA XBYTE[0x1FFC]
#define PB XBYTE[0x1FFD]
#define PC XBYTE[0x1800]
#define COM XBYTE[0x1C00]
#define LCD XBYTE[0x2FFF]
#define unchar  unsigned char
#define unint   unsigned int  




/*-------------键盘去抖动延时--------------------------*/
void delay1(void)
{
unsigned char i;
for(i=0;i<200;i++)
{}
}

/*-------------键盘扫描--------------------------*/
unsigned char keyscan(void)
{
unsigned char code_h;
unsigned char code_l;
COM=0x88;
PC=0xF0;
if((PC&0xF0)!=0xf0)
 {
  delay1();
  if((PC&0xF0)!=0xf0)
   {
    code_h=0xfe;
    while((code_h&0x10)!=0)
     {    
      PC=code_h;	        	  
      if((PC&0xF0)!=0xf0)
       {
        code_l=(PC&0xf0)|0x0f;
        return((~code_h)+(~code_l));
       }
       else
       code_h=(code_h<<1)|0x01;
     }
    }
   }
  return(0);
}
/*-------------键盘数字识别--------------------------*/
unsigned char identify(void)
{
unsigned char a;
a=keyscan();
switch(a)
 {
  case 0x11:k='1';break;
  case 0x21:k='5';break;
  case 0x41:k='9';break;
  case 0x81:k='C';break;
  case 0x12:k='2';break;
  case 0x22:k='6';break;
  case 0x42:k='0';break;
  case 0x82:k='D';break;
  case 0x14:k='3';break;
  case 0x24:k='7';break;
  case 0x44:k='A';break;
  case 0x84:k='E';break;
  case 0x18:k='4';break;
  case 0x28:k='8';break;
  case 0x48:k='B';break;
  case 0x88:k='F';break;
  default:break;
 }
return(k);
}

/*-------------测忙延时--------------------------*/
void delay(unsigned char i)    //225不稳定,确保安全230-250 约0.5ms
{ 
while(--i);
}

/*---------------写数据------------------------*/
lcd_write_data(unsigned char c) 
{ 
delay(250);
rs=1;
rw=0;
LCD=c;
e=1;
_nop_();
_nop_();
e=0;
}

/*---------------写指令------------------------*/
lcd_write_comm(unsigned char c) 
{ 
delay(250);
rs=0;
rw=0;
LCD=c;
e=1;
_nop_();
_nop_(); 
e=0;
}

/*------------------初始化-----------------*/
void init_lcd (void)
{
lcd_write_comm (0x30);  //基本指令集  
lcd_write_comm (0x01);  //清屏,地址指针指向00H
lcd_write_comm (0x06);  //光标的移动方向
lcd_write_comm (0x0c);  //开显示,关游标
}

/************************************************************************************************
lcd_write_sentence函数:
指定起始行,起始列,连续写入字符串;注意:字符串长度必须小于8;行:1-4;列:0-7
*************************************************************************************************/

void lcd_write_sentence(unchar row,unchar col,unchar *string,unchar lenth)   
{
  unchar i=0;
  lcd_write_comm (0x30);
  switch(row)
  {
    case 1:
	 lcd_write_comm(0x80+col);        //第一行
	 break;
	case 2:
	 lcd_write_comm(0x90+col);        //第二行
	 break;
    case 3:
	 lcd_write_comm(0x88+col);        //第三行
	 break;
	case 4:
	 lcd_write_comm(0x98+col);        //第四行
	 break;
	 default: 
	 lcd_write_comm(0x80);            //缺省为第一行
	 break;
   }
  while(lenth-->0)
  { 
    lcd_write_data(string[i]);            //写入字符串
	i++;
  }
}


/*------------------主程序--------------------*/
void main ()
{
 unsigned char buf1[20],i;
  init_lcd ();

while (1)
 {
for(i=0;i<3;i++)
{
buf1[i]=identify();
}
 lcd_write_sentence(1,0,"键值:",6);
 lcd_write_sentence(2,0,buf1,3);
 }
}

⌨️ 快捷键说明

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