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

📄 jianpan+1602.c

📁 51单片机的4*4键盘扫描及lcd液晶显示
💻 C
字号:



//MCU:AT89S51
//晶振:11.0592M
#include "AT89X51.h"
#include "intrins.h" 

#define  LCDPORT P1  //LCD数据线
#define uchar unsigned char
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^4;
//*************LCD1602驱动程序***************************///
void lcd_delay(unsigned char delaytime)
{
while(delaytime)delaytime--;
}
/********1ms延时子程序***********/
void delay_nms(unsigned int n)
{
 unsigned int i;
 unsigned char j;

 for(i=0;i<n;i++)
    for(j=0;j<120;j++)
	;     //空操作
}

void write_lcd_command(unsigned char write_command)
{
lcd_delay(40);
RS=0;
RW=0;
LCDPORT=write_command;
EN=1;
EN=0;
}

void write_lcd_data(unsigned char write_data)		   //写数据
{
lcd_delay(40);
RS=1;
RW=0;
LCDPORT=write_data;
EN=1;
EN=0;
}

void LCD_write_char( unsigned x,unsigned char y,unsigned char dat) //x表示行,y表示该行的位置(也就是列)
{
 //LCD_set_xy( x, y ); 
 switch(x)
 {
  case 0:
       write_lcd_command(0x80+y);		  //第一行
	   break;
	   case 1:
	   write_lcd_command(0xc0+y);		  //第二行
       break;
  }
// LCD_en_dat(dat);
  write_lcd_data(dat|0x30);   //dat或上0x30,就时把数字0123456789转换成ASIIC码,写入LCD
}

void lcd_displaystr(unsigned char x,unsigned char y,unsigned char code *str)
{  //x表示行,y表示该行的位置(也就是列)
 switch(x)
 {
  case 0:
       write_lcd_command(0x80+y);
	   break;
	   case 1:
	   write_lcd_command(0xc0+y);
       break;
  }
  while (*str)
  {
    write_lcd_data(*str);
	str++;
  }
}
//***********************初始化LCD1602*************************//
void initial_lcd1602(void) 
{
 unsigned char i;
 EN=0;
 for(i=200;i>0;i--)
   lcd_delay(248);
 write_lcd_command(0x38);//设置lcd1602为16X2显示,每个字符5×7显示,8个数据接口
 for(i=4;i>0;i--)
   lcd_delay(248);
 write_lcd_command(0x38);
  for(i=4;i>0;i--)
   lcd_delay(248);
 write_lcd_command(0x0f); //开显示,光标显示并闪烁
 for(i=4;i>0;i--)
   lcd_delay(248);
 write_lcd_command(0x06);//光标移动设置,每写一个数,文字不动,光标自动右移
  for(i=4;i>0;i--)
   lcd_delay(248);
write_lcd_command(0x01); //清屏
 for(i=4;i>0;i--)
   lcd_delay(248);

}
//********************lcd1602驱动程序到此完********************//


