导航:首页 > 操作系统 > 单片机计算器数码管

单片机计算器数码管

发布时间:2022-09-23 05:14:21

① 如何用单片机控制数码管

单片机控制数码管分两种。
1、静态数码管,控制比较简单,只送段码就可以了。比如:P1=0xc0,共阳极的话,将显示0
2、动态数码管,控制就比较复杂一些,需要先送位选码,再送段码,而且要不断的重复执行这个过程,利用视觉暂留原理,达到显示的效果。

② 求一个基于51单片机的利用数码管显示的有小数点的计算器的c程序

程序的话可以给你一个作为参考! 实现了计算结果的小数显示。

/****************************************************************/

//扫描显示6位数码管,显示信息为缓冲区的六个“0”

//2017.8.7 添加浮点数显示支持

/****************************************************************/

#include<reg52.h> //头文件定义

#include<stdio.h>

#include<intrins.h>

#define uchar unsigned char // 宏定义

#define uint unsigned int

#define KEY P1

uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//

0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //00 显示空

uchar disp_buffer[6]={2,0,1,7,0,5} ,buf[10]; //显示缓冲区

uchar flag = 0;

long dat1,dat2;

float temp;

bit keypress = 1,getv = 0;

void p_data(long dat);

void display();

/****************************************************************/

//延时子程序,带有输入参数 m

/****************************************************************/

void delay(unsigned int m)

{

unsigned int i,j;

for(i=0;i<m;i++)

{

for(j=0;j<123;j++)

{;}

}

}

/****************************************************************/

//按键扫描程序 4X4

/****************************************************************/

uchar key()

{

uchar keytemp , key_h;

KEY = 0xf0;

if((KEY &0xf0)!= 0xf0)

{

keytemp = KEY&0xf0;

KEY = 0x0f; //翻转

key_h = KEY&0x0f;

keytemp = keytemp | key_h;

switch(keytemp)

{

case 0xee: return(0);break;

case 0xed: return(1);break;

case 0xeb: return(2);break;

case 0xe7: return(3);break;

case 0xde: return(4);break;

case 0xdd: return(5);break;

case 0xdb: return(6);break;

case 0xd7: return(7);break;

case 0xbe: return(8);break;

case 0xbd: return(9);break;

case 0xbb: return(10);break;

case 0xb7: return(11);break;

case 0x7e: return(12);break;

case 0x7d: return(13);break;

case 0x7b: return(14);break;

case 0x77: return(15);break;

}

}

return 0xff;

}

void keyscan()

{

uchar getk;

getk = key();

if(getk != 0xff)

{

delay(10);

getk = key();

if(getk != 0xff)

{

if(keypress)

{

keypress = 0;

switch(getk)

{

case 0x0a: //根据按键决定是做哪种运算,并置位getv

getv = 1;

flag = 1;

break;

case 0x0b:

getv = 1;

flag = 2;

break;

case 0x0c:

getv = 1;

flag = 3;

break;

case 0x0d://

flag = 4;

getv = 1;

break;

case 0x0e:

getv = 0;

switch(flag) //按等号键 进行运算,并将结果输出给temp 用于显示

{

case 1:

temp = dat1 + dat2;

break;

case 2:

temp = dat1 - dat2;

break;

case 3:

temp = dat1 * dat2;

break;

case 4:

temp = (float)dat1 / (float)dat2;

break;

}

dat1 = 0;

dat2 = 0;

flag = 0;

break;

case 0x0f:

if(!getv)

{

dat1 = dat1/10;;

temp = dat1;

}

else

{

dat2 = dat2/10;

temp = dat2;

}

break;

default:

if(!getv) //根据getv的值判断是第一个数据还是第二个数据!

{

dat1 = dat1*10 + getk; //将按键值组合成为数据

temp = dat1;

}

else

{

dat2 = dat2*10 + getk;

temp = dat2;

}

break;

}

}

}

}

else

keypress = 1;

}

