200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 计算器单片机c语言代码 51单片机c语言计算器代码.doc

计算器单片机c语言代码 51单片机c语言计算器代码.doc

时间:2021-10-11 11:04:49

相关推荐

计算器单片机c语言代码 51单片机c语言计算器代码.doc

51单片机c语言计算器代码

//8位液晶数码管显示的计算器,代码通俗易懂

//用到数码管、矩阵键盘、中断三个模块

#include"reg52.h"

#include"stdio.h"

typedef unsigned char uchar;

typedef unsigned int uint;

sbit Wei = P2^3;//定义"74hc573d锁存器"端口,控制数码管位码;

sbit Duan = P2^2;//定义"74hc573d锁存器"端口,控制数码管段码;

code uchar WeiMa[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//共阴数码管点亮位,从第0位到第7位,共8个;

code uint DuanMa[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f};//共阴数码管显示的值“0~9”;

uchar DuanMaZhi[8];//储存数码管显示值的全局变量;

Timer_0();//数码动态扫描的定时器函数;

Delay(uint t);//按键去抖的延迟函数;

Key_1();//矩阵键盘扫描函数;

Key_2();//矩阵键盘返回值函数;

main()

{

uchar n,i,L,F,T[8],s;

uint a = 0,b = 0;

Timer_0();

DuanMaZhi[0] = DuanMa[0];//复位后数码管显示“0”

while(1)

{

n = Key_2();//变量n存储函数返回值

if(n != 0xff)//检测到有返回值

{

if(i == 0)

{

for(s = 0;s < 8;s++)

DuanMaZhi[s] = 0;//清除缓冲区

}

if((8 == i) || ('+' == n) || ('-' == n) || ('x' == n)

|| ('/' == n) || ('=' == n))//检测到下列符号则代表输

//入结束;

{

i = 0;

if(F == 0) //第一个输入值赋给a;

{

sscanf(T,"%d",&a);//输入值存储到变量a,下同;

F = 1;

}

else

sscanf(T,"%d",&b);

for(s = 0;s < 8;s++)

T[s] = 0;//清除缓存区的值;

if(n != '=')//判断是否为等号,做下标记;

L = n;

else

{

F = 0;

switch(L)//计算操作

{

case '+':a = a + b;break;

case '-':a = a - b;break;

case 'x':a = a * b;break;

case '/':a = a / b;break;

default:break;

}

sprintf(T,"%d",a);

for(s = 0;s < 8;s++)

{

if(T[s] == 0) //如果检测到null,则数码管不显示;

DuanMaZhi[s] = 0;

else if(T[s] == 0x2d) //如果为负号则在段码显示负号;

DuanMaZhi[s] = 0x40;

else

DuanMaZhi[s] = DuanMa[T[s] - '0'];

//从ascall码计算数值

}

L = 0; //全部清零;

a = b = 0;

for(s = 0;s < 8;s++)

T[s] = 0;

}

}

else if(i < 16)

{

T[i] = n + '0';

DuanMaZhi[i] = DuanMa[n];//输出数据;

i++;

}

}

}

}

Key_1()//矩阵键盘翻转扫描

{

uchar i,j;

P1 = 0x0f;

if(P1 != 0x0f)

{

Delay(4500);//去除按键抖动;

if(P1 != 0x0f)

{

i = P1;

P1 = i | 0xf0;

j =

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。