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

📄 keycode.c.bak

📁 38键小键盘程序,可以实现大小键盘的切换工作,并且接收命令和液晶显示
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include "ku.h" //按键通码与ascii对照表
#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;//表示小键盘已经有键按下标志位
/////////////////////////////////////////////////////////////////////
unsigned char dat=0,dat1=0,dat2=0; //接收键盘数据变量? 存储通码变量 接受连续通码变量
unsigned char count=0,num=9,temp[5],shu=0; //中数次数 中断控制变量 缓冲区数组 缓冲区指针
unsigned char key=0; //按键最终值
/////////////////////////延时子函数开始//////////////////////////////
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--);
		};
}
/////////////////////////延时子函数结束//////////////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////////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 zhongduan(void) interrupt 2 //外部中断1 用来接受键盘发来的数据
{
    dat>>=1; //接受数据 低->高
    if(Key_Data) dat|=0x80;
    count++;
    if(count==num)
    {
      if(count==9)
      {
        dat1=dat; //中断9次后为键盘所按按键的通码(开始位始终为0在第一次中断时右移中忽略)
        num=20; //使中断可以继续中断11次
      }
      if(count==20)
      {
        dat2=dat; //取回第二个通码
        if(dat1==0xe0 || dat2==0xf0) //第一个通码是0xe0则证明所按按键为功能键,第二个通码是0xf0证明按键结束
        {
          temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //将所按按键存到缓冲区中
          ie=0x82; //关闭外部中断并打开内部中断来处理所按按键
          tr0=1;
         }
        else
        {
          temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //如果shift键被按下则记录与它同时按下的那个键
          count=0;
         }
        if((temp[0]==18 || temp[0]==89) && (temp[2]==18 || temp[2]==89) ) tr0=1; //如果缓冲区中有两个间隔的shift键则证明需要的铵键结束
      }
   }
}
void getkey(void) interrupt 1 //内部中断0 用来处理缓冲区里的数据
{
      unsigned char i=0;
      tr0=0;
      th0=0;
      tl0=0;
      count=0; //中断记数则0
      if((temp[0]==18 || temp[0]==89) && temp[1]!=0xf0 ) //shift被按下
      {
        //for(i=0;i<21;i++)
        //{
        // if(addshift[i][0]==temp[1]) //搜索shift被按下的表
        //  {
        //     key=addshift[i][1];
         ie=0x86; //打开外部中断1
         return;
        //   }
        //   }
       }
      else if(temp[0]==0xe0) //所按下的按键是功能键
      {
        //for(i=0;i<80;i++)
        //{
        //  if(noshift[i][0]==temp[1]) //功能键的通码在缓冲区的第二位
        //  {
        //    key=noshift[i][1];
            ie=0x86;
            return;
        //}
        //}
       }
      else //普通按键
      {
           if(atxtflag==1)
				    {		 
               if(key==0x78)
               {
               delay5Ms();
        		   buzzer = 0;
	             delay5Ms();
	             buzzer = 1;
	             delay5Ms();
	             buzzer = 0;
	             delay5Ms();
	             buzzer = 1;
	             delay5Ms();
	             buzzer = 0;
	             delay5Ms();
	             buzzer = 1;
	             delay5Ms();
	             buzzer = 0;
	             delay5Ms();
	             buzzer = 1;
	             biaozhiflag = 0;
	             inhibit = 0;
	             ie = 0x00;
	             EA = 0;	
              }
              else
              {
               ie=0x86;
               return;		
              }  	
            }
            else
            {
            	if(key==0x57)
            	{
            	   delay5Ms();
        		     buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               delay5Ms();
	               buzzer = 0;
	               delay5Ms();
	               buzzer = 1;
	               delay5Ms();

⌨️ 快捷键说明

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