欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
詳細注釋的單片機4位8段共陽數碼管動態顯示固定數字0123程序
[打印本頁]
作者:
越快樂越墮落
時間:
2022-4-2 10:18
標題:
詳細注釋的單片機4位8段共陽數碼管動態顯示固定數字0123程序
4位8段共陽數碼管動態顯示固定數字0123
下面是我根據程序做的注釋,如有錯誤之處請指正!
單片機源程序如下(每一行都有詳細的注釋):
/* 4位8段共陽數碼管顯示固定數字:數碼管的動態顯示0123
數碼管顯示原理
1.靜態顯示
多位數碼管依然可以靜態顯示,但是顯示時要么只顯示一位數碼管,
否則一體的多位同時顯示必須時顯示相同內容。
當多位數碼管應用于某一系統時,它們的“位選”是可獨立控制的,
而“段選”是連接在一起的,我們可以通過位選信號控制哪幾個數碼管亮,
而在同一時刻,位選選通的所有數碼管上顯示的數字始終都是一樣的,
因為它們的段選是連接在一起的,所以送入所有數碼管的段選的信號都是相同的,
那么他們顯示的數字必定一樣。(換言之,你可以通過位選控制那個數碼管亮,但是亮的同時顯示的數字必定相同)
2.動態顯示
位選控制亮不亮,而段選控制顯示數字,
那怎樣顯示不同的數字呢?這就利用了人體肉眼觀察的能力。
舉個例子,
假設段選1控制第一位數碼管數字顯示1,那么在顯示第二個數碼管是段選控制數碼管顯示2,
而位選控制燈第二位數碼管亮,第一位數碼管滅。但是給人的感受是第一位數碼管并沒有滅(實際已經滅了),
因為時間太短人體肉眼無法識別。這樣就會發現數碼管動態顯示是向左或向右一位一位點亮。 */
#include <reg52.h>//包含51系列頭文件
typedef unsigned char uchar;
//typedef和define的作用是相似的(但實質卻不一樣),都是給unsigned char定義一個別名。
//也就是說,在定義這個別名之后,你用uchar就等于unsigned char
//unsigned char意為無符號字符型數據,占8位數,范圍是0~255,簡寫縮寫為uchar
/* typedef和define的區別
typedef 是用來定義一種類型的新別名的,它不同于宏(#define),不是簡單的字符串替換。
它的新名字具有一定的封裝性,所以新命名的標識符具有更易定義變量的功能。
它是語言編譯過程的一部分,但它并不實際分配內存空間。
而 #define 只是簡單的字符串替換(原地擴展),它本身并不在編譯過程中進行,而是在這之前(預處理過程)就已經完成了。
因此,它不會做正確性檢查,不管含義是否正確它照樣會帶入,只有在編譯已被展開的源程序時才會發現可能的錯誤并報錯。
接下來看下面的示例代碼:
typedef char * PCHAR1;
#define PCHAR2 char *
PCHAR1 c1, c2;// c1、c2 都為char *,typedef為char *引入了一個新的別名
PCHAR2 c3, c4;//相當于char * c3, c4;c3是char *,而c4是char
在定義上述的變量時,c1、c2 與 c3 按照預期都被定義成 char* 類型。
值得注意的是,c4 卻被定義成 char 類型,而不是我們所預期的 char*。
其根本原因就在于 #define 只是簡單的字符串替換,而 typedef 則是為一個類型引入一個新的別名。
*/
uchar table[] =
//uchar是數組類型,占8位數,范圍是0~255。
//table是數組名稱,可以自由定義,但不能和關鍵字重名,后面必須加[],內部可注明當前數組內的元素個數,也可不注明。
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//從前往后分別是0123456789
uchar address[] =
//uchar是數組類型,占8位數,范圍是0~255。
//address是數組名稱,可以自由定義,但不能和關鍵字重名,后面必須加[],內部可注明當前數組內的元素個數,也可不注明。
{0x7F,0xBF,0xDF,0xEF}; //從前往后分別是0111~1110,共陽數碼管,故0為有效,分別對應數碼的千百十個....
void Delay(uchar m)
//C語言定義延時函數主要通過無意義指令(void意為空)的執行來達到延時的目的。
//delay為延時,void delay為延時子程序。
//m代表需要延時多少毫秒,uchar范圍是0-255
{
unsigned char a, b;
//定義兩個個無符號字符型變量a和b
//for(; m > 0; m--)
for(b = m; b > 0; b--)
//本句后面沒有分號,所以編譯器會默認第二個也就是下一行的for語句是本行延時語句的內部語句。
for(a = 2; a > 0; a--);
//程序在執行時,第一個for語句中的b每減1次,第二個for語句便執行2次,因此一共執行m*2次。
}
int main()
//void定義的函數沒有返回值,int定義的函數返回整型值,int為有符號整型值,范圍是-32768~32767
{
uchar i = 0;
//定義一個無符號字符型整數i為0
while(1) //while語句的作用是讓程序停止在某處,或延時。
//括號里面的1為表達式,表達式可以為一個常數,一個運算或一個帶返回值的函數。
//此句后沒有跟分號,所以會默認后面第一個分號前的語句為它的內部語句。
{
if (i == 4) //一輪循環亮起后從頭開始。if為選擇語句,i==4,兩個==寫在一起表示測試相等,
//即判斷等號兩邊的數是否相等。數字4為數碼管是4個,對應前面的位碼4個
i = 0; //意思是從第一個數碼管開始顯示
P3 = address[i]; //通過P3控制要亮的數碼管位
P0 = table[i]; //通過P1控制要顯示的數碼管的段
++i; //故i++1(i自加1),即第二個第三個第四個數碼管相繼顯示
//Delay(1); //快速動態顯示
Delay(1000); //延時1000ms,可消除鬼影,達到消影
}
}
復制代碼
作者:
heicad
時間:
2022-4-3 02:14
這個單片機程序不錯 特別適合初學者
作者:
GEECGYJ
時間:
2022-4-3 08:55
只用延時的方法消除鬼影,會影響顯示頻率,數碼管會閃爍!!
作者:
越快樂越墮落
時間:
2022-4-3 10:32
GEECGYJ 發表于 2022-4-3 08:55
只用延時的方法消除鬼影,會影響顯示頻率,數碼管會閃爍!!
是的!這是最基礎的
作者:
sonique0371
時間:
2022-4-4 09:10
靜態顯示的時候,4個并行口各單獨接一個8段數碼管,可以同時顯示不同的數字。
作者:
chscn
時間:
2022-4-6 11:12
51黑,有你更精彩
作者:
chscn
時間:
2022-4-6 11:17
P3 = address
;
//通過P3控制要亮的數碼管位
P0 = table
;
//通過P1控制要顯示的數碼管的段
先片選,后輸出顯示碼,就會消除
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1