怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦可

作者&投稿:希果 (若有异议请与网页底部的电邮联系)
求大神帮写一液晶+STC89c52单片机+4*4矩阵键盘实现简易计算器的C语言程序,实现加减乘除以及扩展功能~


没有液晶的,以前做了一个有一个数码管的,发给你供参考。
#include#define uchar unsigned char;uchar LED1,LED2,LED3,LED4;uchar keyval,calflag,s_dat,d_dat;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned int number,r_dat;void delay(unsigned int a){unsigned int i,j;for(i=0;i3)number=0;}main(){TMOD = 0x01;number = 0;TH0=0xf4;TL0=0x48;TR0=1;ET0=1;EA=1;LED1=0;LED2=0;LED3=0;LED4=0;while(1){getkey();switch(keyval){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:LED3=LED4;LED4=keyval;LED1=0;LED2=0;break;case 10:break;//"ON"case 11://"="d_dat=LED3*10+LED4;dealdat();break;case 12://"/"calflag=3;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 13://"*"calflag=2;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 14://"-"calflag=1;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 15://"+"calflag=0;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;default:break;}}}

这个比较简单,但是没人会无偿浪费时间给你写的,自己学习吧,多百度。

这是一个用汇编做的计算器,是数码管显示的。
KEYVAL EQU 30H
KEYTM EQU 31H
KEYSCAN EQU 32H
DAT EQU 33H
SCANLED EQU 37H
S_DAT EQU 38H
D_DAT EQU 39H
R_DATL EQU 3AH
R_DATH EQU 3BH
CALFLAG EQU 3CH
FLAG BIT 00H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#01H
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV KEYVAL,#0
MOV P2,#00H
MOV SCANLED,#0
MOV 33H,#0H
MOV 34H,#0H
MOV 35H,#0H
MOV 36H,#0H
MOV S_DAT,#0
MOV D_DAT,#0
CLR FLAG
SETB EA
SETB ET0
SETB TR0
LOOP:
LCALL KEYSEL
MOV A,KEYVAL
CJNE A,#0FFH,LOOP1
SJMP LOOP
LOOP1:
CJNE A,#11,LOOP2 ;“=”
MOV A,33H
MOV B,#10
MUL AB
ADD A,34H
MOV D_DAT,A
LCALL DEALDAT
LCALL HB2
MOV A,R5
ANL A,#0FH
MOV 34H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOV 33H,A
MOV A,R4
ANL A,#0FH
MOV 36H,A
MOV A,R4
SWAP A
ANL A,#0FH
MOV 35H,A
SJMP LOOP
LOOP2:
CJNE A,#15,LOOP3 ;“+”
LCALL GETDAT
SJMP LOOP
LOOP3:
CJNE A,#14,LOOP4 ;“-”
MOV CALFLAG,#1
LCALL GETDAT
SJMP LOOP
LOOP4:
CJNE A,#13,LOOP5 ;“*”
MOV CALFLAG,#2
LCALL GETDAT
SJMP LOOP
LOOP5:
CJNE A,#12,LOOP6 ;"/"
MOV CALFLAG,#3
LCALL GETDAT
SJMP LOOP
LOOP6:
CJNE A,#10,LOOP7 ;数字键
LOOP7:
JC LOOP8
LJMP LOOP
LOOP8:
MOV 33H,34H
MOV 34H,KEYVAL
LJMP LOOP
;------------------
HB2:
MOV R6,R_DATH
MOV R7,R_DATL
CLR  A   ;BCD码初始化
MOV  R3,A
MOV  R4,A
MOV  R5,A
MOV  R2,#10H   ;转换双字节十六进制整数
HB3:
MOV  A,R7   ;从高端移出待转换数的一位到 CY 中
RLC  A
MOV  R7,A
MOV  A,R6
RLC  A
MOV  R6,A
MOV  A,R5   ;BCD码带进位自身相加,相当于乘2
ADDC  A,R5
DA  A   ;十进制调整
MOV  R5,A
MOV  A,R4
ADDC  A,R4
DA  A
MOV  R4,A
MOV  A,R3
ADDC  A,R3
MOV  R3,A   ;双字节十六进制数的万位数不超过6,不用调整
DJNZ  R2,HB3   ;处理完16bit
RET
;------------------
GETDAT:
MOV A,33H
MOV B,#10
MUL AB
ADD A,34H
MOV S_DAT,A
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV 36H,#0
RET
;------------------
DEALDAT:
MOV A,CALFLAG
JNZ DEAL01
DEAL00: ;+
MOV A,S_DAT
ADD A,D_DAT
MOV R_DATL,A
CLR A
ADDC A,#0
MOV R_DATH,A
RET
DEAL01: ;=
DEC A
JNZ DEAL02
CLR C
MOV A,S_DAT
SUBB A,D_DAT
MOV R_DATL,A
SUBB A,#0
MOV R_DATH,A
RET
DEAL02: ;*
DEC A
JNZ DEAL03
MOV A,S_DAT
MOV B,D_DAT
MUL AB
MOV R_DATL,A
MOV R_DATH,B
RET
DEAL03: ;/
MOV A,S_DAT
MOV B,D_DAT
DIV AB
MOV R_DATL,A
MOV R_DATH,#0
RET
;------------------
KEYSEL:
MOV KEYVAL,#0
MOV KEYSCAN,#0EFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS1
MOV KEYVAL,A
SJMP KEYRTN
KEYS1:
MOV KEYSCAN,#0DFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS2
CLR C
ADD A,#4
MOV KEYVAL,A
SJMP KEYRTN
KEYS2:
MOV KEYSCAN,#0BFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS3
CLR C
ADD A,#8
MOV KEYVAL,A
SJMP KEYRTN
KEYS3:
MOV KEYSCAN,#7FH
LCALL GETKEY
MOV A,KEYTM
JZ KEYRTN
CLR C
ADD A,#12
MOV KEYVAL,A
KEYRTN:
LCALL CHGKEY
RET
;--------------------
GETKEY:
MOV KEYTM,#0
MOV A,KEYSCAN
MOV P3,A
NOP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV R2,#10
LCALL DELAY
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV A,P3
ANL A,#0FH
MOV R7,A
SF:
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ SF
MOV A,R7
CJNE A,#0EH,NK1
MOV KEYTM,#1
SJMP NOKEY
NK1:
CJNE A,#0DH,NK2
MOV KEYTM,#2
SJMP NOKEY
NK2:
CJNE A,#0BH,NK3
MOV KEYTM,#3
SJMP NOKEY
NK3:
CJNE A,#07H,NOKEY
MOV KEYTM,#4
NOKEY: RET
;--------------------
DELAY:
MOV R3,#50
DELAY1:
MOV R4,#100
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
;--------------------
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0
MOV DPTR,#LEDTAB
T000: ;数字显示
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T001
MOV P2,#01H
SJMP T0DIS
T001:
DEC A
JNZ T002
MOV P2,#02H
SJMP T0DIS
T002:
DEC A
JNZ T003
MOV P2,#04H
SJMP T0DIS
T003:
MOV P2,#08H
T0DIS:
MOV A,@R0
MOVC A,@A+DPTR
; CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
ANL A,#03H
MOV SCANLED,A
POP ACC
RETI
;--------------------
CHGKEY:
MOV A,KEYVAL
JZ KV16
DEC A
JNZ KV01
MOV KEYVAL,#7
RET
KV01:
DEC A
JNZ KV02
MOV KEYVAL,#4
RET
KV02:
DEC A
JNZ KV03
MOV KEYVAL,#1
RET
KV03:
DEC A
JNZ KV04
MOV KEYVAL,#10
RET
KV04:
DEC A
JNZ KV05
MOV KEYVAL,#8
RET
KV05:
DEC A
JNZ KV06
MOV KEYVAL,#5
RET
KV06:
DEC A
JNZ KV07
MOV KEYVAL,#2
RET
KV07:
DEC A
JNZ KV08
MOV KEYVAL,#0
RET
KV08:
DEC A
JNZ KV09
MOV KEYVAL,#9
RET
KV09:
DEC A
JNZ KV10
MOV KEYVAL,#6
RET
KV10:
DEC A
JNZ KV11
MOV KEYVAL,#3
RET
KV11:
DEC A
JNZ KV12
MOV KEYVAL,#11 ;=
RET
KV12:
DEC A
JNZ KV13
MOV KEYVAL,#12 ;/
RET
KV13:
DEC A
JNZ KV14
MOV KEYVAL,#13 ;*
RET
KV14:
DEC A
JNZ KV15
MOV KEYVAL,#14 ;-
RET
KV15:
DEC A
JNZ KV16
MOV KEYVAL,#15 ;+
RET
KV16:
MOV KEYVAL,#0FFH
RET
;--------------------
LEDTAB:
DB 0C0H ;"0" 00H
DB 0F9H ;"1" 01H
DB 0A4H ;"2" 02H
DB 0B0H ;"3" 03H
DB 99H ;"4" 04H
DB 92H ;"5" 05H
DB 82H ;"6" 06H
DB 0F8H ;"7" 07H
DB 80H ;"8" 08H
DB 90H ;"9" 09H
DB 88H ;"A" 0AH
DB 83H ;"B" 0BH
DB 0C6H ;"C" 0CH
DB 0A1H ;"D" 0DH
DB 86H ;"E" 0EH
DB 8EH ;"F" 0FH
DB 0FFH ;" " 10H
;--------------------
END


