ARM開發(9)基於STM32的簡單四則運算計算器

2021-08-06 00:09:55 字數 4723 閱讀 3342

基於stm32的簡單四則運算計算器
一 計算器原理:

1.1 本實驗實現基於stm32的簡單四則運算計算器

1.2 實驗思路:理解計算器原理(按鍵掃瞄,字元實時顯示,運算表示式計算,浮點數轉字串,字串結果顯示)

1.3 開發環境 : mdk5 庫函式版本開發 jlink** stm32f103vbt6晶元

二 實驗步驟:

2.1 key.h**:

#ifndef __key_h

#define __key_h

#include"sys.h"

#define key_null 0 // no key

#define key_0 40 // value 0

#define key_1 41

#define key_2 42

#define key_3 43

#define key_4 44

#define key_5 45

#define key_6 46

#define key_7 47

#define key_8 48

#define key_9 49 //

#define key_point 50 // decimal point

#define key_op_add 64 // '+' addition

#define key_op_sub 65 // '-' substract

#define key_op_mul 66 // '*' multiplication

#define key_op_div 67 // '/' divide

#define key_equ 81 // '='

void key_init(void);//io³õê¼»¯

void funcscankey(void);

u8 key_read(void);

#endif

2.2 key.c**(按鍵掃瞄函式):

#include "stm32f10x.h"

#include "key.h"

#include "delay.h"

typedef struct

temp_flags_type;

temp_flags_type tempflags;

u8 specialkey;

void key_init(void)

static u8 timer2of16ms = 0;

static u8 sourcekey = 0;

static u8 keycol, keyrow;

u8 const keytablemax = 7;

u8 const keytablemaxcol = 8;

u16 const scantable[keytablemax] = ;

u16 const scantable2[keytablemaxcol] = ;

u8 const keytable[keytablemax][keytablemaxcol] =

, ,,,

,,

}; void funcscankey(void)

else

keycol = currkey; keyrow = row;}}

else

keycol = currkey; keyrow = row;}}

}}

else // 沒按鍵按下

}if(tempflags.flagkeydown)}}

}u8 key_read(void) //掃瞄得到按鍵值

else if(tempflags.flagkeylong)

return keytable[keyrow][keycol];

return key_null;

}

2.3 calcalator.h**

#ifndef __calcalator_h

#define __calcalator_h

#include "sys.h"

extern double jud(char str,int begin, int end); //動態規劃四則運算過程

extern double displaynum(char str,int len); //四則運算結果函式

extern void float_to_str(char *str,double num); //雙精度化為字串函式

extern u8 str_to_ma(char st); //字元轉為數碼管段選碼值

extern char key(u8 c); //判斷按鍵掃瞄值是否是四則運算符或者0~9字元

#endif

2.4 calcalator.c**(計算器運算)

#include "calcalator.h"

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#include"math.h"

#include "sys.h"

int fst[1005];

u8 const seg88code[17] = ;

double jud(char str,int begin, int end)// 動態規劃四則運算過程

}for(i = end; i >= begin; i--)

}for(i = begin; i <= end; i++)

}for(i = end; i >= begin; i--)

}if(str[begin]=='(')

else

return k;

}double displaynum(char str,int len)// 四則運算結果函式

ans = jud(str,0, len - 1);

return ans;

} void float_to_str(char *str,double num)// 雙精度化為字串函式

for(i=n-1;i>=0;i--)

num -= (int)num;

tp = 0.1;

*str++='.';

while(num > 1e-8)

*str='\0';

str=start;

} extern u8 str_to_ma(char s)// 字元轉為數碼管段選碼值

2.5 main.c**(具體實現計算器四則運算):

#include "sys.h"    

#include "delay.h"

#include "led.h"

#include "beep.h"

#include "key.h"

#include "keyled.h"

#include "calcalator.h"

#include"stdlib.h"

#include"stdio.h"

#include"string.h"

char key(u8 c)// 判斷按鍵掃瞄值是否是四則運算符或者0~9字元

else if(c==50)

else if(c==64)

else if(c==65)

else if(c==66)

else if(c==67)

else

return 'o';

} int main(void)

; u8 dnum[20];

u8 const seg88code[17] = ;

char ckey;

delay_init();

key_init();

beep_init();

initial_led();

while(1)

else if ((c>=64&&c<=67)||c==81)

delay_ms(10);}}

if(c==81)

{ int h;

h=(int)(i);

m=displaynum(dispay_num,h);

float_to_str(str,m);

n=strlen(str);

for(q=0;q三 接線測試:

3.1 與板子接線測試效果良好,基本四則運算結果較好,唯一缺點對tm1629a的顯示不是很好,因為數碼管排列順序不是順序,可以在上面修改,基本思路是這樣。

ARM開發(2)基於STM32的蜂鳴器

基於stm32的蜂鳴器 一 蜂鳴器原理 1.1 本實驗實現1個蜂鳴器間隔1s鳴叫。1.3 開發環境 mdk5 庫函式版本開發 jlink 二 實驗步驟 2.1 beep.h ifndef beep h define beep h include sys.h define beep pbout 10 ...

基於STM32的串列埠通訊

序列通訊一般是以幀格式傳輸資料,即一幀一幀的傳輸,每一幀都含有起始訊號,資料資訊以及停止資訊等。資料各個位同時傳輸,速度快,但是占用引腳資源多。eg led1602 資料按位順序傳輸,占用引腳資源少,但是速度相對較慢。一位一位傳輸 bit iic spi 串列埠通訊 單工,半雙工,全雙工 同步通訊 ...

基於STM32的恆流源設計

本設計以stm32f103rct6為主控晶元,利用mos管的恆流區特點,設計恆流源。設計電流範圍為1 300ma。基本原理圖 q2為n溝道mos管,在正常工作情況下,運放與mos管之間構成深度負反饋,使得輸入控制電壓與vr虛短,近似相等。這可以得到負載電流 3.1.電源 電路圖如圖所示 電源由 12...