新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 矩陣鍵盤(pán)加電子時(shí)鐘(c51)

矩陣鍵盤(pán)加電子時(shí)鐘(c51)

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201611/315829.htm

//矩陣鍵盤(pán)掃描和可調(diào)的電子時(shí)鐘

//采用翻轉(zhuǎn)識(shí)別法(相對(duì)代碼少一些)處理矩陣鍵盤(pán),

//在按下15號(hào)鍵的時(shí)候處理電子時(shí)鐘,然后可以啟動(dòng)12號(hào)鍵

//用來(lái)調(diào)節(jié)時(shí)間

#include

#define uchar unsigned char //類(lèi)型重定義

#define uint unsigned int

uchar key=0;

uchar count=0;

int second=40,minute=59,hour=23;

int second_shi=0,second_ge=0,minute_shi=0,minute_ge=0,hour_shi=0,hour_ge=0;

uchar flag=0;//定義標(biāo)志位(判斷15號(hào)鍵是不是按下)

uchar movePlace;//調(diào)節(jié)時(shí)鐘時(shí)的定位位置計(jì)數(shù)

//以下是定義6個(gè)數(shù)碼管是否加上小數(shù)點(diǎn)

uchar point0=0;

uchar point1=0;

uchar point2=0x80;

uchar point3=0;

uchar point4=0x80;

uchar point5=0;

//共陰數(shù)碼管編碼如下(0-15)

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

//位選編碼(選中第0-7位數(shù)碼管)

uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

//函數(shù)聲明

void display(uchar Duan_value);//顯示按鍵值函數(shù)

void delay(uchar t);//延時(shí)1ms函數(shù)

void key_scan();//按鍵掃描函數(shù)

void display_time();//顯示電子時(shí)鐘函數(shù)

void init();//寄存器初始化函數(shù)

void main()

{

init();//寄存器初始化

while(1)

{

key_scan();//按鍵掃描

if(flag==1)//15號(hào)鍵按下,處理電子時(shí)鐘

{

if(movePlace==1)

{//按鍵定位到秒值位置,對(duì)應(yīng)的秒值小數(shù)點(diǎn)亮

point0=0x80;

point1=0x80;

point2=0;

point3=0;

point4=0;

point5=0;

}

else if(movePlace==2)

{//按鍵定位到秒值位置,對(duì)應(yīng)的分值小數(shù)點(diǎn)亮

point0=0;

point1=0;

point2=0x80;

point3=0x80;

point4=0;

point5=0;

}

else if(movePlace==3)

{//按鍵定位到秒值位置,對(duì)應(yīng)的小時(shí)小數(shù)點(diǎn)亮

point0=0;

point1=0;

point2=0;

point3=0;

point4=0x80;

point5=0x80;

}

else if(movePlace==0)

{//按鍵定位歸零,關(guān)閉時(shí)鐘顯示,回復(fù)默認(rèn)值

point0=0;//小時(shí)與分中間加小數(shù)點(diǎn),分與秒之間加小數(shù)點(diǎn)

point1=0;

point2=0x80;

point3=0;

point4=0x80;

point5=0;

}

display_time();//顯示時(shí)鐘值

}

else//15號(hào)鍵沒(méi)有按下

{

display(key);//最后一位顯示按鍵值

}

}

}

//定時(shí)器初始化函數(shù)

void init()

{

TMOD=0x01;//設(shè)定定時(shí)器0工作在方式1:16位定時(shí)器

TH0=(65536-50000)/256; //每50ms中斷1次

TL0=(65536-50000)%256;

EA=1;//開(kāi)啟總中斷

ET0=1;//開(kāi)啟定時(shí)器中斷

TR0=1;//開(kāi)啟定時(shí)器

}

//延時(shí)1ms函數(shù)

void delay(uchar t)

{

uchar x,y;

for(x=t;t>0;t--)

for(y=111;y>0;y--);

}

//按鍵數(shù)碼管顯示函數(shù)

void display(uchar value)

{

P2=table[value];

P3=table1[5];//只顯示最后一位

delay(10);

}

//按鍵掃描函數(shù)

void key_scan()

