stc89c52單片機 就是 51 & 52 系列單片機,就和 AT89C52 差不多,沒有什么大的區別,可以直接替換,只是 內部多了一個 EEPROM 空間,可以 串口下載程序,指令執行速度 快一倍。
STC89C52是一種帶8K字節閃爍可編程可檫除只讀存儲器(FPEROM-Flash Programable and Erasable Read Only Memory )的低電壓,高性能COMOS8的微處理器,俗稱單片機。該器件采用ATMEL搞密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。
下面是一個stc89c52單片機下的矩陣鍵盤程序,P0口接鍵盤,顯示在P2口。
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit key2=P3^3;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定義八個燈的工作狀態。
uchar code wep[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void yanshi(uint t)
{
while(--t);
}
void main()
{
uchar han,lei,key;
while(1)
{
P0=0xf0; //初始化為開關狀態。11110000
han=P0; //han變量讀取P0口的值。第一次掃描鍵盤。
han=han&0xf0; //對han變量與0xf0與。
//如果結果等于P0口初值(0xf0)說明沒有鍵被按下。
//如果結果不等于P0(0xf0)口初值,說明有鍵按下。
if(han!=0xf0)
yanshi(125*5); //延時消抖。
if(han!=0xf0) //語句執行到這里說明真的有鍵按下。
{ //例如按下S1鍵。則P0=1110 0000
lei=P0&0xf0; //lei讀取P0口的值。
lei=lei|0x0f; //lei=11101111
P0=lei; //P0=11101111
han=P0; //han=11101110 第二次掃描鍵盤,
//因為這里按鍵S1還是閉合的狀態。
han=han&0x0f; //han=00001110
lei=lei&0xf0; //lei=11100000
key=han+lei;
}
switch(key)
{
case 0xee: P2=tab[0]; break;
case 0xde: P2=tab[1]; break;
case 0xbe: P2=tab[2]; break;
case 0x7e: P2=tab[3]; break;
case 0xed: P2=tab[4]; break;
case 0xdd: P2=tab[5]; break;
case 0xbd: P2=tab[6]; break;
case 0x7d: P2=tab[7]; break;
case 0xeb: P2=tab[8]; break;
case 0xdb: P2=tab[9]; break;
case 0xbb: P2=tab[10]; break;
case 0x7b: P2=tab[11]; break;
case 0xe7: P2=tab[12]; break;
case 0xd7: P2=tab[13]; break;
case 0xb7: P2=tab[14]; break;
case 0x77: P2=tab[15]; break;
}
}
}
評論