求助,关于AT89C51单片机简易计算器设计的程序,最好是关于C语言的。谢谢哈。

求助,关于AT89C51单片机简易计算器设计的程序,最好是关于C语言的。谢谢哈。,第1张

下面是我用STC89C52单片机编的程序,采用4*4矩阵键盘,键盘接P3口,采用六位数码管(共阴极)显示,数码管位选和片选信号分别通过两个锁存器接P0口,位选所存端接P^7口,段选所存端接P2^6口。矩阵键盘的具体接法和各位表示的含义楼主可以从程序或咐里看的出来,楼主可以根据自己的硬件对我的程序加以修改应该就会好使,下面的程序是我自己衫大纯设计的,并且用硬件检验过好使,仿团可以实现两个整数的加减乘除,和平方,祝你成功!

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6

sbit wela=P2^7

void display(long z)

long k, temp,num,num1,num2,num3,num4,f,f1,f2,f3,swan,wan,qian,bai,shi,ge,equ,biao

/*f1=1 :有键按下.f=1 f2=1:有符号键按下.f3=0/1:输入第一个数/输入第二个数,biao=1/2/3/4:加减乘除

equ=1:按下等于号,num:keyscan中键值num1:得到连续输入的值num2:第一次输入的值,num3:第二次输入

的值,num4:被显示的值*/

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0}//数码管段选代码

uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}//数码管位选代码

void delay(uint z)//延时函数

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

long keyscan()//键盘扫描函数

{

P3=0xfe

temp=P3&0xf0

while(temp!=0xf0)

{

delay(10)

temp=P3&0xf0

while(temp!=0xf0)//键盘去抖

{

temp=P3

switch(temp)

{

case 0xee:num=7f1=1f2=0break

case 0xde:num=8f1=1f2=0break

case 0xbe:num=9f1=1f2=0break

case 0x7e:num='/'f1=1f=1f2=1f3=1biao=4break

}

while(temp!=0xf0)//松手检测

{

temp=P3

temp&=0xf0

display(num4)

}

}

}

P3=0xfd

temp=P3&0xf0

while(temp!=0xf0)

{

delay(10)

temp=P3&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xed:num=4f1=1f2=0break

case 0xdd:num=5f1=1f2=0break

case 0xbd:num=6f1=1f2=0break

case 0x7d:num='*'f1=1f=1f2=1f3=1biao=3break

}

while(temp!=0xf0)

{

temp=P3

temp&=0xf0

display(num4)

}

}

}

P3=0xfb

temp=P3&0xf0

while(temp!=0xf0)

{

delay(10)

temp=P3&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xeb:num=1f1=1f2=0break

case 0xdb:num=2f1=1f2=0break

case 0xbb:num=3f1=1f2=0break

case 0x7b:num='-'f1=1f=1f2=1f3=1biao=2break

}

while(temp!=0xf0)

{

temp=P3

temp&=0xf0

display(num4)

}

}

}

P3=0xf7

temp=P3&0xf0

while(temp!=0xf0)

{

delay(100)

temp=P3&0xf0

while(temp!=0xf0)

{

temp=P3

switch(temp)

{

case 0xe7:num='c'f1=1f2=1biao=5equ=1break

case 0xd7:num=0f1=1f2=0break

case 0xb7:num='='f1=1f=1f2=1equ=1break

case 0x77:num='+'f1=1f=1f2=1f3=1biao=1break

}

while(temp!=0xf0)

{

temp=P3

temp&=0xf0

display(num4)

}

}

}

return num

}

void display(long z)//显示函数

{

swan=z/100000

wan=z%100000/10000

qian=z%10000/1000

bai=z%1000/100

shi=z%100/10

ge=z%10

if(swan==0)//数码管最高位为0则不现实

{

P0=table1[0]

wela=1

wela=0

P0=table[16]

dula=1

dula=0

}

else

{

P0=table1[0]

wela=1

wela=0

P0=table[swan]

dula=1

dula=0

delay(2)

}

if(!(swan||wan))//前两位都为0则不现实(后面类似)

{

P0=table1[1]

wela=1

wela=0

P0=table[16]

dula=1

dula=0

}

else

{

P0=table1[1]

wela=1

wela=0

P0=table[wan]

dula=1

dula=0

delay(2)

}

if(!(swan||wan||qian))

{

P0=table1[2]

wela=1

wela=0

P0=table[16]

dula=1

dula=0

}

else

{

P0=table1[2]

wela=1

wela=0

P0=table[qian]

dula=1

dula=0

delay(2)

}

if(!(swan||wan||qian||bai))

{

P0=table1[3]

wela=1

wela=0

P0=table[16]

dula=1

dula=0

}

else

{

P0=table1[3]

wela=1

wela=0

P0=table[bai]

dula=1

dula=0

delay(2)

}

if(!(swan||wan||qian||bai||shi))

{

P0=table1[4]

wela=1

wela=0

P0=table[16]

dula=1

dula=0

}

else

{

P0=table1[4]

wela=1

wela=0

P0=table[shi]

dula=1

dula=0

delay(2)

}

P0=table1[5]

wela=1

wela=0

P0=table[ge]

dula=1

dula=0

delay(2)

}