KEYBUF EQU 40H ;键号存放单元
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值
MOV R0,#30H ;显示首地址
MOV R2,#0CH ;计算数据存放单元个数
CLR A
QING: MOV @R0,A ;将数据存放单元清零
INC R0
DJNZ R2,QING
MOV P0,#8FH ;关闭显示
MOV R1,#30H ;将显示首地址存放R1里


能不能用mcs-51单片机做一个4x4矩阵键盘及四位显示电路 实现四位数加 ...
这个是可以做的,不过数码管位数还是少了,四位数加减,要用5位数码管才能正确显示结果,加法的结果可能出现5位。减法的结果,可能出现负数和4位值,这都需要5位数码管才能显示出来。至于实现代码,百度一下,有很多的,下来后稍加修改就可以了。不要期望得到完全符合你要求的代码,那样一方面出现几率较...

如何利用51单片机4*4矩阵键盘和1602液晶实现四位(或者多位)的显示问...
\/\/按4X4键盘的F键 进入设定状态 \/\/E D 键是前后移动键 \/\/C按键是调整数值按键 include "reg52.h"define uchar unsigned char sbit RW=P2^1;sbit RS=P2^0;sbit E=P2^2;bit at=0;uchar code shen[]={"CLOCK!"};uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,...

求简单的51系列单片机控制4*4矩阵键盘显示电路图 带上程序
include <intrins.h> define uchar unsigned char define uint unsigned int sbit sound=P3^6;uchar code tab[]= { 0xC0,\/*0*\/ 0xF9,\/*1*\/ 0xA4,\/*2*\/ 0xB0,\/*3*\/ 0x99,\/*4*\/ 0x92,\/*5*\/ 0x82,\/*6*\/ 0xF8,\/*7*\/ 0x80,\/*8*\/ 0x90,\/*9*\/ 0x88,\/*A*\/ 0x83,\/...

关于一个c51单片机的4*4矩阵键盘扫描程序,我用keil运行,总是有错误...
\/\/单片机:使用51系列兼容的即可;\/\/4×4矩阵键盘:接在P1口;\/\/两位数码显示器: P0口输出七段码,P2口输出位选码。\/\/=== \/\/C语言程序如下。\/ 文件名: KEY_LED.c 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。\/ include <reg51.h> include <intrins.h> define uint un...

怎么用51单片机4*4键盘实现简单计算器 就要加减就可以 汇编语言 麻烦...
这是一个用汇编做的计算器,是数码管显示的。KEYVALEQU 30HKEYTMEQU 31HKEYSCANEQU 32HDATEQU 33HSCANLEDEQU 37HS_DATEQU 38HD_DATEQU 39HR_DATLEQU 3AHR_DATHEQU 3BHCALFLAGEQU 3CHFLAGBIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,...

求由51单片机控制4x4键盘输入,4个数码管(采用动态扫描)显示 C语言编...
可以这样写,先计算按了几下了,按下若小于4次,让四个段选端前几个端导通,按下数超过或等于4次你就可以用扫屏的方式来显示就好了。比如第一下按的是8你就可以设置if和else语句组合啊!先有个数组d[]={0xf7;0xfb;0xfd;0xfe}\/\/段选,按了几下设为变量uint a\/\/无符号字符型,if(a<4...

51单片机 c语言编程 4*4矩阵键盘如何实现等待按键松开功能?
if(key_l!=0xf0){ delay_nms(5);key_l=P1;……在第4行加 while( key_l!=0xf0 );等待按键释放,按键不放开就一直在此处等待,知道按键释放,此语句执行完。再往下执行

单片机S51设计一个计算器 求键盘程序(4*4)
键盘扫描+键值转换的方法。4*4的矩阵键盘,我使用不开中断的反转法来做,简单来说就是将横列置1纵列置0,检测到案件后再纵列置1横列置0,这样就可以扫描到按键的特征码了。以下是我早期写的一段程序,你学单片机的,端口怎么用,#define怎么写我不用教了吧。unsigned char scan_key(){ unsigned ...

51单片机4*4键盘,输入数据到数组中
LZ可以考虑在键值处理函数中加入这个试试 if(功能键按下){ NUM++;\/\/NUM为数组的下标 此处应加数组元素个数的判断,防止“越界”if(NUM小于数组元素个数){ a[NUM]=function(输入单个数据);} }

51单片机4*5键盘程序。
这是我花两个多小时写得51单片机,矩阵键盘的显示,希望能对你有帮助;include<reg52.h> define uchar unsigned char define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit dula=P2^6;sbit wela=...

涟源市18898163812: 简单的51系列单片机控制4*4矩阵键盘显示电路图 -
陟盼艾诺: 可以在P0.0/P0.1/P0.2/P0.3四个I/O口上每个接四个按键,,在P0.4/P0.5/P0.6/P0.7四个口线上与前面的四个口线上的按键交插相连,这样可以通过查询的方式,比如是第查到P1.0口上有按键按下了,再转向查看P0.1,P0.5,P0.6,P0.7哪个口的电平发生的变化,这样就很容易找到是哪个按键了

涟源市18898163812: 51单片机 如何4*4矩阵键盘输入按键 继电器输出信号 -
陟盼艾诺: ........... Inter0_process() interrupt 2 //外部中断1 { Key_scan();//你的键盘扫描程序(中断服务程序),一旦触发中断,将运行至本段. } //主程序main() {........... ........... ........... EX1=1; //开中断一 P3.3 IT1=1; //下降沿触发 ET1=1; EA=1;........... ...........} 注:图中的键盘接法都是独立按键接发,矩阵键盘没有见过能直接触发中断的.

涟源市18898163812: 51单片机4*4矩阵键盘如何同时实现单击+双击的功能? -
陟盼艾诺: 一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击.何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击.那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零.这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键.

涟源市18898163812: 通过单片机外接一个4*4矩阵键盘,设置“0 - 9”启动”10个按键,进行30秒倒计时显示通过2位数码管实时显示 -
陟盼艾诺: 1.编码按钮分别为0,1,2,……,9十个按键:可以用矩阵键盘实现,2.用发光二极管作为输出指示灯,灯亮代表锁“开”,灯灭代表锁“不开”,用一个IO口,接上二极管,接上限流电阻,接地.密码正确,另该IO口值为1,否则为0;3.设置开锁密码...

涟源市18898163812: (80C51单片机)设计4*4键盘及8位数码管显示构成的电子密码锁.的C语言程序. -
陟盼艾诺: 4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按 键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键#include #include //头文...

涟源市18898163812: 单片机S51设计一个计算器 求键盘程序(4*4) -
陟盼艾诺: 键盘扫描+键值转换的方法.4*4的矩阵键盘,我使用不开中断的反转法来做,简单来说就是将横列置1纵列置0,检测到案件后再纵列置1横列置0,这样就可以扫描到按键的特征码了.以下是我早期写的一段程序,你学单片机的,端口怎么用,#...

涟源市18898163812: 求由51单片机控制4x4键盘输入,4个数码管(采用动态扫描)显示 C语言编程思路! -
陟盼艾诺: 可以这样写,先计算按了几下了,按下若小于4次,让四个段选端前几个端导通,按下数超过或等于4次你就可以用扫屏的方式来显示就好了.比如第一下按的是8你就可以设置if和else语句组合啊!先有个数组d[]={0xf7;0xfb;0xfd;0xfe}//段选,按了几下设为变量uint a//无符号字符型,if(a<4){if(a=1)P2=d[a-2];P1=data[8];delay();········if(a-1){··········}if(a-2){··········}};else(············)太多了我就不写了.

涟源市18898163812: 本人小白.求高手告知最简单的51单片机的4*4键盘扫描电路所用的元器件.电源是5V
陟盼艾诺: 单片机AT89S51(1片) 晶振12MHz(1个) 22电容(2个) 10u电容(1) 10K电阻(1个) 轻触开关(16个) 数码管(1个) 导线若干 如要电路图 H! 我

涟源市18898163812: 51单片机如何通过4*4矩阵键盘输入一个两位数,送给一个变量?求助... -
陟盼艾诺: 设置其中的一个按键,定为标志位 如果没有按下标志位 则 a=a*10+key ; //key为按键值

涟源市18898163812: 51单片机如何把用4*4矩阵键盘把一位数变两位数 -
陟盼艾诺: h=x/16; l=x%16

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网