用LCD1602和矩阵键盘制作一个正整数计算器,有加减乘除和清屏功能。
1.能实现以下功能:
2.矩阵按键排列如图:
3.仿真电路图和效果展示如下:
4.源程序:
#include<reg51.h>
typedef unsigned int uint; //¶¨ÓÚÎÞ·ûºÅint
typedef unsigned char uchar; //¶¨ÒåÎÞ·ûºÅchar
/*****************************¶¨ÒåÒý½Å**********************************/
sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
/*****************************¶¨Òå±äÁ¿**********************************/
uint fuhao,flag,k,i,j,num;
long a,b,c,x;
/*****************************ÑÓʱº¯Êý**********************************/
void delay(unsigned int xms)//ÑÓʱxºÁÃë
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=1;j>0;j--);
return;
}
/*****************************LCDдÃüÁ¡ª¡ª¡ªÎ»ÖÃ**********************************/
void lcdwrc(uint c)
{
delay(100);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(100);
e=0;
}
/*****************************LCDдÊý¾Ý¡ª¡ª¡ª¡ªÄÚÈÝ**********************************/
void lcdwrd(uint dat) //ÉèÖÃLCDдÊý¾Ý
{
delay(100);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(100);
e=0;
rs=0;
}
/*****************************³õʼ»¯LCD**********************************/
void lcdinit() //³õʼ»¯LCD
{
delay(150);
lcdwrc(0x38);//дָÁî38H
delay(50);
lcdwrc(0x38);//ÏÔʾģʽÉèÖÃ
delay(50);
lcdwrc(0x38);
delay(50);
lcdwrc(0x38);//¹¦ÄÜÉ趨ָÁî
lcdwrc(0x08);
lcdwrc(0x01);//ÇåÆÁ
lcdwrc(0x06);//ÏÔʾ¹â±êÒÆ¶¯ÉèÖÃ
lcdwrc(0x0c); //ÏÔʾ¿ª¹Ø¿ØÖÆÖ¸Áî
num=0;//ÓÃÓÚÅж¨°´¼üÊÇ·ñΪ¡°=¡±»òÕß¡°¹éÁ㡱ʱµÄ±äÁ¿
fuhao=0;//ÓÃÓÚÅж¨ÊÇ·ñΪÔËËã·ûºÅ
flag=0;//ÓÃÓÚÅж¨ÔËË㷽ʽʱµÄ±äÁ¿
a=0;//¼ÆËãµÄµÚÒ»¸öÊý
b=0;//¼ÆËãµÄºóÒ»¸öÊý
c=0;//¼ÆËã½á¹û
}
/*****************************ģʽÅж¨º¯Êý**********************************/
/*****************************¼ÆËãÆ÷º¯Êý**********************************/
void KeyDown()//¼ÆËãÆ÷º¯Êý
{
k=0;
P1=0x0f; //0000 11111£¬Ðж¼ÎªµÍµçƽ0£¬Áж¼Îª¸ßµçƽ
if(P1!=0x0f)//P1²»Îª0x0f£¬ÔòÅж¨ÎªÓа´¼ü±»°´ÏÂ
{
delay(100);//Ïû¶¶
if(P1!=0x0f)//ÑÓʱºó£¬ÔÙ´ÎÅжÏ
{
P1=0x0f;//0000 11111£¬Ðж¼ÎªµÍµçƽ0£¬Áж¼Îª¸ßµçƽ
switch(P1)//
{
/********************µÚÒ»ÁÐÓа´¼ü°´ÏÂ*********************/
case 0x07://0000 0111 µÚÒ»ÁÐÓа´¼ü±»°´ÏÂ
{
P1=0xf0;//Áж¼ÎªµÍµçƽ0£¬Ðж¼Îª¸ßµçƽ1
switch(P1)//ÅжÏÄÄÒ»Ðеİ´¼ü±»°´ÏÂ
{
case 0xd0: num =9 /*S1*/;k=7;break; //0111 0000µÚÒ»ÁеÚsÐÐ Êý×Ö7
case 0xb0: num = 5/*S5*/;k=4;break; //1011 0000µÚÒ»ÁеڶþÐÐ Êý×Ö4
case 0x70: num = 1/*S9*/;k=1;break; //1101 0000µÚÒ»ÁеÚÈýÐÐ Êý×Ö1
case 0xe0: num = 13/*S13*/;k=0;break; //1110 0000µÚÒ»ÁеÚËÄÐÐ Áã
}
if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb
a=a*10+k;
else
b=b*10+k;
lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x30±íʾ0£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök
}
while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅжÏ
/********************µÚ¶þÁÐÓа´¼ü°´ÏÂ*********************/
case 0x0b: //0000 1011 µÚ¶þÁÐÓа´¼ü±»°´ÏÂ
{
P1=0xf0;//Ðж¼Îª¸ßµçƽ1£¬Áж¼ÎªµÍµçƽ0
switch(P1)//ÅжÏÄÄÒ»ÐÐÓа´¼ü±»°´ÏÂ
{
case 0xd0: num = 10;k=8;break;//µÚ¶þÁеÚÒ»ÐÐ Êý×Ö8
case 0xb0:num = 6; k=5;break;//µÚ¶þÁеڶþÐÐ Êý×Ö5
case 0x70:num = 2; k=2;break;//µÚ¶þÁеÚÈýÐÐ Êý×Ö2
case 0xe0: num =14;break;//µÈÓÚ=
}
if(num!=14)//°´Ïµļü²»Îª¡°=¡±¼ü
{
if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb
a=a*10+k;
else
b=b*10+k;
lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x3k£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök
}
/************"="¼ü±»°´ÏÂ************/
if(num==14)//°´ÏµļüΪ=¼ü
{
switch(flag)//ÅжϽøÐÐÄÄÖÖÔËËã
{
/*******¼Ó·¨ÔËËã*********/
case 1://¼Ó·¨ÔËËã
{
c=a+b;//¼ÆËã½á¹û
lcdwrc(0x4f/*µÚ¶þÐÐĩβλÖÃ*/+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ
lcdwrc(0x04);//ÉèÖÃÏÔʾ·½Ê½£ºÏÔʾºóÖ¸Õë¼õÒ»£¬¼´Ç°ÒÆÒ»Î»
if(c==0)//Èô½á¹ûΪ0
lcdwrd(0x30);//ÏÔʾ0
while(c!=0)
{
lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ
c=c/10;//È¥µô×îºóһλºóÔÙÑ»·ÏÔʾ
}
lcdwrd(0x3d);//ÏÔʾÍê¼ÆËã½á¹ûºó£¬ÏÔʾ¡°=¡±
}break;
/*******¼õ·¨ÔËËã*********/
case 2://¼õ·¨ÔËËã
{
if(a>b)//´óÊý¼õСÊý
c=a-b;
else//СÊý¼õ´óÊý
c=b-a;//¼ÆËãÁ½ÊýÏà¼õµÄ¾ø¶ÔÖµ
lcdwrc(0x4f+0x80);//½«¹â±êÖÃÓÚµÚ¶þÐÐĩβ
lcdwrc(0x04);//ÉèÖÃÏÔʾ·½Ê½£ºÏÔʾºóÖ¸Õë¼õÒ»
if(c==0)//Èô½á¹ûΪÁã
lcdwrd(0x30);//ÏÔʾ0
while(c!=0)
{
lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ
c=c/10;//È¥µô×îºóһλºóÔÙÑ»·ÏÔʾ
}
if(a<b)//Èô½á¹ûΪ¸ºÊý
lcdwrd(0x2d);//ASCIIÖеġ°-¡±£¬ÏÔʾ¸ººÅ
lcdwrd(0x3d);//ÏÔʾ=
}break;
/*******³Ë·¨ÔËËã*********/
case 3://³Ë·¨ÔËËã
{
c=a*b; //¼ÆËã½á¹û
lcdwrc(0x4f+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ
lcdwrc(0x04);//ÏÔʾÉèÖãºÏÔʾºóÖ¸Õë¼õÒ»
if(c==0)//Èô½á¹ûΪ0
lcdwrd(0x30);//ÏÔʾ0
while(c!=0)
{
lcdwrd(0x30+c%10);//´ÓºóÏòǰÏÔʾ×îºóһλ
c=c/10;//È¥µô×îºóһλºóÔÙÑ»·ÏÔʾ
}
lcdwrd(0x3d);//ÏÔʾ=
}break;
/*******³ý·¨ÔËËã*********/
case 4: //³ý·¨ÔËËã
{
if(b==0)//Èô³ýÊýΪ0
{
lcdwrc(0x01);//ÇåÆÁ
lcdinit();//ÖØÐ³õʼ»¯LCD1602
}
else
{
c=(a/b*1);//ÇóÕû
x=c;
lcdwrc(0x4f+0x80);//¹â±êÖÃÓÚµÚ¶þÐÐĩβ
lcdwrc(0x04);//ÏÔʾÉèÖãºÏÔʾºóÖ¸Õë¼õÒ»
while(c!=0)//һλһλÏÔʾ
{
lcdwrd(0x30+c%10);//ÏÔʾ½á¹ûµÄ×îºóһλÔÚ0x4fµÄλÖÃ
c=c/10;//È¡Ç°ÃæµÄ½á¹ûÊý¾Ý
}
//if(x<1)//Èô½á¹ûСÓÚ1£¬ÔÚ¸öλ²¹0
// lcdwrd(0x30);//¸öλ²¹0
lcdwrd(0x3d);//ÏÔʾ=
k=0;//½«k¶¨»Ø0ÓÃÓÚÏ´μÆËã
}} break;
}}}
while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅжÏ
/********************µÚÈýÁÐÓа´¼ü°´ÏÂ*********************/
case 0x0d: //0000 1101 µÚÈýÁÐÓа´¼ü±»°´ÏÂ
{
P1=0xf0;//Ðж¼Îª¸ßµçƽ1£¬Áж¼ÎªµÍµçƽ0
switch(P1)//ÅжÏÄÄÒ»ÐÐÓа´¼ü±»°´ÏÂ
{
case 0xd0: num=3;k=9;break;//µÚÈýÁеÚÒ»ÐÐ Êý×Ö9
case 0xb0: num=7;k=6;break;//µÚÈýÁеڶþÐÐ Êý×Ö6
case 0x70: num=11;k=3;break;//µÚÈýÁеÚÈýÐÐ Êý×Ö3
case 0xe0: num=15;break;//µÚÈýÁеÚËÄÐÐ ¡°=¡±¼ü
}
if(num!=15)//±»°´Ïµİ´¼ü²»ÊǹéÁã¼ü
{
if(fuhao==0)//fuhao==0£¬±íʾµÚÒ»¸öÊýa£¬fuhao==1£¬±íʾµÚ¶þ¸öÊýb
a=a*10+k;
else
b=b*10+k;
}
lcdwrd(0x30+k);//ÏÔʾ°´ÏµÄÊý£¬0x30ΪASCIIÂëÖÐÊý×Ö×éµÄ¿ªÍ·£¬0x3k£ºÏÔʾk£¬¼´°´ÏÂÊý×Ök
if(num==15)//°´Ïµİ´¼üÊÇÇåÁã¼ü
{
lcdwrc(0x01); //ÇåÆÁÖ¸Áî
lcdinit();//ÖØÐ³õʼ»¯LCD1602
}
}while(P1!=0xf0);break;//µ±Óа´¼ü±»°´ÏÂʱ£¬½áÊø´Ë´ÎÅжϣ¬½øÐÐÏÂÒ»´ÎÅжÏ
/********************µÚËÄÁÐÓа´¼ü°´ÏÂ*********************/
case 0x0e://0000 1110 µÚËÄÁÐÓа´¼ü±»°´ÏÂ
{
fuhao=1;//ÓзûºÅ¼ü±»°´ÏÂ
P1=0xf0;//1111 0000
switch(P1)
{
case 0xe0:/*0111 0000*/flag=4;lcdwrd(0xfd);break;//¡°/¡±µÚËÄÁеÚÒ»ÐÐ
case 0xd0:/*1011 0000*/flag=3;lcdwrd(0x2a);break;//¡°*¡±µÚËÄÁеڶþÐÐ
case 0xb0:/*1101 0000*/flag=2;lcdwrd(0x2d);break;//¡°-¡±µÚËÄÁеÚÈýÐÐ
case 0x70:/*1110 0000*/flag=1;lcdwrd(0x2b);break;//¡°+¡±µÚËÄÁеÚËÄÐÐ
}}
while(P1!=0xf0);break;
}}}}
/*****************************Ö÷º¯Êý**********************************/
void main()
{
lcdinit();//LCD1602³õʼ»¯
lcdwrc(0x01);//LCd1602ÇåÆÁ
while(1)
{
KeyDown();//°´¼üÅжϺ¯Êý
}}