这个很容易嘛,你先设置一个寄存器,然后一直扫描两个按键(假设K1按下为加,K2按下为减),假设检测到K1被按下,寄存器就加1,如果检测到K2被按下,寄存器就减1;然后再调用显示函数就OK了。、
1、新建项目:打开VS2010-文件-新建-项目-MFC应用程序-名称(计算器)。
2、设置应用程序类型:点选为基于对话框,新建一个基于对话框的程序。如下图所示。
3、调整对话框:删除对话框内所有控件,并将对话框调整至合适大小,如下图所示。
4、添加编辑框:添加三个编辑框加数1、加数2、和。ID分别设置IDC_ADD1、IDC_ADD2、IDC_SUM。和的属性Read Only设置为true,其余的默认。如下图所示。
5、添加静态文本:添加五个静态文本控件分别修改Caption为加数1,加数2,加运算符,和、+,=。如下图所示。
6、添加计算按钮:添加一个计算按钮,设置Caption为计算,ID为ID_ADD。如下图所示。
7、编辑代码:添加如下代码计算结果UpdateData(true);//读取编辑框的值到关联的值变量中m_sum=m_add1+m_add2;//计算结果存到编辑框的关联变量中UpdateData(false);//将计算的结果显示到编辑框中。
8、运行测试:编译运行,输入数值分别输入两个加数然后点击计算按钮,效果如下图所示。
K2 BIT P14 //+
K3 BIT P15 //-
K4 BIT P16 //CLR
K_OLD EQU 30H
K_NEW EQU 31H
K_COUNT EQU 32H
S_BUF EQU 33H
DISSTART EQU 40H ;显示单元首地址
LED_DATA EQU P0 ;数码管数据口定义
;---------------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0080H
;---------------------------------------------------------
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV K_OLD,#00H
MOV K_NEW,#00
MOV K_COUNT,#00H
MAIN1:
CALL CONVT
CALL PLAY
CALL KEY_PROG
JMP MAIN1
KEY_PROG:
CALL K_SCAN ;键扫描
MOV A,K_NEW
CJNE A,K_OLD,KEY_P1
JMP KEY_P_END
KEY_P1:
MOV K_OLD,A
CJNE A,#1, NEXT_K1
AJMP LOOP1
NEXT_K1:
CJNE A,#2, NEXT_K2
AJMP LOOP2
NEXT_K2:
CJNE A,#3, KEY_P_END
AJMP LOOP3
LOOP1:
INC K_COUNT ;键计数加1
JMP KEY_P_END
LOOP2:
DEC K_COUNT ;键计数减1
JMP KEY_P_END
LOOP3:
MOV K_COUNT,#00 ;键计数单元清零
JMP KEY_P_END
KEY_P_END:
CALL PLAY
JNB K2,KEY_P_END
JNB K3,KEY_P_END
JNB K4,KEY_P_END
RET
;---------------------------------------------------------
;代码变换 (HEX TO BCD)
;---------------------------------------------------------
CONVT:
MOV A,K_COUNT
MOV B,#100
DIV AB
MOV DISSTART+2,A ;百位存放在DISSTART+2
MOV A,#10
XCH A,B
DIV AB
MOV DISSTART+1,A ;十位存放在DISSTART+1
MOV DISSTART+0,B ;个位存放在DISSTART
RET
;---------------------------------------------------------
; 键扫描子程序
;---------------------------------------------------------
K_SCAN:
SETB K2
JB K2 ,NEXT_KEY1
AJMP KEY1_DOWN //加1
NEXT_KEY1:
SETB K3
JB K3 ,NEXT_KEY2
AJMP KEY2_DOWN //减1
NEXT_KEY2:
SETB K4
JB K4 ,END_KEY
AJMP CLEAR_KEY
CLEAR_KEY:
MOV A,#3
JMP END_KEY1
KEY1_DOWN: // 加1键按下
MOV A,#1
JMP END_KEY1
KEY2_DOWN: //
MOV A,#2
JMP END_KEY1
END_KEY1:
MOV K_NEW,A
AJMP EXIT_KET
END_KEY:
MOV K_NEW,#0
EXIT_KET:
RET
;---------------------------------------------------------
;延时子程序
;---------------------------------------------------------
DELAY:
MOV R6,#200
DEL:
MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL
RET
;---------------------------------------------------------
PLAY:
MOV R0,#DISSTART ;获得显示单元首地址
MOV R1,#0feH ;从第一个数码管开始
MOV R2,#04H ;共显示3位数码管
DISP1:
MOV A,@R0 ;获得当前位地址
MOV DPTR,#TAB_NU ;获得表头
MOVC A,@A+DPTR ;查表获得显示数据
//CPL A
MOV LED_DATA,A ;显示数据
MOV P2,R1 ;开始显示当前位
MOV A,R1 ;准备显示下一位
RL A
MOV R1,A ;下一位
INC R0 ;取下一个单元地址
LCALL DELAY2MS ;延时 2 MS
DJNZ R2,DISP1 ;重复显示下一个
MOV P2,#0FFH ;关闭显示
RET ;显示完成,返回
;---------------------------------------------------------
;延时子程序
;---------------------------------------------------------
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
TAB_NU:
db 03fh,06h,05bh,04fh,066h,06dh,07dh,07h,07fh,06fh ;字形代码表
;
END
LD I00
EU
R Q00,15
以上程序就可以使输出复位。
你的程序没有让输出复位的原因可能是:程序里面还有一些输出,比如说LD M00 =Q00之类的语句,这样一方面输出清零,另一方面又给出输出,显然不行,所以要停止整个程序,最好把M,V等等这些凡是使用到的变量统统复位为0,那么就完全没有任何问题了。
就是说向上的键按一次乘以十,按下的键除以十对吗(两端的先不考虑),如果这样可以判断所按键的键值啊,当为上键是将文本框内容乘以十,按下除以十,然后显示再处理一下,但为什么不用列表框呢?
以上就是关于怎样用单片机编程:独立按键两个键控制一个数码管的加减 一个键加 一个键减全部的内容,包括:怎样用单片机编程:独立按键两个键控制一个数码管的加减 一个键加 一个键减、MFC计算器按钮代码怎么写,比如我按了按钮数字键1,那怎么把它显示在编辑框你输入的是1,还有加减乘除、51单片机按键加减清零汇编语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)