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

📄 keycode.c

📁 38键小键盘程序,可以实现大小键盘的切换工作,并且接收命令和液晶显示
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include  "Scod.h"
///////////////////////////////////////////////////////////////////
sbit DATA=P3^4;     //用p3.3做数据线控制口(小键盘)
sbit CLK =P3^2;     //用p3.2做时钟线控制口(小键盘)
sbit Key_Data=P3^5; //定义接受标准键盘引脚控制口(数据线)
sbit Key_CLK=P3^3;  //定义接受标准键盘引脚控制口(时钟线,外部中断1)
sbit inhibit=P4^0; //定义专用键盘和标准PS2键盘控制转换(P4.0)
///////////////////////////////////////////////////////////////////
sbit a1 = P4^1;     //用p4.1做语音控制口1
sbit a2 = P4^2;     //用p4.1做语音控制口2
//////////////////////////////////////////////////////////////////
sbit buzzer = P2^7;   //用p0.1做蜂鸣器控制口
//////////////////////////////////////////////////////////////////
sbit atxtflag  = P4^3; //用p4.3做AT/XT控制口(拨码开关)
sbit bit1_6flag = P3^6; //用p3.6做1bit/6bit清除控制口(拨码开关)
sbit numberflag = P3^7; //用p3.7做液晶显示数字和*号控制口(拨码开关)
//////////////////////液晶控制位及数据接口/////////////////////////
unsigned char code cdle_net[] = {"    WELCOME!    "}; 
unsigned char code email[] = {"we do our best!!"}; 
unsigned char code Cls[] = {"                "};   //清显示
//字符以ASCII码存储,不需要转换
//OSC=12MHZ 
//LCMPORT=P2,4位模式,不带读“忙”状态功能, 
//现用P0口实验. 
//DATA(D7--D4),D3(E),D2(R/W),D1(RS),D0(VO). 
sfr LCMPORT = 0x80; 
sbit E=LCMPORT^3; 
sbit RW=LCMPORT^2; 
sbit RS=LCMPORT^1; 
sbit VO=LCMPORT^0; 
///////////////////////////////////////////////////////////////////
#define uchar unsigned char 
#define uint  unsigned int 
///////////////////////////////////////////////////////////////////
////////////////////////////键盘扫描定义///////////////////////////
unsigned char keyvartab[8][5]={'A','B','C','D','E',
                               'F','G','H','I','J',
                               'K','L','M','N','O',
                               'P','Q','R','S','T',
                               'U','V','1','2','3',
                               ' ',' ','4','5','6',
                               'W','X','7','8','9',
                               'Y','Z','~','0','!'
                                };
//键盘行扫苗码
#define NOKEY 0x01                                  //无键按下时的返回值 
#define LOHI() P1=0xff; P2=0x80;_nop_()  //00           //列出行入 
#define HOLI() P1=0x00; P2=0x9f;_nop_()  //1F          //行出列入 

code unsigned char hh[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};    //行位置表 
code unsigned char ll[5]={0x9e,0x9d,0x9b,0x97,0x8f};                                     

unsigned char DispFlag;
unsigned char key;

