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

📄 key.c

📁 该程序为单片机判断按键并在LCD显示的程序
💻 C
字号:

#include <reg51.h>

const char skey[10]={'1','2','3','4','5','6','7','8','9','0'};
const unsigned char act[3]={0xf7,0xef,0xdf};
const unsigned char roll[3]={0x03,0x05,0x06};
unsigned char key;
sbit RS = P2^0;
sbit RW = P2^1;
sbit E  = P2^2;
sbit LED= P2^6;
sbit LED_RUN=P2^7;
unsigned char Rec;
unsigned char find;
delay(unsigned int i)
{
  while(i--);																					    
}


void InitSP()                                       
//串口初始化,工作模式1,用定时器1做波特率发生器,9600b/s
{
	SCON=0x40; /*串行控制寄存器,设定工作模式*/
	TMOD=0x20; /*定时器模式控制寄存器,设定工作模式*/
	TH1=0xFD; /*P1口寄存器*/
	TR1=1;	 /*启动TR1*/
	ET1=0;	/*禁止T1中断*/
	ES=1;	/*允许串行口中断*/
	EA=1; /*开中断*/
	REN=1;	 /*允许接收*/

}
char scan_key()                            
//键盘扫描子程序,通过P1口进行循环扫描,判断那个键按下,从而确定键值
{
   unsigned char i,j,ini,inj;
   unsigned char in;
   find=0;
   for(i=0;i<3;i++)
    {
     P1=act[i];
     in=P1;
     if(in==act[i]) continue;
     in=in&07;
     for(j=0;j<3;j++)
       if(roll[j]==in)
         {
           find=1;
           ini=i;
           inj=j;break;
          }
     if(find==1) break;
     }
    if(find==0)
    return 0;
    key=ini*3+inj;
    return 1;

}

void get_key()                                //消抖子程序防止键盘抖动
{
  while(1)
  if(scan_key()==1){LED=0;break;}
  while(1)
  if(scan_key()==0){LED=1;break;}
}

void LCDWriteCommand(Cmd)                     
//液晶写命令子程序,RS为0,RW为0,E的下降沿将指令写入;
unsigned char Cmd;
{
RS=0;
RW=0;
P0=Cmd;
delay(10);
E=1;
delay(10);
E=0;
}
void LCDWriteData(Data)                      
//液晶写数据子程序,RS为1,RW为0,E的下降沿将指令写入;
unsigned char Data;
{
RS=1;
RW=0;
P0=Data;
delay(10);
E=1;
delay(10);
E=0;
}
void sciint() interrupt 4 using 3            
//串口中断子程序,在接收中断里,将数据写入液晶
{

	if(TI!=0)
	{
		TI=0;
		}
	if(RI!=0)
	{
      RI=0;
	  Rec=SBUF;
	  LCDWriteData(Rec);
	}
}

main()
{
  key=9;LED=1;LED_RUN=1;
  InitSP();

    LCDWriteCommand(0x30);delay(100);                      
//0x30为工作方式:8为数据,5*7点阵一行显示
    LCDWriteCommand(0x30);delay(100);                      
//工作方式需写入三遍以上
    LCDWriteCommand(0x30);delay(100);
    LCDWriteCommand(0x30);delay(100);
    LCDWriteCommand(0x30);delay(100);
    LCDWriteCommand(0x30);delay(100);
    LCDWriteCommand(0x30);delay(100);
    LCDWriteCommand(0x30);delay(100);

    LCDWriteCommand(0x38);delay(1000);
//8为数据,5*7点阵两行显示

    LCDWriteCommand(0x01);delay(1000);                      
//0x01表示清DDRAM和AC的值

    LCDWriteCommand(0x06);delay(1000);                      
//0x06表示数据写入后,AC自动加一,且画面不动

    LCDWriteCommand(0x0f);delay(1000);                      
//0x0f表示开显示、光标、闪烁

    LCDWriteCommand(0xc0);delay(1000);                      
//0xc0表示起始地址从第二行开始
	                                                        
//写入指令(可对照液晶指令集)
    LCDWriteData('O');
    delay(100);
    LCDWriteData('N');
    delay(100);
    LCDWriteData(':');
  while(1)
  {
	LED_RUN=1;
	delay(4000);
       get_key();
    if(key!=9)
    {
    	SBUF=skey[key];
    	LCDWriteData(skey[key]);
     }

    LED_RUN=0;
	delay(4000);
  }

}


⌨️ 快捷键说明

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