首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >单片机原理及接口技术实验报告-4x4开关+1602显示屏模拟电话拨号(开源)

单片机原理及接口技术实验报告-4x4开关+1602显示屏模拟电话拨号(开源)

作者头像
用户6948990
发布2025-04-03 18:44:20
发布2025-04-03 18:44:20
2180
举报
文章被收录于专栏:wuterwuter

实验报告:

电话号码

源码:

代码语言:javascript
复制
/*重要程序说明:
①键盘扫描函数:先将行线置低电平,检查列线是否出现低电平,从而确定被按下的键的列数;同理,将列线置低电平,即可确定被按下的键的行数,通过行数和列数两个数据即可确定键盘的位置。
②LCD写命令及写数据函数:注意RS、RW、E的定义,以及E是持续电平还是脉冲电平。
③删除键的实现:首先指针左移一位(移位时注意要设计函数检验是否超过第二行显示范围),DDRAM值减一,然后在上一个字符处输出空白(LCD字符码0x20)。
④清屏键的实现:思路是把第二行的16个位置输出空白符号(0x20),设计简易循环语句即可实现。*/

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar keycode,DDram_value=0xc0;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
sbit speaker=P2^3;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};//0x20为空白
uchar code table_designer[]=" 1606 Qi GeGe ";//第一行显示机设1606亓哥哥
void lcd_delay();
void delay(uint n);
void lcd_init(void);//LCD初始化函数
void lcd_busy(void);//读忙函数
void lcd_wr_con(uchar c);//写命令函数
void lcd_wr_data(uchar d); //写数据函数
uchar checkkey(void);
uchar keyscan(void);
void main()
{ 
    uchar num;
	lcd_init();
	lcd_wr_con(0x80);
	for(num=0;num<=14;num++)
	{
	  lcd_wr_data(table_designer[num]);
	}
	while(1)
	{
	   keycode=keyscan();
	   if((keycode>=0)&&(keycode<=9))
	   {
	      lcd_wr_con(0x06);
		  lcd_wr_con(DDram_value);
	      lcd_wr_data(table[keycode]); 
		  DDram_value++;
	   }
	   else if(keycode==0x0a)
	   {
	   	  lcd_wr_con(0x04);
		  DDram_value--;
		  if(DDram_value<=0xc0)
		  {
		  	 DDram_value=0xc0;
		  }
		  else if(DDram_value>=0xcf)
		  {
		  	 DDram_value=0xcf;
		  }
		  lcd_wr_con(DDram_value);
		  lcd_wr_data(table[10]); 
	   }
	   else if(keycode==0x0b)
	   {
	   	  uchar i,j;
		  j=0xc0;
		  for(i=0;i<=15;i++)
		  {
		    lcd_wr_con(j);
		  	lcd_wr_data(table[10]);
			j++;
		  }
		  DDram_value=0xc0;
	   }
	}

}
void lcd_delay()
{
  uchar y;
  for(y=0;y<0xff;y++)
  {
  	 ;
  }
}
void lcd_init(void)
{
   lcd_wr_con(0x01);
   lcd_wr_con(0x38);
   lcd_wr_con(0x0c);
   lcd_wr_con(0x06);
}
void lcd_busy(void)
{
  P0=0xff;
  rs=0;
  rw=1;
  e=1;
  e=0;
  while(P0&0x80)
  {
  	 e=0;
	 e=1;
  }
  lcd_delay();
}
void lcd_wr_con(uchar c)
{
   lcd_busy();
   e=0;
   rs=0;
   rw=0;
   e=1;
   P0=c;
   e=0;
   lcd_delay();
}
void lcd_wr_data(uchar d)
{
   lcd_busy();
   e=0;
   rs=1;
   rw=0;
   e=1;
   P0=d;
   e=0;
   lcd_delay();
}
void delay(uint n)
{
   uchar i;
   uint j;
   for(i=50;i>0;i--)
     for(j=n;j>0;j--);
}
uchar checkkey(void)
{
	uchar temp;
	P1=0xf0;
	temp=P1;
	temp=temp&0xf0;
	if(temp==0xf0)
	{
	   return(0);
	}
	else
	{
	   return(1);
	}
}
uchar keyscan(void)
{
   uchar hanghao,liehao,keyvalue,buff;
   if(checkkey()==0)
   {
   	  return(0xff);
   }
   else
   {
	     uchar sound;
		 for(sound=50;sound>0;sound--)
		 {
		 	speaker=0;
			delay(1);
			speaker=1;
			delay(1);
		 }
		 P1=0x0f;
		 buff=P1;
		 if(buff==0x0e)
		 {
		      hanghao=0;
		 }
		 else if(buff==0x0d)
		 {
		      hanghao=3;
		 }
		 else if(buff==0x0b)
		 {
		      hanghao=6;
		 }
		 else if(buff==0x07)
		 {
		      hanghao=9;
		 }
		 P1=0xf0;
		 buff=P1;
		 if(buff==0xe0)
		 {
		   liehao=2;
		 }
		 else if(buff==0xd0)
		 {
		 	liehao=1;
		 }
		 else if(buff==0xb0)
		 {
		    liehao=0;
		 }
		 keyvalue=hanghao+liehao;
		 while(P1!=0xf0);
		 return(keyvalue);
   }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档