STM32计算器仿真文件及源代码下载
用STM32实现简单的计算器,有基本的加减乘除,需要的小伙伴请点赞拿走
原理图
源程序代码
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
#include "LCD1602.h"
#include "keyscan.h"
#include "tsensor.h"
#include "usart.h"
#include "rtc.h"
#define uint unsigned int
#define uchar unsigned char
uchar table[]= {" "};
unsigned char w_tab[]={"20200401044"};
long int data_a=0;
long int data_b=0;
long int data_c=0;
int flag_x=0;
uchar dispaly[10];
uchar i,j;
uchar k=0;
uint key=0xff;
uchar a=0;
uchar b=5;
uchar c=0;
uchar d=5;
uchar x=0;
void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
{
if(y==0) //
{
LCD_write_cmd(0x80 + x); //
}
else //
{
LCD_write_cmd(0xc0 + x); //
}
LCD_write_data(Data); //
}
void display_a() //
{
dispaly[4]=data_a%100000/10000; //
dispaly[3]=data_a%10000/1000; //
dispaly[2]=data_a%1000/100; //
dispaly[1]=data_a%100/10; //
dispaly[0]=data_a%10; //
LCD_write_cmd(0x80+0); //
if(data_a>9999)
{
LCD_write_data('0'+dispaly[4]); //
}
if(data_a>999)
{
LCD_write_data('0'+dispaly[3]); //
}
if(data_a>99)
{
LCD_write_data('0'+dispaly[2]); //
}
if(data_a>9)
{
LCD_write_data('0'+dispaly[1]); //
}
LCD_write_data('0'+dispaly[0]); //
}
void display_b() //
{
LCD_write_cmd(0x80+8); //
dispaly[4]=data_b%100000/10000; //
dispaly[3]=data_b%10000/1000; //
dispaly[2]=data_b%1000/100;
dispaly[1]=data_b%100/10; //
dispaly[0]=data_b%10; //
if(data_b>9999)
{
LCD_write_data('0'+dispaly[4]); //
}
if(data_b>999)
{
LCD_write_data('0'+dispaly[3]); //
}
if(data_b>99)
{
LCD_write_data('0'+dispaly[2]); //
}
if(data_b>9)
{
LCD_write_data('0'+dispaly[1]); //
}
LCD_write_data('0'+dispaly[0]); //
}
void display_c(x)
{
if(data_c<100000000&&data_c>-1) //
{
dispaly[8]=data_c%1000000000/100000000; //
dispaly[7]=data_c%100000000/10000000; //
dispaly[6]=data_c%10000000/1000000; //
dispaly[5]=data_c%1000000/100000; //
dispaly[4]=data_c%100000/10000; //
dispaly[3]=data_c%10000/1000; //
dispaly[2]=data_c%1000/100; //
dispaly[1]=data_c%100/10; //
dispaly[0]=data_c%10; //
LCD_write_cmd(0x80+0x40+7); //
}
else
{
if(data_c>99999999)
{
LCD_write_data('0'+dispaly[8]); //
}
if(data_c>9999999)
{
LCD_write_data('0'+dispaly[7]); //
}
if(data_c>999999)
{
LCD_write_data('0'+dispaly[6]); //
}
if(data_c>99999)
{
LCD_write_data('0'+dispaly[5]); //
}
if(data_c>9999)
{
LCD_write_data('0'+dispaly[4]); //
}
if(data_c>999)
{
LCD_write_data('0'+dispaly[3]); //
}
if(data_c>99)
{
LCD_write_data('0'+dispaly[2]); //
}
if(data_c>9)
{
LCD_write_data('0'+dispaly[1]); //
}
LCD_write_data('0'+dispaly[0]); //
}
}
else //
{
LCD_write_cmd(0x80+0x40+11); //
LCD_write_data('E'); //
LCD_write_data('r'); //
LCD_write_data('r'); //
LCD_write_data('o'); //
LCD_write_data('r'); //
}
}
void eql(uchar yunsuan) //
{
switch(yunsuan) //
{
case 1: data_c=data_a+data_b; //
break; //
case 2: if(data_a>=data_b) //
{
data_c=data_a-data_b; //
}
else //
{
data_c=data_b-data_a; //
W_lcd(5,1,'-'); //
}
break; //
case 3: data_c=(data_a*data_b); //
break; //
case 4: if(data_b==0) //
{
LCD_write_string(1,1,"Error");//
}
else
{
data_c=data_a/data_b;//
}
break; //
case 0: break; //
}
}
void main(void)
{
int flag=1;
LCD_init(); //
LCD_write_cmd(0x01); //
display_a(); //
delay_init();
while(1)
{
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))
{
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0));
flag_x=1;
LCD_write_string(0,0,table);
display_a();
}
if(flag_x==1)
{
//GPIO_ResetBits(GPIOA,GPIO_Pin_12);
//display_a();
key=keyscan(); //
//delay_ms(500);
if(key!=0xff) //
{
if(key<10&&flag==1)
{
if(a<5) //n<5
{
data_a=data_a*10+key; //
b=5; //m=5
display_a(); //
}
a++; //n+1
if(b<5) //m<5
{
data_b=data_b*10+key; //
a=6; //n=6
display_b(); //
}
b++; //m+1
}
if(key<10&&flag!=1)
{
if(c<5)
{
LCD_write_cmd(0x01); //
data_a=data_c;
data_b=0; //
display_a(); //
display_b();
b=5; //m=5 //
c=6;
}
if(b<5) //m<5
{
data_b=data_b*10+key; //
c=6;
display_b(); //
}
b++; //m+1
}
else
{
switch(key) //
{
case 10:a=5;b=0;x=1;c=5;
W_lcd(6,0,'+'); //
break;
case 11:a=5;b=0;x=2;c=5;
W_lcd(6,0,'-'); //
break; //
case 12:a=5;b=0;x=3;c=5;
W_lcd(6,0,'*'); //
break; //
case 13:a=5;b=0;x=4;c=5;
W_lcd(6,0,'/'); //
break; //
case 14:a=5;b=5;c=0;
eql(x); //
W_lcd(0,1,'='); //
display_c(x); //
flag++;
break; //
case 15:a=0;x=0;b=0;c=0;flag=1;
data_a=0; //aÊý¾ÝÇå0
data_b=0; //bÊý¾ÝÇå0
data_c=0; //cÊý¾ÝÇå0
LCD_write_string(0,0,table);
LCD_write_string(0,1,table);
W_lcd(0,0,'0'); //
break; //
}
}
do{key=keyscan();}
while(key!=0xff); //
/*
while(key!=0xff)
{
key=keyscan();
}*/
}//(0xff!=key)
}
else
{
LCD_write_string(0,0,w_tab);
}
}//while
}//main
作者:岁月神偷\’