历史上的今天
今天是:2024年11月13日(星期三)
2019年11月13日 | 单片机做简易计算器源码(矩阵键盘输入+1602显示)
2019-11-13 来源:51hei
需要准备的元器件:
1.stc89c52rc (本源码使用的mcu)
2.1602液晶模块
3.4*4矩阵键盘
单片机最小系统就可以,然后需要16个微动开关做成4*4矩阵键盘 。
我用的lcd io定义为sbit rw=P3^6;
sbit rs=P3^5;
sbit e=P3^4;觉得接线不方便的可以改 。
4*4矩阵键盘的定义 S16 S12 S8 S4分别是1 2 3 +
S15 S11 S7 S3分别是4 5 6 - -
S14 S10 S6 S2分别是7 8 9 *
S13 S9 S5 S1分别是0 CLR = /
附:4*4矩阵键盘的原理图,单片机最小系统,程序源码。
注:源码来自X宝的一家店铺
单片机源程序如下:
/* 实现两个数的运算,每个数的位数至少可以八位 */
#include typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P3^6; sbit rs=P3^5; sbit e=P3^4; sbit led=P3^7; sbit beep=P2^0; uint8 key,num; uint8 fuhao;//定义具体的那个符号,是加减还是乘除。 uint8 flag; //定义有没有按下符号键,这个是统称 long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量 uint8 k; //定义小数点后面显示的位数 uint8 biao; uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30, 0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据 void delay(uint16 i) { while(i--); } void lcdwrc(uint8 c) { delay(1000); rs=0; rw=0; e=0; P0=c; e=1; delay(1000); e=0; } void lcdwrd(uint8 dat) { delay(1000); rs=1; rw=0; e=0; P0=dat; e=1; delay(1000); e=0; rs=0; } void lcdinit() { delay(1500); lcdwrc(0x38); delay(500); lcdwrc(0x38); delay(500); lcdwrc(0x38); delay(500); lcdwrc(0x38); lcdwrc(0x08); lcdwrc(0x01); lcdwrc(0x06); lcdwrc(0x0c); key=0; num=0; flag=0; fuhao=0; a=0; b=0; c=0; d=0; biao=0; led=0; } void keyscan() { P1=0xfe; //令第一行为0,然后判断是哪一列按下 if(P1!=0xfe) { delay(1000); if(P1!=0xfe) { key=P1&0xf0; switch(key) { case 0xe0: num=0;break; //1 case 0xd0: num=1;break; //2 case 0xb0: num=2;break; //3 case 0x70: num=3;break; //加 } } while(P1!=0xfe); if(num==0||num==1||num==2) //确认第一行的数1,2,3 { if(flag==0) //没有按下符号键 { //led=1; a=a*10+dat1[num]; } else { //led=1; b=b*10+dat1[num]; } } if(num==3) { //led=0; flag=1; fuhao=1;//加号+ } lcdwrd(0x30+dat1[num]); } P1=0xfd; //令第二行为0,判断是哪一列按下 if(P1!=0xfd) { delay(1000); if(P1!=0xfd) { key=P1&0xf0; switch(key) { case 0xe0: num=4;break; //4 case 0xd0: num=5;break; //5 case 0xb0: num=6;break; //6 case 0x70: num=7;break; //减— } } while(P1!=0xfd); if(num==4||num==5||num==6) { if(flag==0) //没有按下符号键 { //led=1; a=a*10+dat1[num]; } else { //led=1; b=b*10+dat1[num]; } } else { flag=1;
史海拾趣
|
想像一下,如果有这么一个“裸体”温度计,就放在自己家里的书柜上,等朋友来了,一定会吸引不少眼光,你也可以借机炫耀一番。 不过放在家里的话,有可能曝光率不够高,那我们就随身携带好了,就像劳力士一样,经常“不经意”的掏出来看看:P ...… 查看全部问答> |
|
找工作,大家帮忙介绍下工作啊,上海或者苏州,南京周围的,Windows Mobile 或者Android的应用程序开发啊! RT,本人有一年的Windows Mobile和Android的开发经验。谢谢各位啦!… 查看全部问答> |
|
STC12c5a单片机外扩flash,使用XBYTE读取flash的数据 我最近遇到一个问题,请教各位高手。 STC12c5a单片机,外扩flash,p0口复用为低8位地址线和8位数据位,p2为高8位地址线。 我使用XBYTE读取flash的数据,总有读错的情况发生。程序如下: ReadData=XBYTE[BankAddress]; _nop_(); & ...… 查看全部问答> |
|
本人有南京万利51仿真器一台. 8成新(用过一个多月). 欲转让给需要者. 仿真器见以下连接. http://www.manley.com.cn/chinese/ice/se52hu.htm 联系: littleliu97@sohu.com… 查看全部问答> |
|
求推荐这样一个BOOST电路。(不能外加电源)输入电压范围是17~170V,输出28V。由于这个范围太大,想进行两级变换,前级BOOST升压,将17~34V升到34V,后级将34~170降为28V。前端设计一个BOOST电路,当输入为17~34V时通过BOOST进行升压;当输入为34~1 ...… 查看全部问答> |




