按键+串口修改时间(数码管显示)

这个是严格按照老师考试要求实现的,自动化的学弟学妹留着积福啊。。。哈哈

图片什么的统统掠过,资源里可下载。。

代码:

《source.c》

#include"reg52.h"
#include"dis.h"
#define uint   unsigned int
#define uchar  unsigned char  
uint code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9编码
void delay(uint xms); //延时函数,约XMS毫秒
void timer0_init(); //定时器、串口、数码管端口初始化
void display(uint h,uint m,uint s);    //显示函数
void display1(uint year,uint month,uint day); //显示函数
uint keyscan();     //键盘扫描
uint wait=5; //延时时间
/*********************************************************/
//********************相关设置初始化函数******************/
/*********************************************************/
void timer0_init()
{
display_init(); //显示函数初始化
PCON |= 0x80;   //SMOD=1,波特率加倍
TMOD=0x21;   //设置定时器0工作方式为1(0000 0001);串口工作:定时器1工作方式2(0010 0000)  
TH0=(65535-50000)/256; //装定时器初值,定时50ms后发生中断
TL0=(65535-50000)%256;
TH1=0xf3; //定时时间243μs
TL1=0xf3; //波特率4800
TR0=1;   //启动定时器0
TR1=1;   //启动定时器1
ET0=1;   //开定时器0中断
SM0=0; //8位UART波特率可变(T1溢出率/N)方式1
SM1=1;
PS=1; //串口中断高优先级
REN=1; //允许串口接收
EA=1;   //开总中断
ES=1; //开串口中断
}
/*********************************************************/
//*************************延时函数***********************/
/*********************************************************/
void delay(uint xms)
{
   uint i,j;
   for(i=0;i<30;i++)
   for(j=xms;j>0;j--)
   ;
}
/*********************************************************/
//*************************显示函数0**********************/
/*********************************************************/
void display(uint h,uint m,uint s)
{
P0=table[h/10];
P1=0xfe;
delay(wait);
P1=0xff;
P0=table[h%10];
P1=0xfd;
delay(wait);
P1=0xff;
    //
    //
P0=0x40;
P1=0xfb;
delay(wait);
P1=0xff;
    //
    //
P0=table[m/10];
P1=0xf7;
delay(wait);
P1=0xff;
P0=table[m%10];
P1=0xef;
delay(wait);
P1=0xff;
   ///
   ///
P0=0x40;
P1=0xdf;
delay(wait);
P1=0xff;
    //
    //
P0=table[s/10];
P1=0xbf;
delay(wait);
P1=0xff;
P0=table[s%10];
P1=0x7f;
delay(wait);
P1=0xff;
    //
    //
  }


/*********************************************************/
//*************************显示函数1**********************/
/*********************************************************/
void display1(uint year,uint month,uint day)
{
    P0=table[year/1000];
P1=0xfe;
delay(wait);
P1=0xff;


P0=table[year%1000/100];
P1=0xfd;
delay(wait);
P1=0xff;
   
P0=table[year%100/10];
P1=0xfb;
delay(wait);
P1=0xff;
    
P0=table[year%10];
P1=0xf7;
delay(wait);
P1=0xff;
//
    //
P0=table[month/10];
P1=0xef;
delay(wait);
P1=0xff;
  
P0=table[month%10];
P1=0xdf;
delay(wait);
P1=0xff;
    //
    //
P0=table[day/10];
P1=0xbf;
delay(wait);
P1=0xff;


P0=table[day%10];
P1=0x7f;
delay(wait);
P1=0xff;
}


