①透明模式測試(~OE=0,LE=1)
這種模式下,相當于一個數據緩沖器,Q延遲D輸出相同的電平,通過單個數碼顯示0~F能夠得到驗證。
②鎖存讀寄存器(~OE=0,LE=0)
將LE拉低,輸入端的變化對輸出端沒有影響,這時在第一種模式的基礎上,寄存器中的數據被鎖存。
③鎖存輸出無效(~OE=1,LE=0)
此模式下,不工作,沒有輸出,不工作。
/*
驗證程序出錯,特別注意使用P0口驅動某一模塊的時候要加上拉電阻,盡量不要使用P0口。如果把P0全部替換為P2程序也是不正確的,因為定義的按鍵也是P2,這時會一直執行while(!key1);在程序執行完第一次0~9的顯示后,P2^0和P2^2都被清零,且一直保持,這樣就會停留顯示9,因此根據電路的焊接情況將P2全部替換為P3,執行程序能夠達到預想的功能。
*/
#include<reg52.h>
unsigned int tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit OE=P1^0;
sbit LE=P1^1;
sbit key1=P2^0;
sbit key2=P2^2;
void delayms(unsigned int cnt)
{
unsigned int x,y;
for(x=cnt;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
unsigned int n;
OE=0;
LE=1;
while(1)
{
for(n=0;n<10;n++)
{
P0=tab[n];
delayms(1000);
}
if(!key1) //鎖存讀寄存器模式
{
delayms(10);
while(!key1); //防止長按不放;
if(key1)
{
delayms(10);
if(key1)
{
OE=0;
LE=0;
}
}
}
if(!key2) //鎖存輸出無效
{
delayms(10);
while(!key2);
if(key2)
{
delayms(10);
if(key2)
{
OE=1;
LE=1;
}
}
}
}
}
/*
OE直接接地,不需要任何操作,OE置高電平沒有意義。修改程序后確實能夠實現循環顯示0~f,但是按鍵失靈,也就是無法操縱LE清零。按鍵按下后P1^1沒有清零。也許是老毛病,在有較長時間延時函數出現的地方,不能在主函數中出現按鍵檢測,這樣是檢測不到信號的,以前出現過這種情況,因為按鍵信號和延時函數時間之比相差上百倍,只有在那幾百分之一秒的適當時間按下按鍵才能被檢測,這種幾率是很小的,所以按鍵會失效。
*/
#include<reg52.h>
unsigned int tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit LE=P1^1;
sbit key1=P2^0;
sbit key2=P2^2;
void delayms(unsigned int cnt)
{
unsigned int x,y;
for(x=cnt;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
unsigned int n,OE;
OE=0;
LE=1;
while(1)
{
for(n=0;n<10;n++)
{
P3=tab[n];
delayms(1000);
}
if(!key1)
{
delayms(10);
while(!key1);
if(key1)
{
delayms(10);
if(key1)
LE=0;
}
}
if(!key2)
{
delayms(10);
while(!key2);
if(key2)
{
delayms(10);
if(key2)
LE=1;
}
}
}
}
/*
修改按鍵程序,采用中斷或者定時掃描。因為接線原因,P3口已被使用,所以采用定時掃描進行按鍵檢測。但是我的AVR Fighter和Progisp突然間都不能使用了,出現avr fighter沒有發現USB設備,查找硬件和驅動程序都沒有問題,可能是電腦出現了什么問題,在系統還原之前換了一臺電腦,avr fighter還是不能用,但是Progisp能夠燒錄。此程序在按下key1的時候能夠進行鎖定,但是key2失效,按下Key2的時候也能出現鎖定,總是出現混亂。
萬用表檢測P1^0口的電平,在key1被按下的時候確實被清零,在key2按鍵被按下的時候置一。但是P1^0口接LE,在按鍵key2被按下的時候應該能夠重新跳進主程序,繼續循環顯示,但是沒有變化。
*/
#include<reg51.h>
unsigned int tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit LE=P1^0;
sbit key1=P2^0;
sbit key2=P2^2;
void delayms(unsigned int cnt)
{
unsigned int x,y;
for(x=cnt;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
unsigned int n;
LE=1;
TMOD|=0x01;
EA=1;
TR0=1;
ET0=1;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1)
{
for(n=0;n<10;n++)
{
P3=tab[n];
delayms(1000);
}
}
}
void timer0(void) interrupt 1 using 0
{
TH0=(65536-1000)/256;//1MS檢測一次
TL0=(65536-1000)%256;
if(!key1)
{
delayms(10);
while(!key1);
if(key1)
{
delayms(10);
if(key1)
LE=0;
}
}
if(!key2)
{
delayms(10);
while(!key2);
if(key2)
{
delayms(10);
if(key2)
LE=1;
}
}
}
/*
使用調試模式,寄存器組發生沖突,去掉using x后,能夠跳至主程序。一般情況下在定期器和中斷中不要使用using,自動進行分配和優化比較好!所謂下降沿觸發,指的是進入鎖存模式的時候!
*/
/*
373的使用同573基本功能一樣,跳變沿觸發鎖存!注意實際中的引腳是交*排列的。下面使用proteus進行模擬演示!上次上課使用using的時候要特別留意,一般不使用,自動重載的含義(10模式2),第三種模式(11模式3)一般用于同步計數。
*/
#include<reg51.h>
unsigned int tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit LE=P2^0;
sbit key1=P2^1;
sbit key2=P2^2;
void delayms(unsigned int cnt)
{
unsigned int x,y;
for(x=cnt;x>0;x--)
for(y=110;y>0;y--);
}
main()
{
unsigned int n;
LE=1;
TMOD|=0x01;
EA=1;
TR0=1;
ET0=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
while(1)
{
for(n=0;n<10;n++)
{
P1=tab[n];
P3=0x0;
delayms(1000);
P3=0xff;
delayms(1000);
}
}
}
void timer0(void) interrupt 1 using 2
{
TH0=(65536-20000)/256;//20MS檢測一次
TL0=(65536-20000)%256;
if(!key1)
{
delayms(5);
while(!key1);
if(key1)
{
delayms(5);
if(key1)
LE=0;
}
}
if(!key2)
{
delayms(5);
while(!key2);
if(key2)
{
delayms(5);
if(key2)
LE=1;
}
}
}
