91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

第7章 變量進(jìn)階與點(diǎn)陣LED(7.1 7.2)

137933yu ? 來源:137933yu ? 作者:137933yu ? 2025-12-10 16:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

走在馬路上的時(shí)候,經(jīng)常會(huì)看到馬路兩側(cè)有一些LED點(diǎn)陣的廣告牌,這些廣告牌看起來絢爛奪目,非常吸引人,而且還會(huì)變化很多種不同的顯示方式。本章就會(huì)學(xué)習(xí)到點(diǎn)陣LED的控制方式,同時(shí)也會(huì)學(xué)習(xí)C語言變量的進(jìn)階知識(shí)——變量的作用域和存儲(chǔ)類別。
7.1變量的作用域
所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為局部變量和全局變量。
7.1.1局部變量
在一個(gè)函數(shù)內(nèi)部聲明的變量是內(nèi)部變量,它只在本函數(shù)內(nèi)有效,在本函數(shù)以外是不能使用的,這樣的變量就是局部變量。此外,函數(shù)的形參也是局部變量,形參會(huì)在后面講解函數(shù)的時(shí)候再詳細(xì)解釋。
比如第6章程序中定義的unsigned long sec這個(gè)變量,它是定義在main函數(shù)內(nèi)部的,所以只能由main函數(shù)使用,中斷函數(shù)就不能使用這個(gè)變量。同理,如果在中斷函數(shù)內(nèi)部定義的變量,在main函數(shù)中也是不能使用的。
7.1.2全局變量
在函數(shù)外聲明的變量就是全局變量。一個(gè)源程序文件可以包含一個(gè)或者多個(gè)函數(shù),全局變量的作用范圍是從它開始聲明的位置一直到程序結(jié)束。
比如第6章程序中定義的unsigned char LedBuff[6]這個(gè)數(shù)組,它的作用域就是從開始定義的位置一直到程序結(jié)束,不管是main函數(shù),還是中斷函數(shù)InterruptTimer0,都可以直接使用這個(gè)數(shù)組。
局部變量只有在聲明它的函數(shù)范圍內(nèi)可以使用,而全局變量可以被作用域內(nèi)的所有的函數(shù)使用。所以在一個(gè)函數(shù)內(nèi)既可以使用本函數(shù)內(nèi)聲明的局部變量,也可以使用全局變量。從編程規(guī)范上講,一個(gè)程序文件內(nèi)所有的全局變量都應(yīng)定義在文件的開頭部分,在文件中所有函數(shù)之前。
由于C語言函數(shù)只有一個(gè)返回值,但是卻經(jīng)常會(huì)希望一個(gè)函數(shù)可以提供或影響多個(gè)結(jié)果值,這時(shí)就可以利用全局變量來實(shí)現(xiàn)。但是考慮到全局變量的一些特征,應(yīng)該限制全局變量的使用,過多使用全局變量也會(huì)帶來一些問題。
1、全局變量可以被作用域內(nèi)所有的函數(shù)直接引用,可以增加函數(shù)間數(shù)據(jù)聯(lián)系的途徑,但同時(shí)加強(qiáng)了函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,使這些函數(shù)的獨(dú)立性降低,對(duì)其中任何一個(gè)函數(shù)的修改都可能會(huì)影響到其它函數(shù)的執(zhí)行結(jié)果,函數(shù)之間過于緊密的聯(lián)系不利于程序的維護(hù)。
2、全局變量的應(yīng)用會(huì)降低函數(shù)的通用性,函數(shù)在執(zhí)行的時(shí)候過多依賴于全局變量,不利于函數(shù)的重復(fù)利用。目前編寫的程序還都比較簡(jiǎn)單,就一個(gè).c文件,但以后要學(xué)到一個(gè)程序中有多個(gè).c文件,當(dāng)一個(gè)函數(shù)被另外一個(gè).c文件調(diào)用的時(shí)候,必須將這個(gè)全局變量的變量值一起移植,而全局變量不只被一個(gè)函數(shù)調(diào)用,這樣會(huì)引起一些不可預(yù)見的后果。
3、過多使用全局變量會(huì)降低程序的清晰度,使程序的可讀性下降。在各個(gè)函數(shù)執(zhí)行的時(shí)候都可能改變?nèi)肿兞恐担y以清楚的判斷出每個(gè)時(shí)刻各個(gè)全局變量的值。
4、定義全局變量會(huì)永久占用單片機(jī)的內(nèi)存單元,而局部變量只有進(jìn)入定義局部變量的函數(shù)時(shí)才會(huì)占用內(nèi)存單元,函數(shù)退出后會(huì)自動(dòng)釋放所占用的內(nèi)存。所以大量的全局變量會(huì)額外增加內(nèi)存消耗。
綜上所述之原因,在編程規(guī)范上有一條原則,就是盡量減少全局變量的使用,能用局部變量代替的就不用全局變量。
還有一種特殊情況,在看別人程序的時(shí)候請(qǐng)注意,C語言是允許局部變量和全局變量同名的,它們定義后在內(nèi)存中占有不同的內(nèi)存單元。如果在同一源文件中,全局變量和局部變量同名,在局部變量作用域范圍內(nèi),只有局部變量有效,全局變量不起作用,也就是說局部變量具有更高優(yōu)先級(jí)。但是從編程規(guī)范上講,是要避免全局變量與局部變量重名的,從而避免不必要的誤解和誤操作。
7.2變量的存儲(chǔ)類別
變量的存儲(chǔ)類別分為自動(dòng)、靜態(tài)、寄存器和外部這四種。其中后兩種暫不介紹,主要介紹自動(dòng)變量和靜態(tài)變量這兩種。
函數(shù)中的局部變量,如果不加static這個(gè)關(guān)鍵字來修飾,都屬于自動(dòng)變量,也叫做動(dòng)態(tài)存儲(chǔ)變量。這種存儲(chǔ)類別的變量,在調(diào)用該函數(shù)的時(shí)候系統(tǒng)會(huì)給他們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束后會(huì)自動(dòng)釋放這些存儲(chǔ)空間。動(dòng)態(tài)存儲(chǔ)變量的關(guān)鍵字是auto,但是這個(gè)關(guān)鍵字是可以省略的。
與動(dòng)態(tài)變量對(duì)應(yīng)的就是靜態(tài)變量。首先,全局變量均是靜態(tài)變量,此外,還有一種特殊的局部變量也是靜態(tài)變量。即在定義局部變量時(shí)前邊加上static這個(gè)關(guān)鍵字,加上這個(gè)關(guān)鍵字的變量就稱之為靜態(tài)局部變量,它的特點(diǎn)是,在整個(gè)生存期中只賦一次初值,在第一次執(zhí)行該函數(shù)時(shí),它的值就是給定的那個(gè)初值,而之后在該函數(shù)所有的執(zhí)行次數(shù)中,它的值都是上一次函數(shù)執(zhí)行結(jié)束后的值,即它可以保持前次的執(zhí)行結(jié)果。
有這樣一種情況,某個(gè)變量只在一個(gè)函數(shù)中使用,但是卻想在函數(shù)多次調(diào)用期間保持住這個(gè)變量的值而不丟失,也就是說在該函數(shù)的本次調(diào)用中該變量值的改變要依賴與上一次調(diào)用函數(shù)時(shí)的值,而不能每次都從初值開始。如果使用局部動(dòng)態(tài)變量的話,每次進(jìn)入函數(shù)后上一次的值就丟失了,它每次都從初值開始,如果定義成全局變量的話,又違背了上面提到的盡量減少全局變量的使用這條原則,那么此時(shí),局部靜態(tài)變量就是最好的解決方案了。
比如第6章最后的例程中有一個(gè)控制數(shù)碼管動(dòng)態(tài)掃描顯示用的索引變量i和實(shí)現(xiàn)秒定時(shí)的計(jì)數(shù)變量cnt,當(dāng)時(shí)就是定義成了全局變量,現(xiàn)在就可以改成局部靜態(tài)變量來試試。
#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //數(shù)碼管顯示緩沖區(qū),初值0xFF確保啟動(dòng)時(shí)都不亮
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char flag1s = 0; //1秒定時(shí)標(biāo)志