/********************************************************/
//***********************键盘扫描程序********************/
/********************************************************/   
uint  keyscan()    
{
   uint temp,key=250;    //定义变量temp,key;
/*******************************************************************************/
/****************************    第1行置0        *******************************/
/*******************************************************************************/
P2=0xfe; //先置P2.0电位为0;
temp=P2; //P2状态赋予temp;
temp=temp&0xf0; //temp与0xf0做与运算,供下句判断高4位是否有按键被按下;
if(temp!=0xf0)
{
delay(50); //延时约30ms消抖;
temp=P2; //再次读取P2口的值,再作判断,确定并非抖动,而是被按下;
temp=temp&0xf0;
if(temp!=0xf0)
{  
temp=P2;  //重新读取P2口的置赋予temp,判断P2口哪两个口电平为0;
switch(temp)
{
case 0xee:
key=15;break;
case 0xde:
key=14;break;
case 0xbe:
key=13;break;
case 0x7e:
key=12;break;
}

while(temp!=0xf0)   //等待按键释放,若按键没有释放,while条一直成立,程序停于此处;
{
temp=P2;   //不断读取P2口状态赋予temp,以供判断按键是否放开;
temp=0xf0&temp;
}

}
}
/*******************************************************************************/
/****************************    第2行置0        *******************************/
/*******************************************************************************/
P2=0xfd;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{  
temp=P2;  
switch(temp)
{
case 0xed:
key=11;break;
case 0xdd:
key=10;break;
case 0xbd:
key=9;break;
case 0x7d:
key=8;break;
}

while(temp!=0xf0)   
{
temp=P2;   
temp=0xf0&temp;
}

   }
 }
/*******************************************************************************/
/****************************    第3行置0        *******************************/
/*******************************************************************************/
P2=0xfb;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{  
temp=P2;  
switch(temp)
{
case 0xeb:
key=7;break;
case 0xdb:
key=6;break;
case 0xbb:
key=5;break;
case 0x7b:
key=4;break;
}

while(temp!=0xf0)   
{
temp=P2;   
temp=0xf0&temp;
}

}
}
/*******************************************************************************/
/****************************    第4行置0        *******************************/
/*******************************************************************************/
P2=0xf7;
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(50);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{  
temp=P2;  
switch(temp)

{
case 0xe7:
key=3;break;
case 0xd7:
key=2;break;
case 0xb7:
key=1;break;
case 0x77:
key=0;break;
}

while(temp!=0xf0)   
{
temp=P2;   
temp=0xf0&temp;


}
}
    }
  return key;
}

<clock.c>

