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

📄 111.c

📁 键盘扫描C程序 74HC595对LCD1602的控制
💻 C
字号:
/*********************程序功能*********************/
/******************第一行显示键码******************/
/****************第二行显示总按键数****************/
/*******当按键超过1.5秒时总数加一并提示警告********/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P1^5;
sbit ST=P1^4;
sbit SH=P1^3;
sbit DS2=P1^2;
sbit ST2=P1^1;
sbit SH2=P1^0;
uchar key,temp,num=0;
uchar g=0x30,s=0x30,b=0x30,q=0x30;
uchar code table[]=
"0123456789ABCDEF";
uchar code table1[]=
"warnning!!!";
uchar code table2[]=
"it is rignt";
void delay(uchar x)
{
	uchar a,b;
	for(a=x;a>0;a--)
		for(b=100;b>0;b--);	
}
/*液晶数据端写入函数(即第一个595)*/
void date_input(uchar date)				             
{
	uchar temp;
	uchar i;
	for(i=0;i<8;i++)
	{
		temp=date&(_cror_(0x80,i));
		if(temp==0)
			{
				DS=0;
				SH=0;
				SH=1;
//				delay(20);					//5ms
			}
			else
				{
					DS=1;
					SH=0;
					SH=1;
//					delay(20);	
				}	
	}
	ST=0;
	ST=1;
//	delay(20);
}
/*液晶控制端写入函数(即第二个595)*/
void control_input(uchar date1)			
{
	uchar temp1;
	uchar i;
	for(i=0;i<8;i++)
	{
		temp1=date1&(_cror_(0x80,i));
		if(temp1==0)
			{
				DS2=0;
				SH2=0;
				SH2=1;
//				delay(20);
			}
			else
				{
					DS2=1;
					SH2=0;
					SH2=1;
//					delay(20);	
				}	
	}
	ST2=0;
	ST2=1;
//	delay(20);
}
/*液晶写指令函数*/
void write_com(uchar date2)						
{
	control_input(0x00);
	date_input(date2);
	delay(20);									//5ms
	control_input(0x40);
	delay(50);									//11.7ms
	control_input(0x00);										
}
/*液晶写数据函数*/
 void write_date(uchar date3)				
{
	control_input(0x10);
	date_input(date3);
	delay(20);									//5ms
	control_input(0x50);
	delay(50);									//11.7ms
	control_input(0x10);									
}
/*液晶初始化函数*/
void init()															
{
	write_com(0x38);
	delay(20);
	write_com(0x0f);
	delay(20);
	write_com(0x06);
	delay(20);
	write_com(0x01);
	delay(20);
}
/*键码显示函数*/
void display(uchar num1)					
{
	write_com(0x80);
	delay(20);
	write_date(table[num1]);
}
/*按键次数显示函数*/
 void display1() 
 {
	write_com(0xc0);
	delay(20);
	write_date(q);
	write_date(b);
	write_date(s);
	write_date(g);	 	
 }
/*按键超过1.5S时显示警告函数*/
void display2()								
{
	uchar i;
	write_com(0x83);
	for(i=0;i<11;i++)
		{
			write_date(table1[i]);
		}
}
/*键盘扫描函数*/
void key_scan()						
{
			uchar i;
			P0=0Xef;
			temp=P0;
			temp=temp&0x0f;
			if(temp!=0x0f)
				{
					delay(50);			//10ms(去抖动)
					if(temp!=0x0f)
						{
							switch(temp)
							{
								case 0x0e: key=1;
								break;
								case 0x0d: key=2;
								break;
								case 0x0b: key=3;
								break;
								case 0x07: key=4;
								break;
							}
							while(P0!=0XEF)
							{
/*开定时器1,当延时到达1.5秒时显示警告*/
								EA=1;			  				
								ET1=1;
								TMOD=0X10;
								TH1=(65536-50000)/256;
								TL1=(65536-50000)%256;
								TR1=1;
								while(P0!=0XEF);	//松手时关中断,并消除警告显示正确
								num=0;				//松手时num清0
								EA=0;
								write_com(0x83);
								for(i=0;i<11;i++)
									{
										write_date(table2[i]); //按键不超过1.5S(正常情况)或松手时,显示it is right
									}
							}
						}
				}
			P0=0Xdf;
			temp=P0;
			temp=temp&0x0f;
			if(temp!=0x0f)
				{
					delay(50);
					if(temp!=0x0f)
						{
							switch(temp)
							{
								case 0x0e: key=5;
								break;
								case 0x0d: key=6;
								break;
								case 0x0b: key=7;
								break;
								case 0x07: key=8;
								break;
							}
							while(P0!=0XDF)
							{
								EA=1;
								ET1=1;
								TMOD=0X10;
								TH1=(65536-50000)/256;
								TL1=(65536-50000)%256;
								TR1=1;
								while(P0!=0XDF);
								num=0;
								EA=0;
								write_com(0x83);
								for(i=0;i<11;i++)
									{
										write_date(table2[i]);
									}
							}
						}
				}
			P0=0Xbf;
			temp=P0;
			temp=temp&0x0f;
			if(temp!=0x0f)
				{
					delay(50);
					if(temp!=0x0f)
						{
							switch(temp)
							{
								case 0x0e: key=9;
								break;
								case 0x0d: key=10;
								break;
								case 0x0b: key=11;
								break;
								case 0x07: key=12;
								break;
							}
							while(P0!=0XBF)
							{
								EA=1;
								ET1=1;
								TMOD=0X10;
								TH1=(65536-50000)/256;
								TL1=(65536-50000)%256;
								TR1=1;
								while(P0!=0XBF);
								num=0;
								EA=0;
								write_com(0x83);
								for(i=0;i<11;i++)
									{
										write_date(table2[i]);
									}
							}
						}
				}
			P0=0X7f;
			temp=P0;
			temp=temp&0x0f;
			if(temp!=0x0f)
				{
					delay(50);
					if(temp!=0x0f)
						{
							switch(temp)
							{
								case 0x0e: key=13;
								break;
								case 0x0d: key=14;
								break;
								case 0x0b: key=15;
								break;
								case 0x07: key=16;
								break;
							}
							while(P0!=0X7F)
							{
								EA=1;
								ET1=1;
								TMOD=0X10;
								TH1=(65536-50000)/256;
								TL1=(65536-50000)%256;
								TR1=1;
								while(P0!=0X7F);
								num=0;
								EA=0;
								write_com(0x83);
								for(i=0;i<11;i++)
									{
										write_date(table2[i]);
									}
							}
						}
				}
}
void main()
{ 
	init();
	while(1)
	{
	 	 key_scan();	
		 if(key!=0)   					//当有键按下时才进行一次液晶显示
				{
					display(key-1);
					g++;
					if(g>0x39)
					{
						g=0x30;
						s++;
					}
					if(s>0x39)
					{
						s=0x30;
						b++;
					}
					if(b>0x39)
					{
						b=0x30;
						q++;
					}
					display1();
					key=0;             //显示1次后key清0,防止液晶不停显示
				}
	 }
				
}

void time1() interrupt 4 
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	num++;
	if(num==30)      //延时50ms*30=1.5s
	{
		num=0;
		g++;
		if(g>0x39)
		{
			g=0x30;
			s++;
		}
		if(s>0x39)
		{
			s=0x30;
			b++;
		}
		if(b>0x39)
		{
			b=0x30;
			q++;
		}
		display1();
		display2();
	}	
}	
	

⌨️ 快捷键说明

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