① 51單片機中display()函數有什麼功能
一般是用來顯示用,即讓單片機顯示想要顯示的內容!!不過過一般函數的功能是需要自己寫自己定義的。一般我們定義display()函數代表顯示。但是,當然你也可以自己寫個display()函數用作其他用途,只需要你修改函數中的語句。
真正函數的功能是由內部語句確定的,而不是函數名,只是我們一般取名為其功能的英文字元或者縮寫,以便於我們自己可以更好的理解!!!
② 單片機等待按鍵釋放什麼原理
一、獨立鍵盤檢測
1、按鍵的檢測原理
單蠢櫻巧片機的I/O口既可以作為輸出也可以作為輸入使用,檢測按鍵時用的是輸入功能。把按鍵的一端接地,另一端與單片機的某個I/O口相連,開始時先給該I/O口賦一個高電平,然後讓單片機不斷地檢測該I/O口是否變成了低電平,當按鍵閉合時,相當於該I/頌猜O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變為低電平就說明按鍵被按下,然後執行相應的指令。
2、實驗板原理圖
獨立按鍵S2,S3,S4,S5分別連接單片機的P3^4,5,6,7。
在這里插入圖片描述
3、去抖動操作
由於使用的是彈性小按鍵,就是一個機械觸點的器件帶鍵。在按下時會有微觀上的機械抖動,反應到電平就是高,低,高,低,抖動的長短與機械特性有關,一般在5~10ms。所以在檢測鍵盤是否按下時要加上去抖動操作。
在這里插入圖片描述
4、用數碼管的前三位實現000~999的循環計時,按下S2時停止,再次按下開始;按下S3時數值加1,按下S4時數值減1;按下S5時數值清零。
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit la=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
int num=0;
char num1=0;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()//鍵盤掃描函數
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
TR0=~TR0;//啟動或關閉定時器
}
while(!key1);
}
if(key2==0)
{
delayms(10);//去抖動操作,如果不加會出現num的值加了好多個,因為循環檢測速度非常快
if(key2==0)
{
num++;
if(num==1000)
num=0;
}
while(!key2);//等待按鍵釋放,因為人為手動按下的過程的時間比單片機檢測的時間長很多,
}//如果不加也會出現num的值加了很多次的現象
if(key3==0)
{
delayms(10);
if(key3==0)
{
num--;
if(num==-1)
num=999;
}
while(!key3);
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
num=0;
}
while(!key4);
}
}
void display(uchar ge,uchar shi,uchar )
{
la=1;
P0=table[];
la=0;
P0=0xff;
wela=1;
P0=0xfe;//打開第一個數碼管
wela=0;
delayms(1);
wela=1;//關閉數碼管,不然快速顯示時數碼管數字之外的二極體有微弱的亮度
P0=0xff;
wela=0;
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
la=1;
P0=table[ge];
la=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
}
void main()
{
la=0;
wela=0;//數碼管初始化,開始時關閉所有數碼管
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();//一直在while循環里檢測鍵盤是否被按下
display(num%10,num/10%10,num/100);
}
}
void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)//1s
{
num1=0;
num++;
if(num==1000)
num=0;
}
}
總結:獨立鍵盤主要注意兩點(1)按下時的去抖動延時delayms函數,大概10ms;(2)鬆手時的按鍵釋放檢測while(!key);等待按鍵釋放。
二、矩陣鍵盤檢測
1、矩陣鍵盤連接圖
結合上面的原理圖,實驗板上的4乘4的矩陣分別接單片機的P3^0到7口。行線和列線是線與的關系即0&1=0,只要兩根線有一根為0則整根線為低電平。獨立鍵盤和單片機連接時每個鍵盤都佔有一個I/O口,當鍵盤數量較多時單片機的I/O口就不夠用了,就引入了矩陣鍵盤。試驗板上是16個按鍵的4乘4矩陣鍵盤即4行4列,每行每個按鍵的一端連接在一起構成行線,每列每個按鍵的另一端連接在一起構成列線,這樣就是4行4列的8根線,就連接到單片機的8個I/O口。
在這里插入圖片描述
2、矩陣鍵盤的檢測原理
獨立鍵盤的一端固定為低電平,檢測時比較方便。矩陣鍵盤兩端都連接單片機的I/O口,就需要人為的通過單片機送出低電平。檢測的時候,先送一行為低電平,其餘幾行為高電平,這就確定了哪一行,然後立即輪流檢測一次各列是否有低電平,如果檢測到某一列為低電平就確定了哪一列。用同樣的方法輪流送各行一次低電平,再輪流檢測一次各列是否變為低電平,這樣就可以檢測完所有的按鍵。(也可以將列線置低電平,掃描行線是否有低電平)
3、按下16個矩陣鍵盤依次在數碼管上顯示1-16的平方。如按下第一個顯示1,第二個顯示4,第三個顯示9…
#include
sbit la=P2^6;
sbit wela=P2^7;
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(int num)//將每個按鍵要顯示的數傳遞給形參
{
la=1;
P0=table[num/100];//百位
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
la=1;
P0=table[num/10%10];//十位
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
la=1;
P0=table[num%10];//個位
la=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
wela=1;
P0=0xff;
wela=0;
}
void keyscan()
{
uchar temp;
int key;
P3=0xfe;//將第一行置為0
temp=P3;
temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之後肯定不是f0,說明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因為之前的temp是相與之後的結果
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2*2;break;
case 0xbe:key=3*3;break;
case 0x7e:key=4*4;break;
}
}
while(temp!=0xf0)//檢測按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨立按鍵麻煩一點,就是要一直檢測P3口
}
display(key);//顯示按鍵要顯示的值
}
P3=0xfd;//第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key=5*5;break;
case 0xdd:key=6*6;break;
case 0xbd:key=7*7;break;
case 0x7d:key=8*8;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
P3=0xfb;//第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key=9*9;break;
case 0xdb:key=10*10;break;
case 0xbb:key=11*11;break;
case 0x7b:key=12*12;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
P3=0xf7;//第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key=13*13;break;
case 0xd7:key=14*14;break;
case 0xb7:key=15*15;break;
case 0x77:key=16*16;break;
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
display(key);
}
void main()
{
la=0;
wela=0;
while(1)
{
keyscan();//在大循環里一直檢測按鍵
}
}
在按下第四行第四列的按鍵後顯示256
在這里插入圖片描述
矩陣鍵盤關鍵的代碼在於分別將每行置0然後檢測每一列,去抖動之後,在檢測按鍵是否釋放要一直讀取P3口
P3=0xfe;//將第一行置為0
temp=P3;
temp=temp&0xf0;//如果第一行有按鍵按下,與f0相與之後肯定不是f0,說明被按下
if(temp!=0xf0)
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;//將P3口重新賦值給temp,因為之前的temp是相與之後的結果
switch(temp)
{
case 0xee:key=1;break;
case 0xde:key=2*2;break;
case 0xbe:key=3*3;break;
case 0x7e:key=4*4;break;
}
}
while(temp!=0xf0)//檢測按鍵是否釋放
{
temp=P3;
temp=temp&0xf0;//比獨立按鍵麻煩一點,就是要一直檢測P3口
}
③ 單片機中voiddisp_string是什麼意思
根據字面意大神思,display是顯示的意思。一般來說,這個就是聲滾簡虧明一個咐慶顯示函數,但是具體功能只能通過函數體具體語句,以及硬體電路來判斷
④ msp430單片機display函數怎麼使用
復制代碼進行使用。msp430單片機display函數可畢帆嫌通過復制代碼的方式進行使用的,單片機(Single-Chip Microcomputer)是一種集成電路晶元,是採用超大規手手模集成電路技術把具有數據處理能力的中央處理器轎跡CPU、隨機存儲器RAM。
⑤ display8程序用法單片機
題主是否想詢問「display8程序用法單片機是什麼意思」?一種集成電路跡念晶元。display通常被稱為監視器,是屬於電腦的I/O設備,display8程序用法單片機是一種集成電路晶元的意思,是採用超大規模集成電路技術把具有數據處理能力的中央處理蘆塵器,隨機存儲器,只讀存儲器,多種IO口和中斷系統姿嘩困、定時器或計數器等功能集成到一塊矽片上構成的一個小而完善的微型計算機系統。
⑥ 單片機為什麼說我display語法錯誤
單片機C程序編譯display顯示語法錯誤,那真是因為你有錯誤。
void
display(uint
nqian,uint
n,uint
nshi,uint
nge)/好慧/這樣定義函數檔彎是行襪悶對的
display(uint
nqian,uint
n,uint
nshi,uint
nge);//這樣調用就完全是錯的
應該這樣:
display(nqian,n,nshi,nge);
⑦ 單片機的C編程中,怎樣使用自定義函數 display(int x, int y, uchar *pData)
display(int x, int y, uchar *pData)
你的函數應用是吵圓型對的,應該是display(1,2,&s);
我猜測,你之所以錯,原升猜因有二:
1是你的函數寫的有問題,你檢查一下
2 是你的類型不匹配,你看你腔備的函數定義的uchar *pData,實際上,你是訪問的int類型的變數,這就有可能地址丟失,只顯示int的高8位或者只顯示低8位了(取決於你單片機是大小端的哪種結構)
你改成
display(int x, int y, int*pData)看看
⑧ 單片機程序運行時顯示"display":requires ANSI-style prototype怎麼解決
您好:
出現這首仔尺個問題是因為你在使用display之前沒有對它進行聲明。有兩種方法解決:者高1、在使用display函數前進行聲明。2、把display函數定戚襲義放在使用display函數之前。
希望可以幫到您。
⑨ 如何利用單片機讓4位數碼管顯示
程序如下(用的是STC89C52晶元):
#include<reg52.h>//52系列單片機頭文件
#defineucharunsignedchar
#defineuintunsignedint
uintx,y;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共陰極數碼管編碼
voiddisplay(uchar,uchar,uchar,uchar);//聲明子函數斗謹
voiddelay(int);//聲明子函數
voidmain()
{
while(1)
{
display(1,2,3,4);//主程序始終調用數碼管顯示子程序
}
}
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P2=0xef;
P0=table[a];//給第一個數碼管送"a"
delay(1);//延時1ms
P2=0xdf;
P0=table[b];//給第二個數碼管送"b"
delay(1);//延時1ms
P2=0xbf;
P0=table[c];//給第三個數碼管送"c"
delay(1);//延時1ms
P2=0x7f;空畝基
P0=table[d];//給第三個數碼管送"d"
delay(1);//延時1ms
}
voiddelay(uintz)//延時子函數
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(9)display單片機擴展閱讀
led數碼管是由多個發光二極體封裝在一起組成「8」字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似於3位「+1」型。
位數有半位,1,2,3,4,5,6,8,10位等等,led數碼管根據LED的接法耐昌不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬體電路有差異外,編程方法也是不同的。
⑩ 89s52單片機中DISPLAY是什麼
單片機如賣本身沒有這個名稱;這個應該渣巧逗是你程序裡面的一個名稱而已;應該是定義的一個顯示函數
比如下面的
void DisplayNum(unsigned int Val)
{
DisplayData[0]=SegNum[Val%10]; //個位;
DisplayData[1]=SegNum[Val%100/10]; //十位;
if((Val/100)==0) //百位為0不顯示;
{
DisplayData[2]=0x00;
}
else
DisplayData[2]=SegNum[Val/100]; //百位;
}
DisplayNum只寬讓是一個名稱而已,你自己可以隨便起名字;一般來說的話,起名字都是方便閱讀程序及後面的使用;