/****************************************************************/

//填充disp_buffer 浮点数数据处理 转换为整数,并标记小数点位置

/****************************************************************/

uchar float_int_dot(float numf)

{

uchar ct,ctn,dotps;

for(ct = 7 ; ct != 0 ; ct--) //初始化打印缓冲区和显示缓冲区

{

buf[ct - 1] = 0;

if(ct - 1 > 0)

disp_buffer[ct - 2] = 16;

}

sprintf(buf,"%f",numf);

for(ct = 7 ,ctn = 5; ct != 0 ; ct--)

{

if(buf[ct-1] == '.') //如果是小数点则记录位置,并传递给返回值

{

dotps = 6 - ctn;

disp_buffer[ctn] = 0;

}

else if(buf[ct - 1] != '0')//不等于0 则将ascii转换为数值填充入显示缓冲区,

{

disp_buffer[ctn] = buf[ct - 1] - 0x30;

ctn--;

}

}

return dotps;

}

/****************************************************************/

//填充disp_buffer ,数据处理

/****************************************************************/

void p_data(long dat)

{

uchar pi;

for(pi = 0 ; pi < 6 ; pi++)

{

if(dat != 0 )

{

disp_buffer[5 - pi] = dat%10;

}

else

disp_buffer[5 - pi] = 16;

dat = dat/10;

}

}

/****************************************************************/

//显示子程序

/****************************************************************/

void display(uchar flash , uchar count, uchar dot) //dot 代表现实小数点的位置

{

uchar i,temp;

temp = 0x01;

for(i=0;i<6;i++)

{

P2 = temp; //位选

/*方法一

if( i == flash - 1)

{

if(ct <50)

P0 = Tab[disp_buffer[i]]; //送显示段码

else

P0 = 0; //送显示段码

}

else

P0 = Tab[disp_buffer[i]]; //送显示段码

*/

/*方法二***************/

if(!(flash&0x01))

{

if(count <50)

P0 = Tab[disp_buffer[i]]; //送显示段码

else

P0 = 0; //送显示段码

}

else

P0 = Tab[disp_buffer[i]]; //送显示段码

flash = flash >> 1;

/*************************/

if(dot - 1 == 5 - i)

P0 = P0|0x80;

delay(2);

P0 = 0x00; //消隐

temp = _crol_(temp,1);

}

}

/****************************************************************/

//主函数

/****************************************************************/

void main()

{

uchar dot;

while(1)

{

keyscan();

dot = float_int_dot(temp);

display(0xff,100,dot); //11 001101

}

}

Proteus 仿真图

③ 单片机简易计算器中6位或者4+2位数码管的接法

这里有个8位的,你做简易计算器,接口应该不紧张。这是共阳的,具体显示还得算段吗。共阴把P2口的三极管换成npn的,或者改用2803。6位,去两位好了。
图片传不上 发你邮箱里吧。

④ 关于 51单片机 C语言 按键 数码管 电子计算器 4*4键盘 请您帮忙

又是你。
数码管就能显示“-”号,“+”、“*”、“/”怎么显示?
我都给你编程思路了,还给你做了简易的计算器,你就不会自己改改?加点你自己想要的功能,怎么这么懒。

⑤ 51单片机数码管计算器的C程序(可以显示小数)

http://download.csdn.net/detail/likang123321/2973621

这是我当年上大学时候写的垃圾代码,不过能用,你自己愁着改改,后来我替人也写过一个,比这个好多了,系统也靠谱,但是找不到了,你凑合着看吧,很多不好的地方,你自己改改

⑥ 求一个用51单片机结合数码管和举证键盘做的一个C语言的计算器 不用有小数点 只要普通加减乘除四则运

用51单片机结合数码管和距阵键盘做一个计算器,用proteus仿真来做比较容易实现,还有一个现成的计算器用的矩阵按键,正好有+ - × ÷ 四个按键,很漂亮。再用一个8位一体的共阴数码管显示,就是一个不错的计算器。仿真图如下。

