模拟时钟电路的程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//单片机实验模板文件。具有三个基本功能:

// 1、数码管、发光二极管扫描显示

// 2、键盘扫描,返回0---15

// 3、T0中断,产生基本延时2.5ms,并且调用显示函数

// 根据以上功能,该文件为进一步编写实验程序、实际应用程序,提供了基础

#include

#define delay5ms(x) {delay_xms=x*2; while(delay_xms<255);} //用于延时的宏,x的1个数值对应延时5ms。 x<=127。

void display(void);

unsigned char code

ledcode[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};

//共阴极7段数码管显示段码

//unsigned char xdata dis_seg _at_ 0xfeff; //输出数码管段显示码地址

//unsigned char xdata dis_bit _at_ 0xfdff; //输出数码管位控制码地址unsigned char min,sec,hour;

unsigned char bdata dis_buf[7]; //dis_buf[0]为最高位数据(显示在左边),dis_buf[5]为最低位数据;dis_buf[6]为8个发光二极管的数据。

unsigned char data delay_xms; //用于延时

sfr IPH = 0xb7; //定义中断优先级(高2级)寄存器

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

void int_t0(void) interrupt 1 //T0中断函数,fosc按11.0592M计算,定时时间为2.5ms {

TH0=0xf7;

delay_xms--;

display(); //调用显示函数

}

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

void display(void) //数码管显示函数。左边是最高位,从左边开始扫描,函数每执行1次仅扫描1位,每2.5ms扫描一位

{

static unsigned char data i=0, scan=0xfe;

P0=0;

if(i<6)

P0=ledcode[dis_buf[i]];

else

P0=dis_buf[i];

P2=scan;

scan=scan*2+1;

i++;

if(i>6)

scan=0xfe, i=0;

}

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

unsigned char key(void) //有键按下返回0---15,无键按下返回0xff {

unsigned char data i, j, dd, scan, kk=0xff;

P1=0xf0; //查询是否有键按下

dd=P1;

if(dd==0xf0)

return kk;

delay5ms(3); //延时15ms去抖动

P1=0xf0;

dd=P1;

if(dd==0xf0)

return kk;

scan=0xfe; //行扫描码

for(i=0;i<4;i++) //循环做行扫描

{ P1=scan; //使某一行为低扫描

dd=P1; //读P1口的值

dd/=16; //取P1口值的高4位

if(dd!=0xf) //dd!=0xf表明该行有键按下

{ for(j=0;j<4;j++)

{ if(dd%2==0) //dd%2==0表明查询的第j列有键按下{ kk=i*4+j; //计算被按下键的键值

break;

}

dd=dd/2;

}

break;

}

scan=scan*2+1;

}

while(1) //等待按键释放

{ P1=0xf0;

dd=P1;

if(dd==0xf0)

break; //无键按下跳出循环}

delay5ms(3); //延时15ms去抖动

return kk;

}

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

void timer1() interrupt 3

{

static unsigned char count=0;

TL1=0x12;

TH1=0x2c;

count++; //正常计时

if(count>19) // 定时1S 到,以下为时钟的正常走钟逻辑

{

count=0;

sec++;

if(sec>= 60)

{ sec=0;

min++;

if(min>59)

{ min=0; hour++;

if(hour>23)

hour=0;

dis_buf[0]=hour/10; //可以随便修改

dis_buf[1]=hour%10;

}

dis_buf[2]=min/10;

dis_buf[3]= min%10;

}

dis_buf[4]=sec/10;

dis_buf[5]=sec%10;

}

}

相关文档
最新文档