搜索
您的当前位置:首页正文

2-2矩阵键盘六段数码管数字时钟程序

来源:尚佳旅游分享网


/***************2*2矩阵键盘六段数码管数字时钟****************/

/***采用六位共阴数码管***/

/**P0接位选,P1段选,P2.3,P2.2矩阵键盘行;P2.1,P2.0接列扫描**/

/**按4键进入设置时间,再按4键退出设置***/

/**********************************************************/

#include

#define CHOOSE 1 //程序段选择,加上则使用138,否则使用IO口作为位选

#define M 10 //数码管位选消影时间控制

#define uint unsigned int

#define uchar unsigned char

uchar code tablewei[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20}; //位选

uchar code tableduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0123456789

uchar hour=0,min=0,sec=0;

uchar KeyNo=0;

uint ti=0;

/*********************/

void kscanf(void);

void display(uchar h,uchar m,uchar s);

void dis_t();

/********************/

void delay_ms(uint x) //10us

{

uchar i;

for(;x>0;x--)

for(i=110;i>0;i--);

}

void timerint(void) //100us //中断初始化

{

TMOD = 0x01;

TH0 = 0x0FF;

TL0 = 0x9C;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void main()

{

timerint();

while(1)

{

P2=0xf3;

TR0=1;

if(P2!=0xf3)

{

kscanf();

if(KeyNo==4)

{

TR0=0;

KeyNo=0;

while(1)

{

kscanf();

switch (KeyNo)

{

case 1: sec++;break;

case 2: min++;break;

case 3: hour++;break;

default:break;

}

if(KeyNo==4) break;

KeyNo=0;

dis_t();

}

KeyNo=0;

}

}

dis_t();

}

}

void timer(void) interrupt 1 //100us {

TH0 = 0x0FF;

TL0 = 0x9C;

ti++;

}

void kscanf(void) //矩阵按键

{

uchar key=0,tem;

定时器中断

if(P2 !=0xf3)

{

P2=0xfc; //高四位输入 列为高电平 行为低电平

delay_ms(2);

tem=0x0f&P2;

if(tem==8) key=0;

if(tem==4) key=2;

P2=0xf3; //列扫描

delay_ms(2);

tem=0x0F&P2;

if(tem==2) key+=1;

if(tem==1) key+=2;

delay_ms(5);

tem=sec;

while(P2!=0xf3)

{

if(key==4)

if((tem+3)}

}

KeyNo=key;

}

void display(uchar h,uchar m,uchar s)

{

P0=tablewei[0];P1=tableduan[s%10];delay_ms(M);

P0=tablewei[1];P1=tableduan[s/10];delay_ms(M);

P0=tablewei[2];P1=tableduan[m%10]|0x80;delay_ms(M);

P0=tablewei[3];P1=tableduan[m/10];delay_ms(M);

P0=tablewei[4];P1=tableduan[h%10]|0x80;delay_ms(M);

P0=tablewei[5];P1=tableduan[h/10];delay_ms(M);

}

void dis_t()

{

if(ti>=10000) //1s

{

ti=0;

sec++;

}

if(sec>=60) //1min

{

sec=0;

min++;

}

if(min>=60) //1hour

{

min=0;

hour++;

}

if(hour>=24) hour=0; display(hour,min,sec);

}

//24hour

因篇幅问题不能全部显示,请点此查看更多更全内容

Top