4×4矩阵键盘+1602液晶显示

发布者:沈阳阿荣最新更新时间:2012-08-06 来源: 51hei关键字:4×4  矩阵键盘  液晶显示 手机看文章 扫描二维码
随时随地手机看文章

//这是51hei单片机开发板附带的一个程序,矩阵键盘接p3口,其中p3.0-p3.4为行,P3.5->p3.7为列
//每按一下键数字便可显示在1602液晶上面,并且蜂鸣器会发出响声.
//全部源代码下载: http://www.51hei.com/f/jz1602.rar

#include
#include 
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P2^2;
sbit lcden=P2^0;

sbit rw=P2^1;
sbit BEEP=P2^3;
uchar num,temp,date,i;

uchar code table_1[]=" shu ru tiao ma ";
uchar code table_2[]=" Pro_8888 ";
uchar code dis_tab[17]=
{ 
0x30,	  //0在1602中的十六进制码  
0x31,	  //1在1602中的十六进制码 	
0x32,	  //2在1602中的十六进制码 
0x33,	  //3在1602中的十六进制码 
0x34,	  //4在1602中的十六进制码  
0x35,	  //5在1602中的十六进制码 	
0x36,	  //6在1602中的十六进制码 
0x37,	  //7在1602中的十六进制码 
0x38,	  //8在1602中的十六进制码  
0x39,	  //9在1602中的十六进制码 	
0x41,	  //A在1602中的十六进制码 
0x42,	  //B在1602中的十六进制码
0x43,	  //C在1602中的十六进制码  
0x44,	  //D在1602中的十六进制码 	
0x2A,	  //*在1602中的十六进制码 
0x23,	  //#在1602中的十六进制码
0x20,	  // 在1602中的十六进制码
};


void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}


void beep()
{
   uchar i;
   for (i=0;i<50;i++)
	   {
	   delay(4);
	   BEEP=0;       //BEEP取反
	   
	   } 
   BEEP=1;           //关闭蜂鸣器
   delay(100);       //延时     
}


void lcd_wait_busy()  //1602忙检测函数
{  
	P0=0xff;			   //数据口全部置1,为读状态做准备
   	rs=0;			   //选择指令寄存器
   	rw=1;			   //选择读
   	lcden=1;				   //使能线电平变化
   	while((P0&0x80)==0x80);//读忙状态,不忙时退出
   	lcden=0;				   //恢复使能线电平
}


// 1602写命令函数		 


void lcd_write_com(unsigned char combuf)
{  
	rs=0;          	//选择指令寄存器
   	rw=0;           	//选择写
   	P0=combuf;         	//把命令字送入P2 	
   	lcden=1;	            //使能线电平变化,命令送入1602的8位数据口
   	_nop_();
   	lcden=0;	            //恢复使能线电平
}


// 1602写命令函数(带忙检测)		 

void lcd_write_com_busy(unsigned char combuf)
{  
	lcd_wait_busy();				//调用忙检测函数
   	lcd_write_com(combuf); 	//调用写命令函数
}


// 1602写数据函数(带忙检测)		 

void lcd_write_data(unsigned char databuf)
{  
	lcd_wait_busy();	//调用忙检测函数
   	rs=1;          	//选择数据寄存器
   	rw=0;           	//选择写
   	P0=databuf;      	//把数据字送入P2
   	lcden=1;	            //使能线电平变化,命令送入1602的8位数据口
   	_nop_();
   	lcden=0;	            //恢复使能线电平
}


// 1602显示地址写函数		 

void lcd_write_address(unsigned char x,unsigned char y)
{  	
   	y&=0x01;			//行地址限制在0-1
   	if(y==0x00)
      	lcd_write_com_busy(x|0x80);	   //第一行的列地址写入
   	else
      	lcd_write_com_busy((x+0x40)|0x80);	   //第二行的列地址写入
}


// 指定地址写入函数		 

