设计要求:
最多可记录十组数据
可删除其中多组数据
可上下查阅所记录的数据
数据通过lcd1602显示
计时精度到0.01s
由于并没有使用24c02,导致程序去数据较大,仿真可能不行。实际验证通过
程序界面如图:
仿真界面如图:
如果编译出错,将keil按如图参数设置: |
以下为程序代码:
包括两个文件,主程序里面是:
#include<1602.h>
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/*按键定义*/
/*开始键,计数键,停止计数键或者清零键,上下查阅键,删除数据键*/
sbit key_start=P1^0;
sbit key_count=P1^1;
sbit key_stop=P1^2;
sbit key_up=P1^3;
sbit key_down=P1^4;
/*变量定义*/
int count=0;//计数器
uint i,j,state,k=0,countnum,m,delete;
/*设置标志位*/
char flag;
char maxflag;
char clearflag;
char turnflag; //
char upflag; //为1时可以继续上翻
char minflag=0; //为0时可以继续下翻
char downflag;
/*定义数组 */
unsigned char str[] = "time:";
unsigned char str2[]= "num:";
unsigned char str3[]="...press start..";
unsigned char str4[]="....counting....";
unsigned char str5[]=".. press count..";
unsigned char str6[]="press up or down";
unsigned char str7[]="..overcounting..";
int number[10]=0;
int num2[5]=0;
void keyscan();
void init();
void main()
{
InitLcd1602();
init();
/*以下为调试程序段*/
LcdShowStr(0,0,str3);
// LcdShowStr(0,1,str2);
// LcdWriteCom(0x91);
// LcdWriteData('0'+1);
// LcdWriteCom(0x90);
// LcdWriteData('0'+1);
/*以上为调试程序段*/
while(1)
{
//LcdShowStr(0,1,str4); //测试
keyscan();
Lcd1602_Delay1ms(50);
}
}
void init()
{
IT0=0;
EX0=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=0; //开总中断
// key_count=0;
// key_stop=0;
// key_up=0;
// key_down=0;
// key_delete=0;
flag=0; //标志位为0时代表未计时状态,为1时代表为计时状态
i=0;
maxflag=0;//定时标志位,为1时代表定时已满
clearflag=0;//清除标志位
turnflag=0;//为1时可以上下翻页显示
downflag=0;
upflag=1;
}
void keyscan()
{
if((key_start==0)&&(flag==0)) //防抖处理
{
Lcd1602_Delay1ms(10); //防抖处理
if((key_start==0)&&(flag==0))//防抖处理
{
while((!(key_start==0)&&(flag==0)));//防抖处理
InitLcd1602();
EA=1;//检测到开始按键按下后,启动定时器
ET0=1; //计时器0开启
TR0=1; //计时器打开
flag=1;//设置标志位为计时状态
LcdShowStr(0,0,str4);
LcdShowStr(0,1,str5);
}
}
if((key_count==0)&&(flag==1)&&(maxflag==0))
{
Lcd1602_Delay1ms(50);