////////////////////////////////////////////////////////////////////
void initlcm4bit(void);
void writport(unsigned char lcmdata);
void writbyte(unsigned char RS,unsigned char asic);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
/////////////////////////////////////////////////////////////////////
void Delay5Ms(void);
void Delay400Ms(void);
void delay(unsigned  int N);
/////////////////////////////////////////////////////////////////////
void Decode(unsigned char ScanCode);
/////////////////////////////////////////////////////////////////////
void numbertocode(void);
void initkeyvariable(void);
unsigned char readkeyvar(void);
unsigned char parity(unsigned char x);
void SEND_byte(unsigned char byte_data);
/////////////////////////////////////////////////////////////////////
static unsigned char IntNum = 0; //中断次数计数
static unsigned char KeyV; //键值
static unsigned char DisNum = 0; //显示用指针
static unsigned char Key_UP=0, Ctrl = 0;//Key_UP是键松开标识,Ctrl是Ctrl键按下标识
static unsigned char BF = 0; //标识是否有字符被收到
static unsigned char biaozhiflag = 1;//表示小键盘已经有键按下标志位
/////////////////////////////////////////////////////////////////////
/////////////////////////延时子函数开始//////////////////////////////
void delay_ms(unsigned char ms)	// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
          for(i = 0; i < 120; i++);
	}
}
/////////////////////////////////////////
void delayus(unsigned int us) //执行一次是机器周期=12÷11.0592MHz=1.0857μS
                              //(65536-定时常数)*1.0857μS=50mS
                              // 定时常数=4C00H 
{ 
while(us--); 
} 
////////////////////////////////////////
void delay5Ms(void)
{
	unsigned int TempCyc =5552;
	while(TempCyc--);
}
////////////////////////////////////////
//400ms延时函数
void Delay400Ms(void)
{
	unsigned char TempCycA = 5;
	unsigned int TempCycB;
	while(TempCycA--)
		{
			TempCycB=7269;
			while(TempCycB--);
		};
}
///////////////////////////////////////
// 函数功能:延时子程序,实现(16*N+24)us的延时 
// 系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动
/*void delay(unsigned  int N)  
{
  int i; 
  for(i=0;i<N;i++);
}
//////////////////////////////////////
void delay_us(unsigned char i)//(2n+8)*i+5T
{
	uchar j,n;
	for(j=i;j;j--)
	for(n=1;n;n--);
}*/
/////////////////////////延时子函数结束//////////////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////////1602-LCD驱动程序开始///////////////////////
void writport(unsigned char lcmdata) 
{ 
LCMPORT=lcmdata|0x08; 
delayus(100);
LCMPORT=lcmdata&0xf7; 
} 
///////////////////////////////////////////////////
//RS=1时为写数据,RS=0时为写命令。 
void writbyte(unsigned char RS,unsigned char asic) 
{ 
unsigned char temp=asic&0xf0; 
if(RS) 
{ 
temp|=0x02; 
writport(temp); 
temp=asic<<4; 
temp|=0x02; 

} 
else 
{ 
delayus(1050); 
writport(temp); 
temp&=0xf0; 
temp=asic<<4; 

} 
writport(temp); 
} 
///////////////////////////////////////////////////
//4BIT 初始化,分两行。 
void initlcm4bit(void) 
{ 
E=0;E=0; 
delayus(40000);// 
writport(0x20); //4-BIT mode chage 
delayus(10000); 
writbyte(0,0x2C);//seting display mode 2 line mode,display off //0X2C
writbyte(0,0x0C);//display on/off. //0X0F
writbyte(0,0x01);//display clear 
delayus(30000); 
} 
///////////////////////////////////////////////////
//按指定位置显示一个字符 
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) 
{ 
Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; 
X |= 0x80; //算出指令码 
writbyte(0,X);
writbyte(1,DData); 
} 
///////////////////////////////////////////////////
//按指定位置显示一串字符  ***原来的遇到空格0x20就不显示*** 
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) 
{ 
  unsigned char ListLength,j; 
  ListLength = strlen(DData); 
  Y &= 0x1; 
  X &= 0xF; //限制X不能大于15,Y不能大于1 
      if (X <= 0xF) //X坐标应小于0xF 
        {  
      for(j=0;j<ListLength;j++) 
        { 
             DisplayOneChar(X, Y, DData[j]); //显示单个字符 
             //delayus5Ms();
             X++; 
            } 
        } 
} 
//////////////////////////1602-LCD驱动程序结束///////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////接收大键盘命令开始//////////////////////////////
//接收标准键盘扫描码命令函数
void Keyboard_out(void) interrupt 2	
{ 
	if ((IntNum > 0) && (IntNum < 9))
		{			
			KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
			if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
	 	}
	IntNum++;
	while (!Key_CLK); //等待PS/2CLK拉高

	if (IntNum > 10)
		{
			IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
			BF = 1; //标识有字符输入完了
			EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
		}
}
/////////////////////////////////////////////////////////////////////
//解码扫描码函数
//2007-06-16修改增加了清处Ctrl= 0函数,
//使其在完成发送命令及时清除,令其等于Ctrl = 0。
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
	if (!Key_UP)      
		{
			  switch (ScanCode)
				{ 
					case 0xf0 :	  // 当收到0xF0,Key_UP置1表示断码开始
					Key_UP = 1;
					break;
					
				  case 0xed :
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
					 EA = 1;
				   }
					break;      
					
					case 0x01 :
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
					 EA = 1;
				   }	
				   break;
					case 0x07 :
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
					 EA = 1;
				   }	
				   break;
					case 0x02 :	
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
					 EA = 1;
				   }
					break;
					case 0x04 :	
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
					 EA = 1;
				   }
				   break;
				  if(atxtflag==1)
				 { 
				   case 0xE0 :	 // AT 'GONGNENG' 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
				  /*case 0x3A :	 //CAPS LOCK --AT
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
				   }
				   break;
				   	case 0x58 :	   //CAPS LOCK --XT
					{
					 inhibit = 1;	
					 biaozhiflag = 1;
				   }
				   break; */ 
       ///////////////////////////////////////
       /*if(atxtflag==1)
				 {   
				  case 0x14 :	 //  ATCtrl
				  //case 0x12 :	
					Ctrl = 1;
					}
			 else  
				{	//break;
					  
				 case 0x1D :	 //  XTCtrl
				 //case 0x59 :
				 Ctrl = 2;
			  }	    
         break;
         */
         ///////////////////////////////////////
        if(atxtflag==1)
				 { 
				   case 0x66 :	//  ATbrack
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			  /*else  
				{	  
				   case 0x0e :	 // XTbrack
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }
			  */	    
         break;
        if(atxtflag==1)
				 { 
				   case 0x58 :	 //  AT CAPS LOCK
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			 /*else  
				{	
					 case 0x3A :	 // XT CAPS LOCK
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }*/	    
         break;	
         if(atxtflag==1)
				 { 
				  case 0x77 :	 //  AT NUM LOCK
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			 /*else  
				{  
				   case 0x45 :	 //  XT NUM LOCK
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }*/	    
         break;
         
       if(atxtflag==1)
				 { 
				   case 0x7e :	 // AT ScrollLock 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			 /*else  
				{	  
				   case 0x46 :	 // XT ScrollLock
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }*/	    
        break;
        //////////////////////2007-07-03新增开始////////////////////////////
        if(atxtflag==1)
				 { 
				   case 0x11 :	 // AT ALT 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
       
        if(atxtflag==1)
				 { 
				   case 0x05 :	 // AT F1 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        
        if(atxtflag==1)
				 { 
				   case 0x06 :	 // AT F2 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        /*if(atxtflag==1)
				 { 
				   case 0x04 :	 // AT F3 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			 else  
				{	  
				   case 0x3D :	 // XT F3
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }	    
        break;*/
        if(atxtflag==1)
				 { 
				   case 0x0C :	 // AT F4 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        if(atxtflag==1)
				 { 
				   case 0x03 :	 // AT F5 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        if(atxtflag==1)
				 { 
				   case 0x0B :	 // AT F6 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        if(atxtflag==1)
				 { 
				   case 0x83 :	 // AT F7 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        if(atxtflag==1)
				 { 
				   case 0x0A :	 // AT F8 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
       /* if(atxtflag==1)
				 { 
				   case 0x01 :	 // AT F9 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					}
			 else  
				{	  
				   case 0x43 :	 // XT F9
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
			  }	    
        break;*/
        if(atxtflag==1)
				 { 
				   case 0x09 :	 // AT F10 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        ////////////////////////////////////////////////////////////////////
        if(atxtflag==1)
				 { 
				   case 0x1C :	 // AT A 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;
        if(atxtflag==1)
				 { 
				   case 0x32 :	 // AT B 
				   biaozhiflag = 1;
	         inhibit = 1;	
	         EA = 1;
					} 
        break;

⌨️ 快捷键说明

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