基於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...