//********************键盘扫描程序********************//
uchar keyscan(void)
{
	uchar code_h,code_l,num;
	P0 = 0xf0;			 					// 发全0行扫描码
	if ((P0&0xf0)!=0xf0)					// 若有键按下
	{
		delay_nms(20);							// 延时去抖动
		if ((P0&0xf0)!=0xf0)				// 延时后再判断一次,去除抖动影响
		{
			code_h = 0xfe;
			while((code_h&0x10)!=0xf0)		// 逐行扫描
			{
				P0 = code_h;				// 输出行扫描码
				if ((P0&0xf0)!=0xf0)		// 本行有键按下
				{
					code_l = (P0&0xf0|0x0f);

					/* 保留P0口高4位,低4位变为1,作为列值 */
                                        num=(~code_h)+(~code_l);
					return num;
				}
				else code_h = (code_h<<1)|0x01;		// 行扫描码左移一位
			}
		}
	}
	return(0);								// 无键按下,返回值为0 	
}


	
void main(void)
{
 unsigned char key,t[16],q,p;
  initial_lcd1602();

  //输出显示
  lcd_displaystr(0,0x00," Hello Everybody ");
  lcd_displaystr(1,0x00,"Made by Zhenkun  ");



  while(1)
     {
	  //按键扫描
	  key=keyscan();
	  delay_nms(10);
	  
	  switch(key)
         {
		  case 0x00:
		    break;    
		  case 0x11:
		    lcd_displaystr(0,0x00," Key Number:01  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			

			if(key!=0){
				t[0]++;}
			if(t[0]>9)
				t[0]=0;			
			LCD_write_char(1,0x0d,t[0]);delay_nms(400);
			for(q=1;q<16;q++)
				t[q]=0; 	   
			break;
		  case 0x21:
		    lcd_displaystr(0,0x00," Key Number:02  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			
			if(key!=0)
				t[1]++;delay_nms(500);
			if(t[1]>9)
				t[1]=0;
			LCD_write_char(1,0x0d,t[1]);delay_nms(400);
			t[0]=0;
  			for(q=2;q<16;q++)
				t[q]=0;				
			break;
		  case 0x41:
		    lcd_displaystr(0,0x00," Key Number:03  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			if(key!=0)
				t[2]++;delay_nms(500);
			if(t[2]>9)
				t[2]=0;
			LCD_write_char(1,0x0d,t[2]);delay_nms(400);
			t[0]=0;t[1]=0;
  			for(q=3;q<16;q++)
				t[q]=0;  
			break;
		  case 0x81:
		    lcd_displaystr(0,0x00," Key Number:04  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[3]++;delay_nms(500);
			if(t[3]>9)
				t[3]=0;
			LCD_write_char(1,0x0d,t[3]);delay_nms(400);
			t[0]=0;t[1]=0;t[2]=0;
  			for(q=4;q<16;q++)
				t[q]=0; 
			break;
		  case 0x12:
		    lcd_displaystr(0,0x00," Key Number:05  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[4]++;delay_nms(500);
			if(t[4]>9)
				t[4]=0;
			LCD_write_char(1,0x0d,t[4]);delay_nms(400);
			t[0]=0;t[1]=0;t[2]=0;t[3]=0;
  			for(q=5;q<16;q++)
				t[q]=0; 
			break;
		  case 0x22:
		    lcd_displaystr(0,0x00," Key Number:06  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[5]++;delay_nms(500);
			if(t[5]>9)
				t[5]=0;
			LCD_write_char(1,0x0d,t[5]);delay_nms(400);
			t[0]=0;t[1]=0;t[2]=0;t[3]=0;t[4]=0;
  			for(q=6;q<16;q++)
				t[q]=0; 
			break;
		  case 0x42:
		    lcd_displaystr(0,0x00," Key Number:07  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[6]++;delay_nms(500);
			if(t[6]>9)
				t[6]=0;
			LCD_write_char(1,0x0d,t[6]);delay_nms(400);
			t[0]=0;t[1]=0;t[2]=0;t[3]=0;t[4]=0;t[5]=0;
  			for(q=7;q<16;q++)
				t[q]=0; 
			break;
		  case 0x82:
		    lcd_displaystr(0,0x00," Key Number:08  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			if(key!=0)
				t[7]++;delay_nms(500);
			if(t[17]>9)
				t[17]=0;
			LCD_write_char(1,0x0d,t[7]);delay_nms(400);
			for(p=0;p<7;p++)
				t[p]=0;
  			for(q=8;q<16;q++)
				t[q]=0;  
			break;
		  case 0x14:
		    lcd_displaystr(0,0x00," Key Number:09  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			if(key!=0)
				t[8]++;delay_nms(500);
			if(t[8]>9)
				t[8]=0;
			LCD_write_char(1,0x0d,t[8]);delay_nms(400);
			for(p=0;p<8;p++)
				t[p]=0;
  			for(q=9;q<16;q++)
				t[q]=0;  
			break;
		  case 0x24:
		    lcd_displaystr(0,0x00," Key Number:10  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[9]++;delay_nms(500);
			if(t[9]>9)
				t[9]=0;
			LCD_write_char(1,0x0d,t[9]);delay_nms(400);
			for(p=0;p<9;p++)
				t[p]=0;
  			for(q=10;q<16;q++)
				t[q]=0; 
			break;
		  case 0x44:
		    lcd_displaystr(0,0x00," Key Number:11  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[10]++;delay_nms(500);
			if(t[10]>9)
				t[10]=0;
			LCD_write_char(1,0x0d,t[10]);delay_nms(400);
			for(p=0;p<10;p++)
				t[p]=0;
  			for(q=11;q<16;q++)
				t[q]=0; 
			break;
		  case 0x84:
		    lcd_displaystr(0,0x00," Key Number:12  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			if(key!=0)
				t[11]++;delay_nms(500);
			if(t[11]>9)
				t[11]=0;
			LCD_write_char(1,0x0d,t[11]);delay_nms(400);
			for(p=0;p<11;p++)
				t[p]=0;
  			for(q=12;q<16;q++)
				t[q]=0;  
			break;
		  case 0x18:
		    lcd_displaystr(0,0x00," Key Number:13  ");
            lcd_displaystr(1,0x00," Push Times:    ");
			if(key!=0)
				t[12]++;delay_nms(500);
			if(t[12]>9)
				t[12]=0;
			LCD_write_char(1,0x0d,t[12]);delay_nms(400);
			for(p=0;p<12;p++)
				t[p]=0;
  			for(q=13;q<16;q++)
				t[q]=0;  
			break;
		  case 0x28:
		    lcd_displaystr(0,0x00," Key Number:14  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[13]++;delay_nms(500);
			if(t[13]>9)
				t[13]=0;
			LCD_write_char(1,0x0d,t[13]);delay_nms(400);
			for(p=0;p<13;p++)
				t[p]=0;
  			for(q=14;q<16;q++)
				t[q]=0; 
			break;
 		  case 0x48:
		    lcd_displaystr(0,0x00," Key Number:15  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[14]++;delay_nms(500);
			if(t[14]>9)
				t[14]=0;
			LCD_write_char(1,0x0d,t[14]);delay_nms(400);
			for(p=0;p<14;p++)
				t[p]=0;
			t[15]=0; 
			break;
		  case 0x88:
		    lcd_displaystr(0,0x00," Key Number:16  ");
            lcd_displaystr(1,0x00," Push Times:    "); 
			if(key!=0)
				t[15]++; delay_nms(500);
			if(t[15]>9)
				t[15]=0;
			LCD_write_char(1,0x0d,t[15]);delay_nms(400);
			for(p=0;p<15;p++)
				t[p]=0; 
			break;
			default:
		  lcd_displaystr(0,0x00," Sorry!You push ");
          lcd_displaystr(1,0x00,"keys more than 2");	

		 }
	 }
 
}

⌨️ 快捷键说明

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