#include"reg52.h"  //调用官方头文件,包含相关端口定义
#include"source.h"  //调用自制头文件,包含相关功能函数
void  get_uart_deal();  //处理串口接收到的数据
void  getkey_deal();  //记录键盘输入并处理
uint  buf1[6]={0};  //记录时间时分秒
uint  buf2[8]={0};  //记录时间年月日
uchar uart[9]="000000000";  //记录串口接收到的字符串
uint  uart_deal[8]={0};    //存放处理后的串口字符数据
uint  adjust=0,x=10,show=1;  //调整时间标志、记录按键标志、选择显示标志
uint  hx=0,mx=0,sx=0,days=1,months=5,years=2013,t=0;  //时分秒 年月日 进入中断标志次数
uint  num1=0,num2=0;  //键盘接收相关变量
uint  num=0,i=0,temp1,temp2,flag;  //串口修改相关变量  
uchar tab[]="-----我收到了  ";            //串口显示字符
/*********************************************************/
//*************************主函数*************************/
/*********************************************************/
void main()
{

timer0_init();            
while(1)
    {
getkey_deal();
}
}
/*********************************************************/
//**********************串口数据处理**********************/
/*********************************************************/
void  get_uart_deal()
{
if(num==9)
{
ES=0;
for(i=1;i<9;i++)
   {
uart_deal[i]=uart[i]-48;    
}
if(uart[0]==115)     //修改时分秒
 {
  hx=uart_deal[1]*10+uart_deal[2];
if(hx>=24)
  hx=0;
  mx=uart_deal[4]*10+uart_deal[5];
if(mx>=60)
  mx=0;
  sx=uart_deal[7]*10+uart_deal[8];
if(sx>=60)
  sx=0;
 }
if(uart[0]==110)     //修改年月日
  {
  years=uart_deal[1]*1000+uart_deal[2]*100+uart_deal[3]*10+uart_deal[4];
  months=uart_deal[5]*10+uart_deal[6];
if(months>=13)
  months=1;
  days=uart_deal[7]*10+uart_deal[8];
if((years % 400 == 0)||(years % 4 == 0)&&(years % 100 != 0)) //二月29天(闰年)
{
if(months==2)
  {
  if(days>=30)
     days=1;
  }
}
else //二月28天(平年)
{
 if(months==2)
{
if(days>=29)
  days=1;
}
}
if(months==4||months==6||months==9||months==11) //小月份30天
{
if(days>=31)  
  days=1;
}
else //大月份31天
{
if(days>=32)
  days=1;
}  
  }
for(i=0;i<14;i++)
{
SBUF=tab[i];
while(!TI);
TI=0;
}
for(i=0;i<9;i++)
{
SBUF=uart[i];
while(!TI);
TI=0;
}
ES=1;
num=0;
  }
}
/*********************************************************/
//********************按键输入数据处理********************/
/*********************************************************/
void  getkey_deal()     
{  
get_uart_deal();
        x=keyscan();
if(x==10)
{
ET0=0;
adjust++;    //改年月日或时分秒标志位
if(adjust==3)
{
adjust=0;
ET0=1;
}
}
/* /// */
改时分秒标志位//
/* /// */
if(adjust==1)  
{
if(x!=250&&x<10)
{
  buf1[num1]=x;
  num1++;
if(num1==6)
  {
  num1=0;
hx=buf1[0]*10+buf1[1];
if(hx>=24)
hx=0;
mx=buf1[2]*10+buf1[3];
if(mx>=60)
mx=0;
sx=buf1[4]*10+buf1[5];
if(sx>=60)
sx=0;
  }
}

/* /// */
改年月日标志位//
/* /// */    
if(adjust==2)   
{
if(x!=250&&x<10)
{
  buf2[num2]=x;
  num2++;
  if(num2==8)
  {
  num2=0;
years=buf2[0]*1000+buf2[1]*100+buf2[2]*10+buf2[3];
months=buf2[4]*10+buf2[5];  
if(months>=13)
months=1;
days=buf2[6]*10+buf2[7];
if((years % 400 == 0)||(years % 4 == 0)&&(years % 100 != 0)) //二月29天(闰年)
{
if(months==2)
  {
  if(days>=30)
     days=1;
  }
}
else //二月28天(平年)
{
 if(months==2)
{
if(days>=29)
  days=1;
}
}
if(months==4||months==6||months==9||months==11) //小月份30天
{
if(days>=31)  
  days=1;
}
else //大月份31天
{
if(days>=32)
  days=1;
}
}     
}

/* /// */
选择显示函数/
/* /// */
if(x==15)
{
show++;
if(show==3)
show=1;
}
if(show==1)
display(hx,mx,sx);
if(show==2)
display1(years,months,days);  
}


/*********************************************************/
//*************************定时器T0中断服务函数***********/
/*********************************************************/
void  timer0() interrupt 1  
{  
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t++;
if(t==20)
{
t=0;
sx++;
if(sx==60)
{
sx=0;
mx++;
if(mx==60)
{
mx=0;
hx++;
if(hx==24)
{
  hx=0;
days++;
if((years % 400 == 0)||(years % 4 == 0)&&(years % 100 != 0)) //二月29天(闰年)
{
if(months==2)
  {
  if(days>29)
     {
 days=1;
 months++;
 }
  }
}
else //二月28天(平年)
{
 if(months==2)
{
if(days>28)
  { 
  days=1;
  months++;
  }
}   
}
if(months==4||months==6||months==9||months==11) //小月份30天
{
if(days>30)  
  { 
  days=1;
  months++;
  }  
}
else //大月份31天
{
if(days>31)
  { 
  days=1;
  months++;
  }  
}
if(months>12)
{
months=1;
years++;
}
  
}   


}
}
}  
}
    
/*********************************************************/
//*************************定时器T1中断服务函数***********/
/*********************************************************/
void  uart_isr() interrupt 4
{
     if(RI==1)
{
RI=0;
uart[num]=SBUF;
num++;
}
}
<dis.c>

#include"reg52.h" //调用官方头文件,包含相关端口定义
#define  N  7 //宏定义N,基本循环次数
#define  M  50 //宏定义M,延时用
#define  W  10 //宏定义W,基本循环次数
void display_init(); //显示函数初始化
void dis0(); //显示函数0
void dis1(); //显示函数1
void dis2(); //显示函数2
void dis3(); //显示函数3
void dis4(); //显示函数4
void dis5(); //显示函数5
void dis6(); //显示函数6
void dis7(); //显示函数7
void dis8(); //显示函数8
void delayms(int ms); //延时函数ms
char code tabx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //0~9编码
char code table1[]={0x39,0x3f,0xf3,0xee};   //编码
int waits=5,ix=0,jx=0;               //延时时间参数
void display_init()
{
P1=0xff; //初始化数码管显示端口
P0=0x00; //初始化数码管显示端口


for(ix=0;ix<8;ix++)
for(jx=15;jx>0;jx--)
{
dis0();
}


for(ix=0;ix<N;ix++)
for(jx=W;jx>0;jx--)
{
dis1();
}


for(ix=0;ix<N;ix++)
for(jx=W;jx>0;jx--)
{
dis2();
}


for(ix=0;ix<N;ix++)
for(jx=W;jx>0;jx--)
{
dis3();
}


for(ix=0;ix<N-1;ix++)
for(jx=W;jx>0;jx--)
{
dis4();
}


for(ix=0;ix<N-2;ix++)
for(jx=W;jx>0;jx--)
{
dis5();
}


for(ix=0;ix<N-3;ix++)
for(jx=W;jx>0;jx--)
{
dis6();
}


for(ix=0;ix<N-4;ix++)
for(jx=W;jx>0;jx--)
{
dis7();
}

for(ix=0;ix<N;ix++)
for(jx=14;jx>0;jx--)
{
dis8();
}
}
void dis0()
{
P0=table1[0];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=table1[1];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=table1[2];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=table1[3];
P1=0xf7;
delayms(waits);
P1=0xff;
//
    //
  P0=tabx[7];
P1=0xdf;
delayms(waits);
P1=0xff;
    //
    //
P0=tabx[4];
P1=0xbf;
delayms(waits);
P1=0xff;


P0=tabx[8];
P1=0x7f;
delayms(waits);
P1=0xff;


    
}
void dis1()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;
}
void dis2()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
}
void dis3()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
}
void dis4()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=tabx[4];
P1=0xf7;
delayms(waits);
P1=0xff;
}
void dis5()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=tabx[4];
P1=0xf7;
delayms(waits);
P1=0xff;
//
    //