{

uchar m0,m1;

uchar temp;

P1=0xf0;//這樣設(shè)置是為了能使低四位將高四位拉低,釋放時(shí)自動(dòng)拉高高四位

temp=P1;

if(temp!=0xf0)

{

delay(10);//延時(shí),去除抖動(dòng)

if(temp!=0xf0)

{

m0=temp;//獲得按鍵的列號(hào)(對(duì)應(yīng)的就是高4位)

P1=0x0f;

temp=P1;

if(temp!=0x0f)

{

m1=temp;//獲得按鍵的行號(hào)(對(duì)應(yīng)的就是低4位)

temp=m0|m1;//組合成最終的按鍵好

}

switch(temp)

{

case 0xee:key=0;break;//按鍵對(duì)應(yīng)的碼表

case 0xde:key=1;break;

case 0xbe:key=2;break;

case 0x7e:key=3;break;

case 0xed:key=4;break;

case 0xdd:key=5;break;

case 0xbd:key=6;break;

case 0x7d:key=7;break;

case 0xeb:key=8;break;

case 0xdb:key=9;break;

case 0xbb:key=10;break;

case 0x7b:key=11;break;

case 0xe7:key=12;

if(flag==1)//15號(hào)鍵按下后,12號(hào)鍵按下,開(kāi)始設(shè)置時(shí)鐘

{

TR0=0;//設(shè)置時(shí),關(guān)閉定時(shí)器

movePlace++;//對(duì)應(yīng)的位置標(biāo)量+1

if(movePlace==4)//如果按下了4下,表示取消

{

TR0=1;//重新開(kāi)啟定時(shí)器

movePlace=0;

flag=0;//關(guān)閉時(shí)鐘顯示,重新打開(kāi)按鍵顯示

}

}

break;

case 0xd7:key=13;

if(flag==1)//若開(kāi)始設(shè)置時(shí)鐘,13鍵表示向上+1按鍵

{

if(movePlace==1) //秒值設(shè)置

{

second++;

if(second==60)

second=0;

}

else if(movePlace==2) //分值設(shè)置

{

minute++;

if(minute==60)

minute=0;

}

else if(movePlace==3)//小時(shí)設(shè)置

{

hour++;

if(hour==24)

hour=0;

}

}

break;

case 0xb7:key=14;

if(flag==1)//若開(kāi)始設(shè)置時(shí)鐘,14鍵表示向上-1按鍵

{

if(movePlace==1)//秒值設(shè)置

{

second--;

if(second==-1)

second=59;

}

else if(movePlace==2)//分值設(shè)置

{

minute--;

if(minute==-1)

minute=59;

}

else if(movePlace==3)//小時(shí)設(shè)置

{

hour--;

if(hour==-1)

hour=23;

}

}

break;

case 0x77:key=15;

flag=1;//當(dāng)15號(hào)鍵按下去之后,把標(biāo)志位置1,表示顯示時(shí)鐘

break;

}

do{

temp=P1;//消除按起抖動(dòng)

temp&=0X0f;

}while(temp!=0x0f);

}

}

}

//顯示電子時(shí)鐘函數(shù)

void display_time()

{

second_shi=second/10; //分別得到時(shí),分,秒值的個(gè)位,十位

second_ge=second%10;

minute_shi=minute/10;

minute_ge=minute%10;

hour_shi=hour/10;

hour_ge=hour%10;

P3=0xff;//消影處理顯示秒值的個(gè)位

P2=table[second_ge]|point0; //是否顯示小數(shù)點(diǎn)

P3=table1[5];

delay(3);

P3=0xff;//顯示秒值的十位

P2=table[second_shi]|point1;

P3=table1[4];

delay(3);

P3=0xff;//顯示分值的個(gè)位

P2=table[minute_ge]|point2;

P3=table1[3];

delay(3);

P3=0xff;//顯示分值的十位

P2=table[minute_shi]|point3;

P3=table1[2];

delay(3);

P3=0xff;//顯示小時(shí)的個(gè)位

P2=table[hour_ge]|point4;

P3=table1[1];

delay(3);

P3=0xff;//顯示小時(shí)的十位

P2=table[hour_shi]|point5;

P3=table1[0];

delay(3);

}

//定時(shí)器0中斷函數(shù)

void time0() interrupt 1using 0

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==20)

{

count=0;

second++; //定時(shí)1s鐘,秒值加1

if(second==60)

{

second=0;

minute++;//分鐘加1

if(minute==60)

{

minute=0;

hour++;//小時(shí)加1

if(hour==24)

{

hour=0;

}

}

}

}

}



評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