|
藍(lán)橋杯單片機(jī)開發(fā)板 CT107D開發(fā)板矩陣按鍵 數(shù)碼管顯示,含定時器源碼,J5跳線 接12關(guān)鍵 ,J13接23
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define Y4 P2 = 0X9F & (P2 | 0XE0); //打開y4 可以控制led
#define Y5 P2 = 0XBF & (P2 | 0XE0); //打開y5 可以控制蜂鳴器
#define Y6 P2 = 0XDF & (P2 | 0XE0); //打開y6 可以控制數(shù)碼管位選
#define Y7 P2 = 0XFF & (P2 | 0XE0); //打開y7 可以控制數(shù)碼管段選
/****************************************************************************
* 數(shù)碼管
****************************************************************************/
/*加上code的話 存在rom中 數(shù)不可變*/
unsigned char code table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code w[8] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char display_buff[10] = {0,1,2,3,4,5,6,7,8,9};
int number = 0;
/****************************************************************************
* 延時
****************************************************************************/
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do
{
while (--j);
} while (--i);
}
/****************************************************************************
* 矩陣按鍵
****************************************************************************/
bit key_flag = 0; //當(dāng)按鍵按下為1,沒有按下為0
uchar key_num = 0; //存儲按鍵的值
void key_debounce()
{
Delay10ms();
while(!(P34&P35&P42&P44));
Delay10ms();
}
int key_scanf()
{
uchar key_y,key_x = 0;
if(key_flag == 0) //為0 時 掃描
{
P3 = 0x0f;
P42 = 0;
P44 = 0;
if(!P30|!P31|!P32|!P33)
{
if(P30 == 0){key_y = 1;}
if(P31 == 0){key_y = 2;}
if(P32 == 0){key_y = 3;}
if(P33 == 0){key_y = 4;}
}
P3 = 0xf0;P42 = 1;P44 = 1;
if(!P34|!P35|!P42|!P44)
{
if(P34 == 0){key_x = 4;}
if(P35 == 0){key_x = 3;}
if(P42 == 0){key_x = 2;}
if(P44 == 0){key_x = 1;}
}
if(key_x == 0)
{
key_flag = 0;
}
else
{
key_num = key_y * 4 + key_x - 5;
}
}
return key_num;
}
/****************************************************************************
* 定時器中斷初始化
****************************************************************************/
void Timer0Init(void) //3毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0x66; //設(shè)置定時初值
TH0 = 0x7E; //設(shè)置定時初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
ET0 =1;
EA = 1;
}
/****************************************************************************
* 中斷服務(wù)函數(shù)
****************************************************************************/
void timer0() interrupt 1
{
key_scanf();
}
/****************************************************************************
* 主函數(shù)
****************************************************************************/
int main()
{
P2 = 0XA0; //關(guān)閉蜂鳴器
P0 = 0X00;
P2 = 0X00; //關(guān)閉所有l(wèi)ed
P0 = 0XFF;
Timer0Init(); //定時器中斷初始化.
while(1)
{
key_debounce();
number = key_scanf();
Y6; //位選
P0 = w[1];
Y7; //段選
P0 = table[display_buff[number / 10]];
Delay5ms();
Y6; //位選
P0 = w[2];
Y7; //段選
P0 = table[display_buff[number % 10]];
Delay5ms();
}
}
|
評分
-
查看全部評分
|