void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)
{  		
		lcd_write_address(x,y); //写入地址			
   	lcd_write_data(buf);		//写入显示数据    
} 


// 液晶初始化指令

void lcd_init()
{
	uchar num;
	dula=0;
	wela=0;
	lcden=0;

	lcd_write_com_busy(0x38); //设置16*2显示,5*7点阵,8位数据接口
	lcd_write_com_busy(0x0d); //关显示 显示光标 光标闪烁
	lcd_write_com_busy(0x06); //当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动
	lcd_write_com_busy(0x01); //显示清屏:1,数据指针清零 2,所有显示清零
	lcd_write_com_busy(0x80); //80h+地址码(0-27h,40h-67h) 设置数据地址指针    
	for(num=0;num<16;num++)
	{
		lcd_write_data(table_1[num]);
		delay(5);
	}

	lcd_write_com_busy(0x80+0x40);
	

	
}
void key_wdat(uchar i)  //按键写数据

{
//	dula=0;
//	wela=0;
//	lcden=0;
//液晶初始化指令
//	write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
//	write_com(0x0d); //关显示 显示光标 光标闪烁
//	write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动
//	write_com(0x01); //显示清屏:1,数据指针清零 2,所有显示清零
//	write_com(0x80+0x40); //80h+地址码(0-27h,40h-67h) 设置数据地址指针 
   	
	lcd_wait_busy();
	lcd_write_data(i);
    delay(100);
	
}


// 删除液晶第1或2行全部数据
void clear(uchar t)
{
	if(t==1)
	{
		lcd_write_com_busy(0x80);
	}
	if(t==2)
	{
		lcd_write_com_busy(0x80+0x40);
	}
	for(i=0;i<15;i++)
	{
		lcd_write_data(dis_tab[16]);
	}
	lcd_write_com_busy(0x80+0x40);
}


// 产品显示函数  待写         如何从键盘输入中提取出三位的产品号码???????????????????
/*
void display_product()
{

}
*/


// 4*4矩阵键盘检测

void keyscan()
{
			lcden=1;//???
			//
			P3=0xfe;
			temp=P3;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(5);
					temp=P3;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P3;
					switch(temp)
						{
							case 0xee:key_wdat(dis_tab[7]); beep();    // 7
								break;
							case 0xde:key_wdat(dis_tab[8]); beep();    // 8
								break;
							case 0xbe:key_wdat(dis_tab[9]); beep();    // 9
								break;
							case 0x7e:key_wdat(dis_tab[17]); beep();   // 
								break;
						}
					while(temp!=0xf0)
						{
							temp=P3;
							temp=temp&0xf0;
						}
					}
				}
			//
			P3=0xfd;
			temp=P3;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(5);
					temp=P3;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P3;
					switch(temp)
						{
							case 0xed:key_wdat(dis_tab[4]); beep();  // 4
								break;
							case 0xdd:key_wdat(dis_tab[5]); beep();  // 5
								break;
							case 0xbd:key_wdat(dis_tab[6]); beep();  // 6
								break;
							case 0x7d:key_wdat(dis_tab[17]); beep();  // 
								break;
						}
					while(temp!=0xf0)
						{
							temp=P3;
							temp=temp&0xf0;
						}
					}
				}

			//
			P3=0xfb;
			temp=P3;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(5);
					temp=P3;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P3;
					switch(temp)
						{
							case 0xeb:key_wdat(dis_tab[1]);beep();  // 1
								break; 
							case 0xdb:key_wdat(dis_tab[2]);beep();  // 2
								break;
							case 0xbb:key_wdat(dis_tab[3]);beep();  // 3
								break;
							case 0x7b:key_wdat(dis_tab[17]);beep();  // 
								break;
						}
					while(temp!=0xf0)
						{
							temp=P3;
							temp=temp&0xf0;
						}
					}
				}

			//
			P3=0xf7;
			temp=P3;
			temp=temp&0xf0;
			while(temp!=0xf0)
				{
					delay(5);
					temp=P3;
					temp=temp&0xf0;
					while(temp!=0xf0)
					{
						temp=P3;
					switch(temp)
						{
							case 0xe7:key_wdat(dis_tab[0]); beep();  // 0
								break;
							case 0xd7:key_wdat(dis_tab[17]); beep();  // 
								break;
							case 0xb7:clear(2); beep();  // 删除液晶第二行
								break;
							case 0x77:beep();  // enter
								break;
						}
					while(temp!=0xf0)
						{
							temp=P3;
							temp=temp&0xf0;
						}
					}
				}


}
//