P0=tabx[4];
P1=0xef;
delayms(waits);
P1=0xff;
}
void dis6()
{
P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=tabx[4];
P1=0xf7;
delayms(waits);
P1=0xff;
//
    //
P0=tabx[4];
P1=0xef;
delayms(waits);
P1=0xff;
  
P0=tabx[3];
P1=0xdf;
delayms(waits);
P1=0xff;
}
void dis7()
{
    P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=tabx[4];
P1=0xf7;
delayms(waits);
P1=0xff;
//
    //
P0=tabx[4];
P1=0xef;
delayms(waits);
P1=0xff;
  
P0=tabx[3];
P1=0xdf;
delayms(waits);
P1=0xff;
    //
    //
P0=tabx[0];
P1=0xbf;
delayms(waits);
P1=0xff;



}
void dis8()
{
P0=tabx[1];
P1=0xfe;
delayms(waits);
P1=0xff;


P0=tabx[0];
P1=0xfd;
delayms(waits);
P1=0xff;
   
P0=tabx[0];
P1=0xfb;
delayms(waits);
P1=0xff;
    
P0=tabx[4];
P1=0xf7;
delayms(waits);
P1=0xff;
//
    //
P0=tabx[4];
P1=0xef;
delayms(waits);
P1=0xff;
  
P0=tabx[3];
P1=0xdf;
delayms(waits);
P1=0xff;
    //
    //
P0=tabx[0];
P1=0xbf;
delayms(waits);
P1=0xff;


P0=tabx[7];
P1=0x7f;
delayms(waits);
P1=0xff;
}
void delayms(int ms)
{
   int tx,kx;
   for(tx=ms;tx>0;tx--)
   for(kx=M;kx>0;kx--)
   ;
}   

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值