void jisuan()//连续按键时计算出按的值(如按1计算出为1再按2计算出12再按3计算出123)

{

k=keyscan()

if(f1==1)//有键按下

{

f1=0

if(f==1)//有符号键按下

{

f=0

num1=0

}

else

num1=10*num1+k

if(f2==0)//有数字键按下

{

if(f3==0)

{

num2=num1

num4=num2

}

else

{

num3=num1

num4=num3

}

}

}

}

void jieguo()//按等号时进行相应的计算并将结果计算出来

{

if(equ==1)

{

switch(biao)

{

case 1:num4=num2+num3break

case 2:num4=num2-num3break

case 3:num4=num2*num3break

case 4:num4=num2/num3break

case 5:num4=num2*num2break

}

}

}

void main()

{

while(1)

{

jisuan()

jieguo()

display(num4)

}

}

SendKeys string[, wait]

其中,string 是指定要发送的按键消息;Wait 是指定等待方式的 Boolean 值,如果为 False(缺肆宴州省值),则控件在按键发送出去之后立刻返回到过程;如果为 True,则按键消息必须在控件返回到过程之前加以处理。

按键消息由一个或多个字符序列表示:键盘字符按字符本身的键表示(如对于字母 A,string="A",对连续字母 win98,string="win98"),对其它一些特殊字符,如 + 号用{+}表示,Shift 键用 + 表示,Alt 键用 % 表示,F1 键用 {F1} 表示等等,更多的按键与代码的对应关系,可参考 MSDN 的帮助信息。

明白了这些“规则”之后,我们首先来编写一个用 SendKeys *** 控计算器的程序,程序代码如下:

Option Explicit

Private Sub Form_Load()

Dim ReturnValue, I

ReturnValue = Shell("CALC.EXE", 1) ' 运行计算器

AppActivate ReturnValue' 激活计算器

For I = 1 To 100 ' 设置计数循环

SendKeys I &"{+}", True ' 按下按键给计算器

Next I ' 将所有 I 值相加

SendKeys "=", True ' 取得总和

SendKeys "%{F4}", True ' 按 ALT+F4 关闭计算器

End Sub

程序中 AppActivate ReturnValue 语句用来激活计算器,使其窗口获得焦点。程序运行后,我们会看到裂蔽计算器的按键自动动作起来,最后计算出 1+2+3+…+100 的结果。这可不是病毒,也不是黑客啊!

怎么样,神奇吧?想没想到这可是制做演示程序的好方法!只要熟悉了某程序的键盘 *** 作序列,就可以用程序模拟祥姿它的运行过程。下面的程序用来模拟运行安装在 D: 盘的 Word 程序,自动打出 4 行文字后,然后退出。程序中为了能仔细观察演示过程,设计了 waittime 函数来进行延时。

Option Explicit

Private Sub Form_Load()

Dim x

x = Shell("D:/Program Files/Microsoft Office/Office/winword.exe", vbNormalFocus)

'启动 Word97

SendKeys "This is a demo program for Microsoft Word97.", True ' 模拟输入英文字符串

SendKeys "{Enter}{Enter}", True ' 两次回车

waittime (2) ' 延时 2 秒

SendKeys "Some letters keyin automatically.", True

SendKeys "{Enter}{Enter}", True

waittime (2)

SendKeys "Not virus,and not hackers!", True

SendKeys "{Enter}{Enter}", True

waittime (2)

SendKeys "Being Exit... Look the MenuBar File{(}F{)}...", True

SendKeys "%", True 'Alt 键激活菜单条

waittime (1)

SendKeys "(F)", True '按字母 "F",选择"文件(F)"菜单

waittime (1)

SendKeys "(X)", True '按字母 "X", 选择"退出(X)"

waittime (2)

SendKeys "(N)", True 'Word d出一个对话框,询问文件是否存盘,按 "N" 不存盘

End'结束本模拟程序

End Sub

Private Sub waittime(delay As Single)

Dim starttime As Single

starttime = Timer

Do Until (Timer - starttime) >delay

Loop

End Sub

您好,组态王是一款常用的工控软件,用于编写和配置工业自动化系统中的控制界面。在使用组态王时,经常需要设置各种延时时间,如按钮延时、d窗延时等。如果这些延时时间不统一,可能会导致用户体验不佳,甚至影响系统的正常运行。因此,统一延时时间是非常重要的。

要统一组态王中的延时时间,可以采取以下几个步骤:

1. 确定延时时间的标准值。可以根据系统的需求和用户体验,选择一个合适的标准值作为延时时间的基准。

2. 在组态王中设置全局变量。可以在组态王中创建一个全局变量,用于存储延时时间的标准值。

3. 在组态王中使用全局变量。在编写控制界面时,可以使用全局变量来设置各种延时时间。这样,所有的延时时间都将使用同一个标准值,保证了延时时间的统一性。

4. 定期检查和更新延时时间。随着系统的使用和维护,延时时间可能需要进行调整。因此,需要定期检查和更新延时时间,以保证系统的正常运行和用户体验。

总之,统一组态王中的延时时间是非常重要的,可以提高系统的稳定性和用户体验。通过设置全局变量和使用标准值,可以轻松实现延时时间的统一。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12338633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存