void main()
{
unsigned long sec = 0; //記錄經(jīng)過的秒數(shù)

EA = 1; //使能總中斷
ENLED = 0; //使能U3,選擇控制數(shù)碼管
ADDR3 = 1; //因?yàn)樾枰獎(jiǎng)討B(tài)改變ADDR0-2的值,所以不需要再初始化了
TMOD = 0x01; //設(shè)置T0為模式1
TH0 = 0xFC; //為T0賦初值0xFC67,定時(shí)1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0

while (1)
{
if (flag1s == 1) //判斷1秒定時(shí)標(biāo)志
{
flag1s = 0; //1秒定時(shí)標(biāo)志清零
sec++; //秒計(jì)數(shù)自加1
//以下代碼將sec按十進(jìn)制位從低到高依次提取并轉(zhuǎn)為數(shù)碼管顯示字符
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
}
}
/* 定時(shí)器0中斷服務(wù)函數(shù) */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //動(dòng)態(tài)掃描的索引,定義為局部靜態(tài)變量
static unsigned int cnt = 0; //記錄T0中斷次數(shù),定義為局部靜態(tài)變量

TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
cnt++; //中斷次數(shù)計(jì)數(shù)值加1
if (cnt >= 1000) //中斷1000次即1秒
{
cnt = 0; //清零計(jì)數(shù)值以重新開始下1秒計(jì)時(shí)
flag1s = 1; //設(shè)置1秒定時(shí)標(biāo)志為1
}
//以下代碼完成數(shù)碼管動(dòng)態(tài)掃描刷新
P0 = 0xFF; //顯示消隱
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[5]; break;
default: break;
}
}
注意看程序中中斷函數(shù)里的局部變量i,為其加上了static關(guān)鍵字來修飾,就成為了靜態(tài)局部變量。它的初始化i = 0操作只進(jìn)行一次,程序執(zhí)行代碼中會(huì)進(jìn)行i++等操作,那么下次再進(jìn)入中斷函數(shù)的時(shí)候,i會(huì)保持上次中斷函數(shù)執(zhí)行完畢后的值。如果去掉static這個(gè)關(guān)鍵字,那么每次進(jìn)入中斷函數(shù)后,i都會(huì)被初始化成0,可以自己修改程序看一下實(shí)際效果是否和理論相符。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    243

    文章

    24592

    瀏覽量

    690755
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【「芯片設(shè)計(jì)基石——EDA產(chǎn)業(yè)全景與未來展望」閱讀體驗(yàn)】--全書概覽

    不斷完善 7 啟航未來:全球 EDA 發(fā)展趨勢(shì)洞察 7.1 EDA技術(shù)發(fā)展趨勢(shì) 7.2 EDA政策與法規(guī)洞察
    發(fā)表于 01-18 17:50

    VK1616 點(diǎn)陣數(shù)顯LED驅(qū)動(dòng)IC可支持7SEG×4GRID的點(diǎn)陣LED顯示面板

    ?VK1616是一種數(shù)碼管或點(diǎn)陣LED驅(qū)動(dòng)控制專用芯片,內(nèi)部集 成有3線串行接口、數(shù)據(jù)鎖存器、LED驅(qū)動(dòng)等電路。SEG腳接 LED陽極,GRID腳接
    的頭像 發(fā)表于 01-12 16:17 ?179次閱讀
    VK1616 <b class='flag-5'>點(diǎn)陣</b>數(shù)顯<b class='flag-5'>LED</b>驅(qū)動(dòng)IC可支持<b class='flag-5'>7</b>SEG×4GRID的<b class='flag-5'>點(diǎn)陣</b><b class='flag-5'>LED</b>顯示面板

    8 函數(shù)進(jìn)階與按鍵(8.1 8.2)

    用戶與單片機(jī)之間的信息交互需要依賴于兩類設(shè)備:輸入設(shè)備和輸出設(shè)備。前邊講的LED小燈、數(shù)碼管、點(diǎn)陣都是輸出設(shè)備,本章就來學(xué)習(xí)一下最常用的輸入設(shè)備——按鍵,同時(shí)還會(huì)學(xué)到一些硬件電路的基礎(chǔ)知識(shí)與C語言
    的頭像 發(fā)表于 12-18 11:27 ?308次閱讀
    <b class='flag-5'>第</b>8<b class='flag-5'>章</b> 函數(shù)<b class='flag-5'>進(jìn)階</b>與按鍵(8.1 8.2)

    7 變量進(jìn)階點(diǎn)陣LED(7.5 7.6)

    7.5?點(diǎn)陣的動(dòng)畫顯示 點(diǎn)陣的動(dòng)畫顯示,說到底就是對(duì)多張圖片分別進(jìn)行取模,使用程序算法巧妙的切換圖片,多張圖片組合起來就成了一段動(dòng)畫了,動(dòng)畫片、游戲等等基本原理也都是如此。 7.5.1?點(diǎn)陣的縱向
    的頭像 發(fā)表于 12-17 16:51 ?3422次閱讀
    <b class='flag-5'>第</b><b class='flag-5'>7</b><b class='flag-5'>章</b> <b class='flag-5'>變量</b><b class='flag-5'>進(jìn)階</b>與<b class='flag-5'>點(diǎn)陣</b><b class='flag-5'>LED</b>(7.5 7.6)

    7 變量進(jìn)階點(diǎn)陣LED(7.3 7.4)

    習(xí)LED點(diǎn)陣就要輕松得多了。一個(gè)數(shù)碼管是8個(gè)LED組成,同理,一個(gè)8*8的點(diǎn)陣就是由64個(gè)LED小燈組成。圖
    的頭像 發(fā)表于 12-11 14:56 ?658次閱讀
    <b class='flag-5'>第</b><b class='flag-5'>7</b><b class='flag-5'>章</b> <b class='flag-5'>變量</b><b class='flag-5'>進(jìn)階</b>與<b class='flag-5'>點(diǎn)陣</b><b class='flag-5'>LED</b>(7.3 7.4)

    FZH367 具有獨(dú)立自動(dòng)呼吸功能的LED(12×16)點(diǎn)陣驅(qū)動(dòng)芯片 原廠技術(shù)支持

    概述 型號(hào):FZH367FZH367是一種具有獨(dú)立自動(dòng)呼吸功能的LED(12×16)點(diǎn)陣驅(qū)動(dòng)芯片。芯片通過I2C協(xié)議控制每個(gè)LED實(shí)現(xiàn) 3 種自動(dòng)呼吸模式及PMW模式的切換控制。此外,芯片具備
    發(fā)表于 11-18 09:18

    原廠 FZH365 具有獨(dú)立自動(dòng)呼吸功能的LED(12×12)點(diǎn)陣驅(qū)動(dòng)芯片

    是一種具有獨(dú)立自動(dòng)呼吸功能的LED(12×12)點(diǎn)陣驅(qū)動(dòng)芯片。芯片通過I2C協(xié)議控制每個(gè) LED實(shí)現(xiàn) 3 種自動(dòng)呼吸模式及PMW模式的切換控制。此外,芯片具備對(duì)每一個(gè)LED的開短路檢
    發(fā)表于 11-17 09:38

    原廠 FZH364 一款8×8點(diǎn)陣恒流LED驅(qū)動(dòng)芯片

    )FZH364是一款8×8點(diǎn)陣恒流LED驅(qū)動(dòng)芯片。可廣泛應(yīng)用于各種單色調(diào)光LED顯示系統(tǒng),或RGB 全彩LED顯示系統(tǒng)。每顆LED都可以通過
    發(fā)表于 11-17 09:34

    2 點(diǎn)亮你的LED(2.5)

    程序5個(gè)步驟: 1步:芯片型號(hào),選擇STC89C52RC系列下的STC89C52RC/LE52RC,一定不能選錯(cuò)。 2步:掃描串口,根據(jù)查到的
    的頭像 發(fā)表于 10-16 10:58 ?505次閱讀
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b> 點(diǎn)亮你的<b class='flag-5'>LED</b>(2.5)

    2 點(diǎn)亮你的LED(2.3 2.4)

    2.3?LED小燈 LED(light-emitting diode),即發(fā)光二極管,俗稱LED小燈,它的種類很多,參數(shù)也不盡相同,Kingst51開發(fā)板上用的是普通的貼片發(fā)光二極管。這種二極管通常
    的頭像 發(fā)表于 10-15 14:37 ?994次閱讀
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b> 點(diǎn)亮你的<b class='flag-5'>LED</b>(2.3 2.4)

    2 點(diǎn)亮你的LED

    本章的標(biāo)題是點(diǎn)亮LED,雖然任務(wù)很簡(jiǎn)單,但是需要了解的單片機(jī)基礎(chǔ)知識(shí)卻很多,特別是對(duì)于初學(xué)者,剛開始要在頭腦中建立一個(gè)單片機(jī)的概念,然后通過點(diǎn)亮一個(gè)LED小燈來增加初學(xué)者對(duì)單片機(jī)的興趣和自信
    的頭像 發(fā)表于 10-13 15:52 ?509次閱讀
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b>  點(diǎn)亮你的<b class='flag-5'>LED</b>

    Texas Instruments TPS92401 LED點(diǎn)陣控制器數(shù)據(jù)手冊(cè)

    FET為單個(gè)LED提供PWM調(diào)光功能。TPS92401點(diǎn)陣控制器包含一個(gè)用于系統(tǒng)時(shí)鐘的內(nèi)部振蕩器,可支持高達(dá)16位的集成PWM 發(fā)生器,其可編程PWM頻率高達(dá)60kHz。這些LED點(diǎn)陣
    的頭像 發(fā)表于 07-14 14:38 ?787次閱讀
    Texas Instruments TPS92401 <b class='flag-5'>LED</b><b class='flag-5'>點(diǎn)陣</b>控制器數(shù)據(jù)手冊(cè)

    RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-130 GPIO的調(diào)試方法

    RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-130 GPIO的調(diào)試方法
    的頭像 發(fā)表于 06-03 11:32 ?1285次閱讀
    RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-<b class='flag-5'>第</b>130<b class='flag-5'>章</b> GPIO的調(diào)試方法

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用
    的頭像 發(fā)表于 05-21 14:15 ?700次閱讀
    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)<b class='flag-5'>進(jìn)階</b>篇-<b class='flag-5'>進(jìn)階</b><b class='flag-5'>7</b> 向系統(tǒng)中添加一個(gè)系統(tǒng)調(diào)用

    單片機(jī)外圍電路設(shè)計(jì) (2版)

    及智能傳感器的接口技術(shù)。4闡述單片機(jī)測(cè)控系統(tǒng)的設(shè)計(jì)。5闡述數(shù)據(jù)采集系統(tǒng)及新穎檢測(cè)電路的設(shè)計(jì)。6
    發(fā)表于 04-18 16:16