超声波测距模块加上矩阵按键,矩阵按键移植上周期计算器内容,对矩阵键盘进行操作
for(i=0;i<4;i++)
{
P1=key[i];
temp=P1;
temp=temp<<4|0x0f;
for(j=0;j<4;j++)
{
if(key1[j]==temp)
{
number=i*4+j;//对按键扫扫描结果进行记录
...........
如上操作可以对矩阵键盘进行较为简洁的扫描。
程序运行理念:
超神波不断测距 并进行数据的显示(lcd),在不断显示的同时,进行按键扫描。在此过程中增加了多个传值变量如下程序:
void doing()
{
res=measure();//
res0=res;/有两个值获得超神波测距结果 res res0 res0 用于报警判断 res 用于测距显示
do{
k++;
res1=res1/10;
}while(res1);
keysure();//
warn=b;/使用变量warn 储存按键积累数值 并保存下来用于警报判断
if(l-k>0)
{
k=0;
l=0;
wcmd(0x01,0);
w=4;
flagx=0;
wcmd(0x04,1);//
wcmd(0xcf,1);
do
{
wdat(0x30+warn1%10);//warn1=warn1/10;
delay_50us(100);
}while(warn1);
}
else{
k=0;
l=0;
}
if(res!=0)
{
wcmd(0x04,1);//
wcmd(0x8f,1);
do
{
wdat(0x30+res%10);//
l++;
res=res/10;
delay_50us(100);
}while(res);
}
if(res0>warn)//警报判断
{
do {
beep=~beep;
delay_20us(20);
flag++;
if(flag>300)
{
flag=0;
warn=0;
}
}while(warn);
}
}
程序封装 :
利用函数定义与函数调用 对程序中使用到的函数进行封装 主函数封装如下:
void main()//主函数
{
init1();//lcd初始化
while(1)
{
doing();//函数调用
}
}
体会:
程序完成过程中,需要使用较多变量和标志位,在使用时,采用显示用后定义,有时还需要清零 分清内部联系与变量运行所在的函数。
例程:(功能:超神波测距,按键设置警报距离)
/********************************************************
***********¾ØÕó°´¼üÍê³É»ù±¾¼ÆËãÆ÷¹¦ÄÜͬʱ¼æÓб¨´í¹¦ÄÜ****
********************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BF 0x80 //ÓÃÓÚ¼ì²âæÐźÅ
sbit rs=P2^6;// 1602
sbit rw=P2^5;// ʹÄÜ
sbit e=P2^7;// ¿ØÖƶË
sbit Tr=P3^4; //³ö·¢¿ØÖÆÐźÅÊäÈë
sbit Ec=P3^5; //»ØÏìÐźÅÊä³ö
bit TimeUp=0; //¶¨Ê±Æ÷¿ªÊ¼¼Æʱ±ê־λ
sbit beep=P1^5;//·äÃùÆ÷
int w=4;//lcdͨ¹ý±äÁ¿ÒÆλ
uint flagx=0;//¾àÀëλÊý±ä»¯
int warn1=0;
int k=0,l=0;// l µ±Ç°²âÁ¿¾àÀëµÄλÊý k ÉÏÒ»²âÁ¿¾àÀëµÄλÊý
uint flags=0;
uint flag=0;
int res1=0;//²âÁ¿½á¹û
uint res;//²âÁ¿½á¹û
uint res0=0;//½á¹ûÖмä±äÁ¿
uint warn=0;//°²È«¾àÀëÖмä±äÁ¿
uchar code tab1[]={'c',0,'=','+',1,2,3,'-',4,5,6,'*',7,8,9,'/'};//°´¼ü¶ÔÓ¦µÄ¼üÖµ ֻʹÓÃÊý×Öλ
ulong b=0;//´¢´æ¼üÖµ±äÁ¿
uchar number;//°´¼ü±êºÅ
uchar code key[]={0xef,0xdf,0xbf,0x7f};//ÐÐɨÃè°´¼ü
uchar code key1[]={0x7f,0xbf,0xdf,0xef};//ÁÐɨÃè°´¼ü
long th0,tl0; //´¢´æ¶¨Ê±Æ÷µÄÖµ
ulong timer0=0; //´ú±í¶¨Ê±Æ÷¶¨Ê±½á¹û
uint Mersureresult=0;//²âÁ¿Ê®½øÖÆÊý±äÁ¿
void delay_50us(uchar t) //ÑÓʱº¯Êý
{
uint i;
for(t;t>0;t--)
for(i=1;i<6245;i--);
}
void delay_20us(uchar i) //¶ÌÔÝÑÓʱº¯Êý
{
while(i--);
}
void delay(uint z) //ÑÓʱº¯Êý
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
uchar busy() //æ¼ì²âº¯Êý
{
rs=0;
rw=1;
e=1;
delay(1) ;
while(P0&BF); //¼ì²âÊý¾Ýλ×î¸ßλµÄÊÇ·ñΪ0(ÔÊÐíдÈë)
e=0;
return P0;
}
void wdat(uchar dat) //дÊý¾Ýº¯Êý
{
P0=dat;
busy();
rs=1;
rw=0;
delay(5);
e=1;
delay(5);
e=0;
}
void wcmd(uchar cmd,uchar BFC) //дÃüÁÊý(²¿·ÖÃüÁî²»ÐèÒª¼ì²â±ê־λ)ÈçÇåÆÁÃüÁî
{
P0=cmd;
if(BFC)
busy();
rs=0;
rw=0;
delay(5);
e=1;
delay(5);
e=0;
}
void init1() //³õʼ»¯º¯Êý
{
e=0;
wcmd(0x38,0);//2*16 ÏÔʾ 5*7 ÏÔʾ 8λÊý¾Ý
wcmd(0x38,0);
wcmd(0x38,0);
wcmd(0x38,1);
wcmd(0x01,1); //ÇåÆÁ
wcmd(0x06,1); //µØÖ·×Ô¶¯¼ÓÒ»
wcmd(0x0c,1); //¿ªÏÔʾÆÁ ÎÞ¹â±ê
wcmd(0x01,1); //ÇåÆÁ
}
int measure() //¶¨Òå²âÁ¿º¯Êý
{
uchar Rxback=1; //³¬Éù²¨·µ»Ø±ê־λ
TMOD=0X01; //´ò¿ª¶¨Ê±Æ÷¿ª¹Ø
Tr=0; //³¬Éù²¨Âö³åÒý½ÅÀµÍ
th0=0; //³õʼ»¯
tl0=0;
TimeUp=0;
EA=1; //´ò¿ªÖжÏ×Ü¿ª¹Ø
ET0=1; //´ò¿ª¼ÆʱÆ÷¿ª¹Ø
TR0=0; //´ò¿ªÖжϿª¹Ø
TH0=0;
TL0=0;
Tr=1; //³¬Éù²¨Âö³åÒý½ÅÀ¸ß
delay_20us(100);
Tr=0; //³¬Éù²¨Âö³åÒý½ÅÀµÍ²úÉúÂö³å
while(Ec==0);//µÈ´ý»Ø²¨Öøߵçƽ1
TH0=0;
TL0=0;
TR0=1;
while(Rxback) //ʹÓÃÈí¼þ²éѯ·½Ê½£¬¼ì²â³¬Éù²¨»Ø²¦Òý½Å£¬ÅжÏÊÇ·ñÓÐÉù²¨·µ»Ø
{
if(Ec==0||TimeUp==1)
{
TR0=0;
th0=TH0;
tl0=TL0;
TR0=1;
Rxback=0;
}
}
while(!TimeUp); //µÈ´ý¶¨Ê±Æ÷Òç³ö
timer0=(th0*256+tl0); //È¡³ö¶¨Ê±Æ÷Öµ
Mersureresult=((unsigned long)(340)*timer0)/2000; //²âÁ¿½á¹ûµ¥Î»mm
if(Mersureresult<20||Mersureresult>4000)
{
Mersureresult=0;
}
return Mersureresult;
}
void ankey() //È¡°´¼üÊäÈëÖµnumber
{
uchar i,j,temp;
for(i=0;i<4;i++)
{
P1=key[i];
temp=P1;
temp=temp<<4|0x0f;
for(j=0;j<4;j++)
{
if(key1[j]==temp)
{
number=i*4+j;
switch(number)
{
case 0:{wcmd(0x01,1);b=0;w=4;} break; //Çå³ý°´¼ü
case 4://1 Êýֵλ
case 5://2
case 6://3
case 8://4
case 9://5
case 10://6
case 12://7
case 13://8
case 14://9
case 1: //0
b=b*10+tab1[number]; //µÚ¶þ¸öÊýÖµµÃת»»
wcmd(0xcb+w,0);
w--;
wdat(0x30+tab1[number]);//0x30¶ÔÓ¦ACIIÂëΪ0 number¿ÉÄÜΪ 0 1 4 5 6 8 9 10 12 13 14
break;
default:break;
}
}
while((key[i]!=P1)&&(key1[j]!=P1))
P1=key[i];
P1=key1[j];
delay(3);
}
}
}
void keysure()//ÑÓʱÏû¶¶
{
P1=0x0f;
if((P1&0x0f)!=0x0f)
{
delay(10);
if((P1&0x0f)!=0x0f)
ankey(); //È¡°´¼üÊäÈëÖµnumber
}
}
void doing()
{
res=measure();//¾àÀë»ñÖµ
// res1=res;
res0=res;//½á¹û´æÖµ
do{
k++;
res1=res1/10;
}while(res1);
keysure();//ÑÓʱÏû¶¶ °²È«¾àÀë»ñÖµ
// warn1=b;
warn=b;//°²È«¾àÀë´æÖµ
if(l-k>0)
{
k=0;
l=0;
wcmd(0x01,0);
w=4;
flagx=0;
wcmd(0x04,1);//Ö¸Õë¼õÒ»
wcmd(0xcf,1);
do
{
wdat(0x30+warn1%10);//¾àÀëÏÔʾ
warn1=warn1/10;
delay_50us(100);
}while(warn1);
}
else{
k=0;
l=0;
}
if(res!=0)
{
wcmd(0x04,1);//Ö¸Õë¼õÒ»
wcmd(0x8f,1);
do
{
wdat(0x30+res%10);//¾àÀëÏÔʾ
l++;
res=res/10;
delay_50us(100);
}while(res);
}
if(res0>warn)//¾¯±¨ÅжÏ
{
do {
beep=~beep;
delay_20us(20);
flag++;
if(flag>300)
{
flag=0;
warn=0;
}
}while(warn);
}
}
void main()//Ö÷º¯Êý
{
init1();//LED³õʼ»¯
while(1)
{
doing();
}
}
void inter0() interrupt 1
{
TimeUp=1;
}