① 如何用單片機控制數碼管
單片機控制數碼管分兩種。
1、靜態數碼管,控制比較簡單,只送段碼就可以了。比如:P1=0xc0,共陽極的話,將顯示0
2、動態數碼管,控制就比較復雜一些,需要先送位選碼,再送段碼,而且要不斷的重復執行這個過程,利用視覺暫留原理,達到顯示的效果。
② 求一個基於51單片機的利用數碼管顯示的有小數點的計算器的c程序
程序的話可以給你一個作為參考! 實現了計算結果的小數顯示。
/****************************************************************/
//掃描顯示6位數碼管,顯示信息為緩沖區的六個「0」
//2017.8.7 添加浮點數顯示支持
/****************************************************************/
#include<reg52.h> //頭文件定義
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char // 宏定義
#define uint unsigned int
#define KEY P1
uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //00 顯示空
uchar disp_buffer[6]={2,0,1,7,0,5} ,buf[10]; //顯示緩沖區
uchar flag = 0;
long dat1,dat2;
float temp;
bit keypress = 1,getv = 0;
void p_data(long dat);
void display();
/****************************************************************/
//延時子程序,帶有輸入參數 m
/****************************************************************/
void delay(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<123;j++)
{;}
}
}
/****************************************************************/
//按鍵掃描程序 4X4
/****************************************************************/
uchar key()
{
uchar keytemp , key_h;
KEY = 0xf0;
if((KEY &0xf0)!= 0xf0)
{
keytemp = KEY&0xf0;
KEY = 0x0f; //翻轉
key_h = KEY&0x0f;
keytemp = keytemp | key_h;
switch(keytemp)
{
case 0xee: return(0);break;
case 0xed: return(1);break;
case 0xeb: return(2);break;
case 0xe7: return(3);break;
case 0xde: return(4);break;
case 0xdd: return(5);break;
case 0xdb: return(6);break;
case 0xd7: return(7);break;
case 0xbe: return(8);break;
case 0xbd: return(9);break;
case 0xbb: return(10);break;
case 0xb7: return(11);break;
case 0x7e: return(12);break;
case 0x7d: return(13);break;
case 0x7b: return(14);break;
case 0x77: return(15);break;
}
}
return 0xff;
}
void keyscan()
{
uchar getk;
getk = key();
if(getk != 0xff)
{
delay(10);
getk = key();
if(getk != 0xff)
{
if(keypress)
{
keypress = 0;
switch(getk)
{
case 0x0a: //根據按鍵決定是做哪種運算,並置位getv
getv = 1;
flag = 1;
break;
case 0x0b:
getv = 1;
flag = 2;
break;
case 0x0c:
getv = 1;
flag = 3;
break;
case 0x0d://
flag = 4;
getv = 1;
break;
case 0x0e:
getv = 0;
switch(flag) //按等號鍵 進行運算,並將結果輸出給temp 用於顯示
{
case 1:
temp = dat1 + dat2;
break;
case 2:
temp = dat1 - dat2;
break;
case 3:
temp = dat1 * dat2;
break;
case 4:
temp = (float)dat1 / (float)dat2;
break;
}
dat1 = 0;
dat2 = 0;
flag = 0;
break;
case 0x0f:
if(!getv)
{
dat1 = dat1/10;;
temp = dat1;
}
else
{
dat2 = dat2/10;
temp = dat2;
}
break;
default:
if(!getv) //根據getv的值判斷是第一個數據還是第二個數據!
{
dat1 = dat1*10 + getk; //將按鍵值組合成為數據
temp = dat1;
}
else
{
dat2 = dat2*10 + getk;
temp = dat2;
}
break;
}
}
}
}
else
keypress = 1;
}
/****************************************************************/
//填充disp_buffer 浮點數數據處理 轉換為整數,並標記小數點位置
/****************************************************************/
uchar float_int_dot(float numf)
{
uchar ct,ctn,dotps;
for(ct = 7 ; ct != 0 ; ct--) //初始化列印緩沖區和顯示緩沖區
{
buf[ct - 1] = 0;
if(ct - 1 > 0)
disp_buffer[ct - 2] = 16;
}
sprintf(buf,"%f",numf);
for(ct = 7 ,ctn = 5; ct != 0 ; ct--)
{
if(buf[ct-1] == '.') //如果是小數點則記錄位置,並傳遞給返回值
{
dotps = 6 - ctn;
disp_buffer[ctn] = 0;
}
else if(buf[ct - 1] != '0')//不等於0 則將ascii轉換為數值填充入顯示緩沖區,
{
disp_buffer[ctn] = buf[ct - 1] - 0x30;
ctn--;
}
}
return dotps;
}
/****************************************************************/
//填充disp_buffer ,數據處理
/****************************************************************/
void p_data(long dat)
{
uchar pi;
for(pi = 0 ; pi < 6 ; pi++)
{
if(dat != 0 )
{
disp_buffer[5 - pi] = dat%10;
}
else
disp_buffer[5 - pi] = 16;
dat = dat/10;
}
}
/****************************************************************/
//顯示子程序
/****************************************************************/
void display(uchar flash , uchar count, uchar dot) //dot 代表現實小數點的位置
{
uchar i,temp;
temp = 0x01;
for(i=0;i<6;i++)
{
P2 = temp; //位選
/*方法一
if( i == flash - 1)
{
if(ct <50)
P0 = Tab[disp_buffer[i]]; //送顯示段碼
else
P0 = 0; //送顯示段碼
}
else
P0 = Tab[disp_buffer[i]]; //送顯示段碼
*/
/*方法二***************/
if(!(flash&0x01))
{
if(count <50)
P0 = Tab[disp_buffer[i]]; //送顯示段碼
else
P0 = 0; //送顯示段碼
}
else
P0 = Tab[disp_buffer[i]]; //送顯示段碼
flash = flash >> 1;
/*************************/
if(dot - 1 == 5 - i)
P0 = P0|0x80;
delay(2);
P0 = 0x00; //消隱
temp = _crol_(temp,1);
}
}
/****************************************************************/
//主函數
/****************************************************************/
void main()
{
uchar dot;
while(1)
{
keyscan();
dot = float_int_dot(temp);
display(0xff,100,dot); //11 001101
}
}
Proteus 模擬圖
③ 單片機簡易計算器中6位或者4+2位數碼管的接法
這里有個8位的,你做簡易計算器,介面應該不緊張。這是共陽的,具體顯示還得算段嗎。共陰把P2口的三極體換成npn的,或者改用2803。6位,去兩位好了。
圖片傳不上 發你郵箱里吧。
④ 關於 51單片機 C語言 按鍵 數碼管 電子計算器 4*4鍵盤 請您幫忙
又是你。
數碼管就能顯示「-」號,「+」、「*」、「/」怎麼顯示?
我都給你編程思路了,還給你做了簡易的計算器,你就不會自己改改?加點你自己想要的功能,怎麼這么懶。
⑤ 51單片機數碼管計算器的C程序(可以顯示小數)
http://download.csdn.net/detail/likang123321/2973621
這是我當年上大學時候寫的垃圾代碼,不過能用,你自己愁著改改,後來我替人也寫過一個,比這個好多了,系統也靠譜,但是找不到了,你湊合著看吧,很多不好的地方,你自己改改
⑥ 求一個用51單片機結合數碼管和舉證鍵盤做的一個C語言的計算器 不用有小數點 只要普通加減乘除四則運
用51單片機結合數碼管和距陣鍵盤做一個計算器,用proteus模擬來做比較容易實現,還有一個現成的計算器用的矩陣按鍵,正好有+ - × ÷ 四個按鍵,很漂亮。再用一個8位一體的共陰數碼管顯示,就是一個不錯的計算器。模擬圖如下。
⑦ 單片機 數碼管顯示鍵盤輸入 計算器程序 程序中
兄弟,不好意思,我這個程序可以計算8位數,完成加減乘除,沒有小數點
、顯示負數的功能,只能幫到這了。
#include
#include
#include
#pragma
noregparms
#define
g
dbyte[0x30]
#define
s
dbyte[0x31]
#define
b
dbyte[0x32]
#define
q
dbyte[0x33]
#define
w
dbyte[0x34]
#define
sw
dbyte[0x35]
#define
bw
dbyte[0x36]
#define
qw
dbyte[0x37]
#define
flag
dbyte[0x38]
#define
ww
dbyte[0x39]
#define
var
dbyte[0x40]
unsigned
long
data
a0
_at_
0x42;
unsigned
long
data
a1
_at_
0x46;
unsigned
long
data
a2
_at_
0x50;
void
count
()
{
unsigned
long
temp;
if(var>=0&&var<=9)
{
if(ww==1)
{
qw=bw=sw=w=q=b=s=g=0;
g=var;
ww=0;
}
else
{
qw=bw;
bw=sw;
sw=w;
w=q;
q=b;
b=s;
s=g;
g=var;
}
}
if(var>=0x0a&&var<=0x0d)
{
a0=qw*10000000+bw*1000000+sw*100000+w*10000+q*1000+b*100+s*10+g;
if(var==0x0a)flag=1;//加法運算標志
if(var==0x0b)flag=2;//減法運算標志
if(var==0x0c)flag=3;//乘法運算標志
if(var==0x0d)flag=4;//除法運算標志
ww=1;
}
if(var==0x0e)
{
a1=qw*10000000+bw*1000000+sw*100000+w*10000+q*1000+b*100+s*10+g;
if(flag==1)a2=a1+a0;
if(flag==2)a2=a0-a1;
if(flag==3)a2=a1*a0;
if(flag==4)a2=a0/a1;
g=a2%10;
temp=a2/10;
s=temp%10;
temp=temp/10;
b=temp%10;
temp=temp/10;
q=temp%10;
temp=temp/10;
w=temp%10;
temp=temp/10;
sw=temp%10;
temp=temp/10;
bw=temp%10;
qw=temp/10;
}
if(var==0x0f)
{
qw=bw=sw=w=q=b=s=g=var=flag=0;
}
}
⑧ 基於51單片機的數碼管顯示加減法計算器
文字都負載了 圖片上
void Key_scan(void)
{
;
}
void operate()
{
if(flag1 == 1) //最原始的狀態 第一個數據輸入
{
if……
flag2=1 //合適條件下 置這個標志位 進入輸入第二各數據
flag1 =0
}
if(flag2 == 1) 第二個數據輸入
{
flag2=1
}
}
void display(x,y)
{
;
}
void main(void)
{
while(1)
{
Key_scan(); //獲取按鍵值
operate(); //處理運算
display(x,y); //顯示屏幕
}
}