|
QQ圖片20180728105855.png (51.92 KB, 下載次數(shù): 55)
下載附件
2018-7-28 11:00 上傳
/******************************
配合原理圖編寫
帶編碼器的直流小電機(jī)的控制軟件
2018-06-13
內(nèi)部晶體頻率11.0592MHz
*******************************/
#include "STC15W40XXX.H"
#include "intrins.h"
sbit LEDA=P3^5;
sbit LEDB=P3^6;
sbit LEDC=P3^7;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
sbit KEY1=P3^4;
bit key=0;
bit KeySta = 1; //當(dāng)前按鍵狀態(tài)
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned char cnt=14;
void Key_scan(); //按鍵掃描函數(shù)
void Key_Function(); //按鍵功能函數(shù)
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void main()
{
//定時(shí)器T0設(shè)定
EA=0; //關(guān)閉總中斷
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x66; //設(shè)置定時(shí)初值
TH0 = 0xFC; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0=1; //禁止T0中斷
EA = 1;
LEDA=LEDB=LEDC=0;
P1=0X00;
while(1)
{
unsigned char i;
if(key)
{
LED1=1;LED2=0;for(i=0;i<cnt;i++){Delay5ms();}
LED2=1;LED3=0;for(i=0;i<cnt;i++){Delay5ms();}
LED3=1;LED4=0;for(i=0;i<cnt;i++){Delay5ms();}
LED4=1;LED5=0;for(i=0;i<cnt;i++){Delay5ms();}
LED5=1;LED6=0;for(i=0;i<cnt;i++){Delay5ms();}
LED6=1;LED7=0;for(i=0;i<cnt;i++){Delay5ms();}
LED7=1;LED8=0;for(i=0;i<cnt;i++){Delay5ms();}
LED8=1;LED1=0;for(i=0;i<cnt;i++){Delay5ms();}
}
else
{
P1=0XFF;
}
}
}
//定時(shí)器2中斷入口
void t0int() interrupt 1 //中斷入口
{
static bit on=1;
static unsigned int time1=0;
time1++;
if(on)
{
Key_scan();
Key_Function();
}
if(KEY1==0)
{
time1++;
if(time1==1800)
{
if(KEY1==0)
{
on=!on;
key=!key;
}
}
}
else
{
time1=0;
}
}
void Key_scan()//按鍵掃描函數(shù)
{
static unsigned char keybuf = 0xFF; //掃描緩沖區(qū),保存一段時(shí)間內(nèi)的掃描值
keybuf = (keybuf<<1) | KEY1; //緩沖區(qū)左移一位,并將當(dāng)前掃描值移入最低位
if (keybuf == 0x00)
{ //連續(xù) 8 次掃描值都為 0,即 16ms 內(nèi)都只檢測到按下狀態(tài)時(shí),可認(rèn)為按鍵已按下
KeySta = 0;
}
else if (keybuf == 0xFF)
{ //連續(xù) 8 次掃描值都為 1,即 16ms 內(nèi)都只檢測到彈起狀態(tài)時(shí),可認(rèn)為按鍵已彈起
KeySta = 1;
}
else
{} //其它情況則說明按鍵狀態(tài)尚未穩(wěn)定,則不對(duì) KeySta 變量值進(jìn)行更新
}
void Key_Function()
{
if (KeySta != backup) //當(dāng)前值與前次值不相等說明此時(shí)按鍵有動(dòng)作
{
if (backup == 0) //如果前次值為 0,則說明當(dāng)前是彈起動(dòng)作
{
key=1;
cnt--;
if(cnt==9)
cnt=14;
}
backup = KeySta; //更新備份為當(dāng)前值,以備進(jìn)行下次比較
}
|
評(píng)分
-
查看全部評(píng)分
|