0
程序是实现数字时钟,按第一个按键显示闹钟时间(蜂鸣器响),第二,第三键是时分加一,第四键是时钟,再按第二三键是时分加一,秒钟用led实现,每两秒亮一次。现跪求汇编程序。
#include"reg52.h"
//#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/ //段选和位选都是低电平有效
code unsigned char digseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
// 0 1 2 3 4 5 6 7 8 9
code unsigned char digseg1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
// 0 1 2 3 4 5 6 7 8 9
code unsigned char segsel[]={0xfe,0xfd,0xfb,0xf7};
/*定义并初始化变量*/
uchar dminite=5;
uchar dhour=12;
uchar mstcnt=0;
uchar seconde=0;
uchar minite=0;
uchar hour=12;
uchar n=0;
uchar temp=0x7f;
***it P3_2=P3^2; // 定时显示开调整定义
***it P3_3=P3^3; //minite调整定义
***it P3_4=P3^4; //hour调整定义
***it P3_5=P3^5; //定时显示关调整定义
***it BUZZER=P2^4; //蜂鸣器调整定义
/*函数声明*/
void delay(uchar k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示当前时间子程序
void dishow( ); //显示定时子程序
void keyscan( ); //键盘扫描子程序
void compare( ); //定时时间比对程序
/*****************************/
/*延时子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}
/**************************/
/*时间处理子程序*/
/**************************/
void time_pro( void)
{
if(seconde==60) //秒钟设为60进制
{ seconde=0;
minite++;
if( minite==60) //分钟设为60进制
{ minite=0;
hour++;
if(hour==24) //时钟设为24进制
{hour=0; }
}
}
}
/*******************************/
/*键盘扫描子程序*/
/*******************************/
void keyscan (void)
{
if(P3_2==0)
{ delay(90);
if(P3_2==0)
n=1;
}
if(P3_5==0)
{ delay(90);
if(P3_5==0)
n=0;
}
if(n==0)
{ if(P3_3==0) //按键1分的调整
{
delay(90);
if(P3_3==0)
{
hour++;
if(hour==24)
hour=0;
}
}
if(P3_4==0) //按键1小时的调整
{
delay(90);
if(P3_4==0)
{
minite++;
if(minite==60)
{minite=0;}
} }
}
if(n==1)
{ dishow(); //显示定时时间
if(P3_4==0) //按键1分的调整
{
delay(90);
if(P3_4==0)
{
dminite++;
if(dminite==60)
dminite=0;
}
}
if(P3_3==0) //按键1小时的调整
{
delay(90);
if(P3_3==0)
{
dhour++;
if(dhour==24)
{dhour=0;}
}
}
}
}
/*****************************/
/* 显示时间子程序*/
/*****************************/
void display(void)
{
P2=segsel[0];
P0=digseg[hour/10]; //显示小时的十位
delay(3);
P2=segsel[1];
P0=(digseg1[(hour%10)]); //显示小时的个位
delay(3);
P2=segsel[2];
P0=digseg[minite/10]; //显示分的十位
delay(3);
P2=segsel[3];
P0=digseg[minite%10]; //显示分的个位
delay(3);
}
/*****************************/
/* 显示定时时间子程序*/
/*****************************/
void dishow(void)
{
P2=segsel[0];
P0=digseg[dhour/10]; //显示小时的十位
delay(3);
P2=segsel[1];
P0=(digseg1[(dhour%10)]); //显示小时的个位
delay(3);
P2=segsel[2];
P0=digseg[dminite/10]; //显示分的十位
delay(3);
P2=segsel[3];
P0=digseg[dminite%10]; //显示分的个位
delay(3);
}
/*************************/
/*中断程序*/
/*************************/
void timer0(void) interrupt 1 using 0 //定时器0方式1,5ms中断一次
{
TH0=0xed; //预置计数初值
TL0=0xff;
// TMOD=0x01;
mstcnt++;
if(mstcnt==200)
{ seconde++;
mstcnt=0;
if(seconde%2==1)
{
P1=0;}
else
P1=0xff;
// P1=temp;
// temp=_crol_(temp,1);
}
}
/**************************/
/*定时时间比对程序*/
/**************************/
void compare(void)
{ if(dhour==hour&&minite==dminite)
{
BUZZER=0;
delay(9);
// display( );
// BUZZER=1;
// delay(9000);
// display();
}
}
/**************************/
/*主函数*/
/**************************/
void main(void)
{P1=0xff; //初始化p1口,全设为1
TMOD=0x01; //time0为定时器,方式1,16为计数器
TH0=0xed; //预置计数初值
TL0=0xff;
EA=1;
ET0=1;
TR0=1;
while (1)
{ keyscan( ); //按键扫描
time_pro( ); //时间处理
if(n==0)
{display( ); //显示时间
compare( ); //定时时间比对
}
}
}
|
|