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

📄 yjkey.c

📁 实现单片机对键盘的响应
💻 C
📖 第 1 页 / 共 2 页
字号:
/*.....................键盘程序.................*/
#include <reg51.h>
#include <intrins.h>
unsigned char key,Byte1,Byte2,count=0;//键盘中数字对应的汉字库中的值
unsigned char i,j,pwbuf[6],pw[6];
bit pwflag,enterflag,flag;
static unsigned char add=0x89;//定义初始的地址
//液晶程序引脚定义
sbit CS = P0^2;//片选
sbit SID = P0^1;	//数据
sbit SCLK = P0^0;	//时钟
sbit POWER= P1^1;       //低电平电源开
sbit BACKLIGHT = P1^0;   //背光

void lcdinit(void);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void SendByte(unsigned char dat);
void sendbyte(unsigned char bbyte);
void delay(unsigned int n) ;
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2);
void judge(void);
unsigned char keyscan(void);
bit pwcmp(void);

void lcdinit(void)	//初始化LCD
{ CS=0;
  delay(100); //启动等待,等LCM讲入工作状态
  CS=1;
  BACKLIGHT=0;
  SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
  SendCMD(0x0C);//0000,1100  整体显示,游标off,游标位置off
  SendCMD(0x01);//0000,0001 清DDRAM
  SendCMD(0x02);//0000,0010 DDRAM地址归位
  SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}

void SendCMD(unsigned char dat)    //发送指令
{
     CS=1;
     SendByte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
     CS=0;
}
void SendDat(unsigned char dat)    //发送数据
{
     CS=1;
     SendByte(0xFA);//11111,01,0 RW=0,RS=1
     SendByte(dat&0xF0);//高四位
     SendByte((dat&0x0F)<<4);//低四位
     CS=0;
}
void SendByte(unsigned char dat)   //发送字节
{
     unsigned char i;
     for(i=0;i<8;i++)
           {
                 SCLK=1;
                 if(dat&0x80) SID=1;else SID=0;
                 SCLK=0;
                 dat=dat<<1;
            }
}


void display(unsigned char x_add,unsigned char dat1,unsigned char dat2) // 显示
{
     SendCMD(x_add);
     SendDat(dat1);
     SendDat(dat2);
}


 void delay(unsigned int n) //延时函数
{
  unsigned int i;
  for(i=0; i<n; i++) {;}
}
 unsigned char keyscan(void)  //键扫描函数
{
  unsigned char scancode,tmpcode;
  P2=0xf0;             //发行扫描码0
  if((P2&0xf0)!=0xf0)   //如果有键按下
 {
  delay(300);            //延时消抖
  if((P2&0xf0)!=0xf0) //延时再判断一次,去除抖动影响
  {
   scancode=0xfe;
   while((scancode&0x10)!=0) //逐行扫描
   {
   P2=scancode;//输出行扫描码
   if((P2&0xf0)!=0xf0)//本行有键按下
   {
     tmpcode=(P2&0xf0)|0x0f;//返回特征字节码,为1的位即对应行和列
     return((~scancode)+(~tmpcode));
     }
    else scancode=(scancode<<1)|0x01;//行扫描码左移一位
    }
    }
    }
    return(0);//无键按下返回值为0
    }

 void judge(void)  //判断是否超出密码范围
    {
                for(i=0;i<5;i++)
                {
                display(0x89,0xb3,0xac);//超
                display(0x8a,0xb3,0xf6);//出
                display(0x8b,0xc3,0xdc);//密
                display(0x8c,0xc2,0xeb);//码
                display(0x8d,0xb7,0xb6);//范
                display(0x8e,0xce,0xa7);//围
                display(0x8f,0xa2,0xf0);//输入为空
                delay(10000000000);
                }
                for(i=0;i<5;i++)
                {
                display(0x89,0xc7,0xeb);//请
                display(0x8a,0xd6,0xd8);//重
                display(0x8b,0xd0,0xc2);//新
                display(0x8c,0xca,0xe4);//输
                display(0x8d,0xc8,0xeb);//入
                display(0x8e,0xa2,0xf0);//输入为空
                delay(10000000000);}
                display(0x89,0xa2,0xf0);//输入为空
                display(0x8a,0xa2,0xf0);//输入为空
                display(0x8b,0xa2,0xf0);//输入为空
                display(0x8c,0xa2,0xf0);//输入为空
                display(0x8d,0xa2,0xf0);//输入为空
                display(0x8e,0xa2,0xf0);//输入为空
                add=0x89;//将光标放到初始地址
                count=0;
                pw[0]=0; //定义密码的值放在pw[]数组里面
                pw[1]=0;
                pw[2]=0;
                pw[3]=0;
                pw[4]=0;
                pw[5]=0;
                }
 /* 密码比较函数 */
bit pwcmp(void)
{

	unsigned char i;
	for (i=0;i<6;i++)
	{
		if (pw[i]==pwbuf[i])
			flag = 1;
		else
		{
			flag = 0;
			i = 6;
		}
	}
	return(flag);
}

 void main()
 {
     lcdinit();
     pw[0]=0; //定义密码的值放在pw[]数组里面
     pw[1]=0;
     pw[2]=0;
     pw[3]=0;
     pw[4]=0;
     pw[5]=0;
     while(add>0x88&&add<0x90)  //液晶模块的显示地址是在89H-8FH
        {
           delay(100);
           display(0x82,0xbd,0xf5);//
           display(0x83,0xcd,0xbc);//
           display(0x84,0xca,0xfd);//
           display(0x85,0xc2,0xeb);//
           display(0x92,0xca,0xe4);//输
           display(0x93,0xc8,0xeb);//入
           display(0x94,0xc3,0xdc);//密
           display(0x95,0xc2,0xeb);//码

           key=keyscan();
           switch(key)  //判断键值
      {
       case 0x11: //第一行第一列,数字0
                Byte1=0xa1;Byte2=0xef;// 显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 0;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键
                break;

      case 0x21:  //第一行第二列,数字1

                Byte1=0xa1;Byte2=0xef;// 显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 1;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键
                break;
      case 0x41:  //第一行第三列, 数字2


                Byte1=0xa1;Byte2=0xef;//  显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 2;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键

      break;
      case 0x81:  //第一行第四列, 数字3


               Byte1=0xa1;Byte2=0xef;//  显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 3;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键

      break;
      case 0x12:  //第二行第一列, 数字4


                Byte1=0xa1;Byte2=0xef;// 显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 4;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键

      break;
      case 0x22:  //第二行第二列, 数字5

               Byte1=0xa1;Byte2=0xef;// 显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 5;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键
      break;

      case 0x42:  //第二行第三列, 数字6

                Byte1=0xa1;Byte2=0xef;// 显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 6;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键
      break;
      case 0x82:  //第二行第四列, 数字7

                Byte1=0xa1;Byte2=0xef;//  显示五角星
                display(add,Byte1,Byte2);
		pwbuf[count] = 7;
		count++;
                add++;
                judge();
                delay(100000000); //沿时防止连续按键

      break;
      case 0x14:  //第三行第一列, 数字8

⌨️ 快捷键说明

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