void main()
{
	lcd_init();
	while(1)
	{
		keyscan();
	}
	while(1);
}
关键字:4×4  矩阵键盘  液晶显示 引用地址:4×4矩阵键盘+1602液晶显示

上一篇:spi四种模式io模拟时序
下一篇:基于智能车非匀速行驶记忆算法的研究和实现

推荐阅读最新更新时间:2024-03-16 13:05

智能门锁C端迟早要爆发 首先要克服这4大挑战
智能家居产业的异军突起,使得在单品层面的智能门锁在2017年成为市场的新宠之一。得益于智能门锁的飞速发展,智能门锁C端的爆发也不远了,只是时间长短的问题了。但智能门锁的发展依旧存在许多不足和挑战,只有在不断的克服发展瓶颈之后,智能门锁才能迎来真正意义上的“春天”。    一、智能锁市场的发展规模与潜力   据市场调研公司《MarketsAndMarkets》发布报告称,全球智能家居市场规模将在2022年达到1220亿美元。据相关数据分析,到2018年,中国智能家居市场规模将达到1800亿元人民币。2015年市面上仅有几百家智能门锁品牌,而到了2016年整体呈现爆炸趋势,出现“千家门锁,激涌
[安防电子]
内核(2.6.14) + 根文件系统 +Qtopia Core 4移植 for S3C2410
TARGET CPU: S3C2410X SDRAM: HY57V561620(32MB) × 2 FLASH: K9F1208(64MB) NET: CS8900 HOST Linux Realse Version: Fecora Core 6 CrossCompiler: gcc-4.1.1/arm-linux-gcc-3.4.1 一、内核移植(2.6.14) 1 修改linux2.6.14下面的makefile文件 找到ARCH和CROSS_COMPILE,修改 ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux- (此处为你
[单片机]
国外ADAS Tier1研究:4D毫米波雷达上量,CMS成新战场
国际Tier1 ADAS/AD产品矩阵完善,持续发力占据中国市场 从ADAS/AD产品矩阵来看,部分头部Tier1已基本完成了全产品矩阵的覆盖。 比如大陆,其最新的产品包括座舱监测系统CMS(OMS),配置为OMS 摄像头 +座舱 雷达 ,预计2024年发布;1550nm的长距 激光雷达 HRL131,测距300m以上,HFOV128°,VFOV28°,预计2024年量产; 超声波 雷达CUS320,测距0.1m-6m,计划2024年量产。 博世也完成了除CMS外的全ADAS/AD产品覆盖,其最新产品包括1550nm的长距激光雷达,已于2023年CES进行了实物展出,其测距大于200m,功耗小于20W;舱内监测系统IM
[汽车电子]
国外ADAS Tier1研究:<font color='red'>4</font>D毫米波雷达上量,CMS成新战场
Mobileye Eye Q4无人驾驶合作车企已达13家
以色列Mobileye公司近日获得了两笔为车企配套的合同,本十年末旗下产品EyeQ4芯片将成为其供应车型的标配。 在2019年至2022年产能达到顶峰时,这两份合同最终将会使EyeQ4获得数百万的安装量。不过该公司并未透露其客户的更多信息。此外,该公司还表示其目前进行合作的无人驾驶汽车制造商已经从8家增长到了13家。 Mobileye近期公布的财报数据显示,今年第一季度中,该公司芯片在汽车上的安装量为81.6万件,累计总数达到600万件。 第一季度中,Mobileye的营业收入为4,560万美元,去年同期为3,560万美元,同比劲增28.1%。营业利润为1,270万美元,较去年同期的1,550万美元下滑1
[汽车电子]
工信部:我国4G用户近10亿 网速大提升
  中国的 4G 网络,无论是覆盖率还是用户数量上,都是天下无敌,这点确实很厉害。下面就随网络通信小编一起来了解一下相关内容吧。   在今天工信部的公开会议上,工信部总工程师张峰表示,过去一年我国的 4G 网络建设相当迅猛,全年月户均移动互联网接入流量达到1775MB,是上年的2.3倍,12月当月户均接入流量高达2752MB。   此外,我国固定宽带用户普及率达到72.5%,其中,光纤宽带用户达2.9亿,占固定宽带用户的比重超83%,50M以上高速率固定宽带接入用户占比达70%。   张峰还强调,目前我国 4G 用户近10亿,渗透率达70%,超过发达国家平均水平。全国建成125个大型、超大型数据中心,云计算关键领域取得突破,部分
[网络通信]
中德交流强调中国传感产业化4大方向,“协会+展会”将加速其落地
近日,由中国与产业联盟(以下简称“SIA联盟”)组织的中国传感器产业代表团共计90余人,前往德国参加欧洲传感器领域最大的盛会之一——纽伦堡传感器、展览会(以下简称“SENSOR + ST”),以期通过跨国产业交流,加强国际化合作,加速两国传感器技术发展。作为中国传感器业界的重大国际交流活动,此次中德交流也是两国在传感器领域携手发展的国际平台,成为推动两国产业快速发展的重要推进器。 事实上,依托德国传感与测量技术协会(以下简称“AMA协会”)举办的SENSOR+TEST与依托SIA联盟推动的2017中国 (上海)国际传感器技术与应用展览会(以下简称“SENSOR CHINA 2017”)在加速本土产业发展上有着很好的对标以及合
[机器人]
三峡集团4GW逆变器框架集采:禾望、中建材、阳光电源、上能、科华5家企业入围!
国际能源网/光伏头条(PV-2005)获悉,9月4日,三峡集团2023年光伏逆变器框架集中采购中标候选人公示。深圳市禾望科技有限公司、中建材信云智联科技有限公司、阳光电源股份有限公司、上能电气股份有限公司、科华数据股份有限公司5家企业入围。 根据招标公告,本项目不划分标段,招标范围为三峡集团所属光伏项目所需的300kW及以上的组串式逆变器及其附属设备,预估采购总容量为4GW。 投标人应提供满足要求的组串式逆变器及其设备正常运行所必需的附属装置、备品备件、专用工具以及现场指导安装调试等技术服务工作等,具体如下: 组串式逆变器及其设备正常运行所必需的附属装置、备品备件及专用工具的设计、制造、试验、包装、运输、交货和指导现场安装、提供
[新能源]
东芝推出大容量4GB的micro SDHC存储卡
6月28日东芝公司 ——闪存世界的缔造者在京宣布东芝小型、高速、大容量存储卡家族又添新品--4GB microSDHC存储卡。该新产品将使microSDHC卡阵容进一步扩大,作为手机首选用卡,可以提供256MB至4GB的多种产品。该新产品将从7月上旬开始在全球销售。 东芝4GB microSDHC存储卡以为实现2GB以上大容量而制定的SD存储卡规格Ver2.00为标准。除了可以满足将来手机等市场的大容量化需求以外,使用适配器后,还可以用于搭载SDHC插槽的数码相机及DVC等设备。 近年来,随着搭载处理动画、音乐以及高清晰度图片功能的手机等数码产品不断普及,大容量存储卡的需求也不断扩大。东芝将继续为SDHC及SD存储卡系列扩大并
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved