并行I/O口擴充執行個體
//《51單片機原理及應用(第二版)——基于Keil C與Proteus》第四章例4.4
I/O口不能完全用于輸入/輸出操作,當需要擴充外部存儲器時,P0、P2口用作位址總線和資料總線,此時能用的I/O口就隻有P1和P3口,如果再使用串行通信,I/O口就不夠使用了,需要擴充I/O口
兩種方式:
① 采用普通鎖存器、三态門等晶片來進行簡單的擴充(如74LS373或74LS244等)
② 采用可程式設計的I/O晶片來擴充(如8255或8155等)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
要求:用4個開關控制4個LED的亮滅狀态,其中采用74LS244控制開關的輸入,采用74LS373控制LED輸出
代碼:

電路圖:
過程分析:
過程://右鍵點選圖檔"在新标簽頁中打開圖檔"即可放大
- #18 P0=0xff; 通過拉高P0口置為1111 1111,即關閉LED燈;
- #19 com=0; 對CD4071 U2.A的1和CD4071 U2.B的5輸入一個0;
- #20 rd = 0; 對CD4071 U2.A的2輸入一個0;
- 由于CD4071的功能是執行邏輯或運算,1和2分别輸入0,則3輸出0給74LS244的OE口;
- 74LS244緩沖驅動器的OE為使能端,低電平是有效的,高電平時輸出為三态,此時通過CD4071傳給OE低電平,使開關的電平可以通過74LS244傳入P0;
- 開關狀态傳入P0;
- #21 temp = P0; 通過定義的unsigned char temp來存放P0的狀态
- #22 rd = 1; 對CD4071 U2.A的2輸入一個1;
- 1=0;2=1;此時或門輸出為1;
- 74LS244的OE端高電平時輸出為三态,關閉74LS244
- #23 wr = 1;對CD4071 U2.B的6輸入一個1;
- 此時5=0;6=1;CD4071 U2.B的7輸出一個1;
- 74LS343的OE為低電平時,用作位址鎖存器;LE為高電平時,輸出Q0-Q7狀态與D0-D7狀态相同;當LE發生負跳變(1->0)時,輸入端的D0-D7鎖入Q0-Q7
- #24 P0 = temp; temp中的資料存入P0,傳送到74LS343的D端;
- #25 wr = 0; 對CD4071 U2.B的6輸入一個0;
- 此時5=0;6=0;CD4071 U2.B的7輸出一個0;
- LE的狀态從1->0,發生負跳變,輸出Q0-Q7
- LED 等接受到開關的情況,發生亮滅。
實驗結果
轉載于:https://www.cnblogs.com/hughdong/p/6734899.html