【正文】
設(shè)定義了一個(gè)數(shù)組 a[5]和一個(gè)指針變量 ap: char data a[5]。 char data *ap。 ? 僅此兩句并不能說(shuō)明變量 ap是指向數(shù)組的,還必須將數(shù)組的起始地址賦給該變量: ap=a。 /*數(shù)組 a[ ]的起始地址賦給指針變量 ap*/ 或 ap=amp。a[0]。 /*意義同上 */ 也可以使定義和賦值在一條語(yǔ)句完成: char data *ap= a; 或 char data * ap=amp。a[0]。 2) 利用指向數(shù)組的指針變量引用數(shù)組元素 指向數(shù)組的指針變量引用數(shù)組元素有兩種方法: *(ap+i) 或 ap(i) ,它們等同于 *(a+i)或 a (i) 例 main(){ char a[5]={11,22,33,44,55}。 char b,c,d。 char *ap。 ap=a。 /* ap等于數(shù)組 a[5]的起始地址 */ b=a+2。 /* b等于數(shù)組元素 a[2]的地址 */ c=ap+3。 /* c等于數(shù)組元素 a[3]的地址 */ d=*(ap+3)。 /* d等于數(shù)組元素 a[3]的值, 即 d=44 ,等同于 d=a (3) */ } 編程將 8051的內(nèi)部數(shù)據(jù)存儲(chǔ)器 20H單元和 35H單元的數(shù)據(jù)相乘,結(jié)果存到外部數(shù)據(jù)存儲(chǔ)器中 (位置不定 ) include void main() { int data *point1=0x20。 int data *point2=0x35。 xdata int result。 result=(*point1)*(*point2)。 } 用并行口設(shè)計(jì) LED數(shù)碼顯示器 和鍵盤(pán)電路 ? 鍵盤(pán)和顯示器是單片機(jī)應(yīng)用系統(tǒng)中常用的輸入輸出裝置。 ? LED數(shù)碼顯示器是常用的顯示器之一 ? 下面介紹用單片機(jī)并行口設(shè)計(jì) LED數(shù)碼顯示電路和鍵盤(pán)電路的方法。 用并行口設(shè)計(jì) LED顯示電路 1. LED顯示器及其原理 ? LED有著顯示亮度高,響應(yīng)速度快的特點(diǎn),最常用的是七段式 LED ? 七段 LED顯示器內(nèi)部由七個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,根據(jù)各管的亮暗組合成字符。 ? 常見(jiàn) LED的管腳排列見(jiàn)圖 (a)。 其中 COM為公共點(diǎn),根據(jù)內(nèi)部發(fā)光二極管的接線形式,可分成共陰極型圖 ((b))和共陽(yáng)極型圖 ((c))。 a b c d e f g dp (a) (b)共陰極型 (c)共陽(yáng)極型 c d e dp 1 2 3 4 5 6 7 8 9 10 a b f g a b c e f a b c d e f g dp 圖 g d 0 0 1 1 1 1 1 1 3fh dp g f e d c b a ?LED數(shù)碼管的 g~ a七個(gè)發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不能發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱(chēng)之為字形碼 (段碼 ) a b c d e f g dp c d e dp 1 2 3 4 5 6 7 8 9 10 a b f g a b c e f g d ?如顯示 ‖0‖,字形碼為 3fh. a b c d e f g dp 1 2 3 4 5 6 7 8 9 10 a b f g a b c e f g x g f e d c b a 0 0 0 0 0 1 1 0 06h 顯示 ‖1‖,字形碼為 06h. d 顯示 ‖2‖,字形碼為 5bh. x g f e d c b a 0 1 0 1 1 0 1 1 5bh dp a b c d e f g dp c d e 1 2 3 4 5 6 7 8 9 10 a b c e f g d 顯示字符 段符號(hào) 共陰 共陽(yáng) 0 3FH C0 1 06H F9 2 5BH A4 3 4FH B0 4 66H 99 5 6DH 92 6 7DH 82 7 07H F8 8 7FH 80 9 6FH 90 A 77H 88 B 7CH 83 C 39H C6 D 5EH A1 E 79H 86 F 71H 84 H 76H FF P F3H BF 顯然共陽(yáng)極和共陰極的字形碼是不同的 ,其字形碼見(jiàn)表 ? ? 數(shù)碼管的接口有靜態(tài)接口和動(dòng)態(tài)接口。 ? 靜態(tài)接口 為固定顯示方式,無(wú)閃爍,其電路可采用一個(gè)并行口接一個(gè)數(shù)據(jù)管,數(shù)碼管的公共端按共陰或共陽(yáng)分別接地或 Vcc。這種接法占用接口多,如果 PO口和 P2口要用作數(shù)據(jù)線和地址線,僅用單片機(jī)的并行口就只能接二個(gè)數(shù)碼管。 ? 動(dòng)態(tài)接口 采用各數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示頻率較高時(shí),利用人眼的暫留特性 ,看不出閃爍顯示現(xiàn)象,這種顯示需要一個(gè)接口完成字形碼的輸出 (字形選擇 ),另一接口完 成各數(shù)碼管的輪流點(diǎn)亮 (數(shù)位選擇 )。 原理圖 P10 P11 P12 000 … … 111 ? S11~S14 S21~S24 位選 P20 ~ P27 DP20~DP27 a b c d e f g dp 段選 0~F,熄滅,停機(jī) ? uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}。 //數(shù)值‘ 39。0- F39。 39。熄滅 ‘ void delay(uchar zz) { uchar x,y。 for(x=zz。x0。x) for(y=56。y0。y) 。} void main() { uchar i。 P1=0x01。 for(i=0。i17。i++) {P2=duma[i]。delay(1000)。} while(1)。 } 有什么問(wèn)題? 從左到右流水燈,從右到左流水燈,熄滅,閃爍 5次,重復(fù) void main() { while(1) { uint i。 P2=0xfe。 //1 for(i=0。i7。i++) {P2=_crol_(P2,1)。 delay(1000)。} P2=0x7f。 //2 for(i=0。i7。i++) {P2=_cror_(P2,1)。 delay(1000)。} P2=0xff。 for(i=0。i5。i++) //3 { P2=0x00。delay(1000)。 P2=0xff。delay(1000)。 } }} 1: 必須要加延時(shí),不然第一個(gè) LED的點(diǎn)亮,觀察不到 2:可以不要此條語(yǔ)句 3:可以改成 for(i=0。i10。i++)P2=~P2。delay(1000)。 //李今鳴 void delay(uint x) { uint i,k。 for(i=0。ix。i++) for(k=0。k60。k++)。 } void main() { char i,j,k。 P2=0xff。 delay(1000)。 P2=0xfe。 delay(1000)。 for(i=0。i7。i++) { P2=(P21)|1。 delay(1000)。 } for(j=0。j7。j++) { P2=(P21)|0x80。 delay(1000)。 } P2=0xff。 delay(1000)。 for(k=0。k10。k++) { P2=~P2。 } } Eg. 數(shù)碼管流水顯示 0~F,熄滅 uint code weix[]={0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0}。