?不引流,項(xiàng)目最后附上本項(xiàng)目百行源碼??!
如果對(duì)你有幫助不妨點(diǎn)個(gè)贊!
本項(xiàng)目使用:51單片機(jī),矩陣鍵盤,四位數(shù)碼管
使用LCD顯示的思路相差不大,由于是仿真,包容性比較強(qiáng),所以還有很大優(yōu)化空間
先上仿真圖!
先上代碼,看不太明白的接著往下看
#include <REGX52.H> //程序核心:始終顯示num,操作改變num
void display(int num1); //顯示函數(shù)
void DelayXms(unsigned int x); //延時(shí)函數(shù)
void keyScan(); //按鍵掃描
void keyAdd(); //數(shù)字多位輸入
void pd(); //判斷
int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//顯示的個(gè)十百千位 鍵值,顯示值,存儲(chǔ)值1
char fuhao='0',fuhao0='0'; //鍵入的符號(hào)值,存儲(chǔ)的符號(hào)值
unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void main(){
while(1){
keyScan(); //掃描鍵值
pd(); //判斷鍵值情況
display(num); //顯示函數(shù)
}
}
void keyAdd(){ //實(shí)現(xiàn)鍵入多位數(shù)的效果
if(numKey<10000){
num=num*10+numKey;
numKey=10000;
}
}
void pd(){
keyAdd(); //判斷為數(shù)字,則為數(shù)字輸入
if(fuhao=='c'){ //清零
num=0;
num0=0;
fuhao0='0';
fuhao='0';
}
if(fuhao=='+'){ //加法
fuhao0='+'; //將符號(hào)'+'存到變量fuhao0
fuhao='0'; //符號(hào)清零
num0=num; //將加數(shù)0存到變量num0
num=0;
}
if(fuhao=='-'){ //減法
fuhao0='-';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='*'){ //乘法
fuhao0='*';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='/'){ //除法
fuhao0='/';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='='){ //檢測(cè)到符號(hào)為等號(hào),則進(jìn)行運(yùn)算
if(fuhao0=='+')num=num0+num;
else if(fuhao0=='-')num=num0-num;
else if(fuhao0=='*')num=num0*num;
else if(fuhao0=='/')num=num0/num;
fuhao='0';
num0=0;
}
}
void keyScan(){
P3=0xef;//1110 1111
if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
P3=0xdf;
if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
P3=0xbf;
if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
P3=0x7f;
if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
}
void display(int num1){ //數(shù)碼管動(dòng)態(tài)顯示
n4=num1%10;
n3=num1/10%10;
n2=num1/100%10;
n1=num1/1000%10;
P2=0x01;
P0=duan[n1];
DelayXms(4);
P2=0x02;
P0=duan[n2];
DelayXms(4);
P2=0x04;
P0=duan[n3];
DelayXms(4);
P2=0x08;
P0=duan[n4];
DelayXms(4);
}
void DelayXms(unsigned int x) //@12.000MHz
{ unsigned char i, j;
while(x--)
{ i = 2;
j = 239;
do{while (--j);
}while (--i);
}
}
????????實(shí)際上有一定編程基礎(chǔ)的同學(xué)借助代碼里的注釋應(yīng)該都能看明白,單片機(jī)程序要考慮很多問題,例如數(shù)碼管的顯示需要調(diào)動(dòng)cpu資源,所以在程序的設(shè)計(jì)上就不能面向過程,而是采用如上面代碼所示對(duì)各種情況做判斷。判斷鍵值,改變不同的參數(shù),通過各種處理函數(shù)達(dá)到計(jì)算器的目的。
????????我個(gè)人比較菜,喜歡使用全局變量,個(gè)人感覺比較直觀,喜歡用指針的大神輕噴。
? ? ? ? 技術(shù)能力有限,歡迎各位在評(píng)論區(qū)交流指正,使用以下GitHub鏈接可以直接下載。歡迎大家點(diǎn)贊支持。GitHub - biexuhao/51-jisuanqi: 比較簡(jiǎn)短的一種實(shí)現(xiàn)加減乘除計(jì)算功能的計(jì)算器,基于51單片機(jī),使用數(shù)碼管顯示
為了方便觀看,下面將各個(gè)功能分開列出來:文章來源:http://www.zghlxwxcb.cn/news/detail-778854.html
頭文件引入,函數(shù)聲明,定義變量
#include <REGX52.H> //程序核心:始終顯示num,操作改變num
void display(int num1); //顯示函數(shù)
void DelayXms(unsigned int x); //延時(shí)函數(shù)
void keyScan(); //按鍵掃描
void keyAdd(); //數(shù)字多位輸入
void pd(); //判斷
int n1, n2, n3, n4, numKey=10000, num=0, num0=0;//顯示的個(gè)十百千位 鍵值,顯示值,存儲(chǔ)值1
char fuhao='0',fuhao0='0'; //鍵入的符號(hào)值,存儲(chǔ)的符號(hào)值
unsigned char duan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
主函數(shù)
void main(){
while(1){
keyScan(); //掃描鍵值
pd(); //判斷鍵值情況
display(num); //顯示函數(shù)
}
}
多位數(shù)字的鍵入實(shí)現(xiàn)函數(shù)
void keyAdd(){
if(numKey<10000){
num=num*10+numKey;
numKey=10000;
}
}
鍵值判斷函數(shù)
void pd(){
keyAdd(); //判斷為數(shù)字,則為數(shù)字輸入
if(fuhao=='c'){ //清零
num=0;
num0=0;
fuhao0='0';
fuhao='0';
}
if(fuhao=='+'){ //加法
fuhao0='+'; //將符號(hào)'+'存到變量fuhao0
fuhao='0'; //符號(hào)清零
num0=num; //將加數(shù)0存到變量num0
num=0;
}
if(fuhao=='-'){ //減法
fuhao0='-';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='*'){ //乘法
fuhao0='*';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='/'){ //除法
fuhao0='/';
fuhao='0';
num0=num;
num=0;
}
if(fuhao=='='){ //檢測(cè)到符號(hào)為等號(hào),則進(jìn)行運(yùn)算
if(fuhao0=='+')num=num0+num;
else if(fuhao0=='-')num=num0-num;
else if(fuhao0=='*')num=num0*num;
else if(fuhao0=='/')num=num0/num;
fuhao='0';
num0=0;
}
}
矩陣鍵盤掃描函數(shù)
void keyScan(){
P3=0xef;//1110 1111
if(!P3_3){numKey=7;while(!P3_3);}if(!P3_2){numKey=8;while(!P3_2);}if(!P3_1){numKey=9;while(!P3_1);}if(!P3_0){fuhao='+';while(!P3_0);}
P3=0xdf;
if(!P3_3){numKey=4;while(!P3_3);}if(!P3_2){numKey=5;while(!P3_2);}if(!P3_1){numKey=6;while(!P3_1);}if(!P3_0){fuhao='-';while(!P3_0);}
P3=0xbf;
if(!P3_3){numKey=1;while(!P3_3);}if(!P3_2){numKey=2;while(!P3_2);}if(!P3_1){numKey=3;while(!P3_1);}if(!P3_0){fuhao='*';while(!P3_0);}
P3=0x7f;
if(!P3_3){fuhao='c';while(!P3_3);}if(!P3_2){numKey=0;while(!P3_2);}if(!P3_1){fuhao='=';while(!P3_1);}if(!P3_0){fuhao='/';while(!P3_0);}
}
數(shù)碼管動(dòng)態(tài)顯示函數(shù)
void display(int num1){
n4=num1%10;
n3=num1/10%10;
n2=num1/100%10;
n1=num1/1000%10;
P2=0x01;
P0=duan[n1];
DelayXms(4);
P2=0x02;
P0=duan[n2];
DelayXms(4);
P2=0x04;
P0=duan[n3];
DelayXms(4);
P2=0x08;
P0=duan[n4];
DelayXms(4);
}
最后是延時(shí)函數(shù)
void DelayXms(unsigned int x) //@12.000MHz
{ unsigned char i, j;
while(x--)
{ i = 2;
j = 239;
do{while (--j);
}while (--i);
}
}
? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-778854.html
到了這里,關(guān)于51單片機(jī)簡(jiǎn)單計(jì)算器實(shí)現(xiàn)(100行)附源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!