天天看点

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

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

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

代码:

《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--)

   ;

}

/

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;

    //

    //

  }

/

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;

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;

}

}

}

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;

}

   }

 }

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;

}

}

}

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);  

}

/

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++;

}

}   

}

}

}  

}

/

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--)

   ;

}   

继续阅读