⑦ 单片机 数码管显示键盘输入 计算器程序 程序中

兄弟,不好意思,我这个程序可以计算8位数,完成加减乘除,没有小数点
、显示负数的功能,只能帮到这了。
#include
#include
#include
#pragma
noregparms
#define
g
dbyte[0x30]
#define
s
dbyte[0x31]
#define
b
dbyte[0x32]
#define
q
dbyte[0x33]
#define
w
dbyte[0x34]
#define
sw
dbyte[0x35]
#define
bw
dbyte[0x36]
#define
qw
dbyte[0x37]
#define
flag
dbyte[0x38]
#define
ww
dbyte[0x39]
#define
var
dbyte[0x40]
unsigned
long
data
a0
_at_
0x42;
unsigned
long
data
a1
_at_
0x46;
unsigned
long
data
a2
_at_
0x50;
void
count
()
{
unsigned
long
temp;
if(var>=0&&var<=9)
{
if(ww==1)
{
qw=bw=sw=w=q=b=s=g=0;
g=var;
ww=0;
}
else
{
qw=bw;
bw=sw;
sw=w;
w=q;
q=b;
b=s;
s=g;
g=var;
}
}
if(var>=0x0a&&var<=0x0d)
{
a0=qw*10000000+bw*1000000+sw*100000+w*10000+q*1000+b*100+s*10+g;
if(var==0x0a)flag=1;//加法运算标志
if(var==0x0b)flag=2;//减法运算标志
if(var==0x0c)flag=3;//乘法运算标志
if(var==0x0d)flag=4;//除法运算标志
ww=1;
}
if(var==0x0e)
{
a1=qw*10000000+bw*1000000+sw*100000+w*10000+q*1000+b*100+s*10+g;
if(flag==1)a2=a1+a0;
if(flag==2)a2=a0-a1;
if(flag==3)a2=a1*a0;
if(flag==4)a2=a0/a1;
g=a2%10;
temp=a2/10;
s=temp%10;
temp=temp/10;
b=temp%10;
temp=temp/10;
q=temp%10;
temp=temp/10;
w=temp%10;
temp=temp/10;
sw=temp%10;
temp=temp/10;
bw=temp%10;
qw=temp/10;
}
if(var==0x0f)
{
qw=bw=sw=w=q=b=s=g=var=flag=0;
}
}

⑧ 基于51单片机的数码管显示加减法计算器

文字都负载了 图片上



void Key_scan(void)

{

;

}


void operate()

{

if(flag1 == 1) //最原始的状态 第一个数据输入

{

if……

flag2=1 //合适条件下 置这个标志位 进入输入第二各数据

flag1 =0

}

if(flag2 == 1) 第二个数据输入

{

flag2=1

}


}


void display(x,y)

{

;

}



void main(void)

{

while(1)

{

Key_scan(); //获取按键值

operate(); //处理运算

display(x,y); //显示屏幕

}

}

阅读全文

与单片机计算器数码管相关的资料

热点内容
浙江标准网络服务器机柜云主机 浏览:587
设置网络的服务器地址 浏览:600
java图形界面设计 浏览:751
纯前端项目怎么部署到服务器 浏览:538
瓜子脸程序员 浏览:505
如何保证服务器优质 浏览:94
小微信aPP怎么一下找不到了 浏览:299
算法纂要学术价值 浏览:975
程序员你好是什么意思 浏览:801
倩女幽魂老服务器如何玩 浏览:561
电子钟单片机课程设计实验报告 浏览:999
看加密频道 浏览:381
程序员算不算流水线工人 浏览:632
三星电视我的app怎么卸载 浏览:44
简述vi编译器的基本操作 浏览:507
让程序员选小号 浏览:91
加强数字货币国际信息编译能力 浏览:584
购买的app会员怎么退安卓手机 浏览:891
程序员的种类及名称 浏览:293
美国程序员薪资 浏览:13