LED燈、按鍵共用4個單片機IO示例
無標題.jpg (117.37 KB, 下載次數: 79)
下載附件
2020-8-15 07:33 上傳
#include <reg52.h>
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sbit LED1 = P1^4; //LED端口聲明
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;
unsigned char KeySec=0;//鍵值變量
/**********************************
1ms延時程序(僅限于STC15W 1T MCU)
**********************************/
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
/**********************************
按鍵掃描程序
**********************************/
void key_scan()
{
static unsigned char count=0;//靜態計數變量
static bit sign_key=0; //靜態標志位
unsigned char time_key,time_LED;//臨時變量
time_LED=P1&0xf0;//保存4個LED狀態
P1M0=0x00;//P1.4~7設置弱上拉
P1M1=0x00;//P1.4~7設置弱上拉
P1|=0xf0; //P1.4~7置高電平
if(P1&0xf0!=0xf0)//有鍵按下
{
if(++count>=10 && sign_key==0)//消抖
{
sign_key=1;//自鎖
time_key=P1&0xf0;//保存P1.4~7狀態
switch(time_key)
{
case 0xe0: KeySec=1; break;//輸出鍵值
case 0xd0: KeySec=2; break;
case 0xb0: KeySec=3; break;
case 0x70: KeySec=4; break;
}
}
}
else //抬起
{
count=0;//計數變量清0
sign_key=0;//鍵態標志清0
}
P1&=0x0f; //P1.4~7清0
P1|=time_LED;//還原4個LED狀態
P1M0=0xf0; //還原P1.4~7推挽設置
P1M1=0x00; //還原P1.4~7推挽設置
}
/*********************************
按鍵服務程序
*********************************/
void key_service()
{
switch(KeySec)
{
case 1: LED1=~LED1;KeySec=0;break;
case 2: LED2=~LED2;KeySec=0;break;
case 3: LED3=~LED3;KeySec=0;break;
case 4: LED4=~LED4;KeySec=0;break;
}
}
/********************************
主程序
********************************/
void main()
{
P1M0=0xf0;//P1.4~7設置推挽
P1M1=0x00;//P1.4~7設置推挽
while(1)
{
key_scan();
key_service();
Delay1ms();//控制主循環周期約1ms
}
}
|