#define uchar unsigned char
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
sbit s0=P2^0; // 暂停开始键
sbit s1=P2^1; //清零键
uchar ge,shi,bai;
uchar time=0;
uchar count;
uchar press0_num=0; //s0按键次数
uchar press1_num=0; //s1按键次数
uchar code table[]=\"liu hui sb\";
void delayus(uchar t) //延时um级
{while(--t);}
void delay(uchar z)
{ while(z--)
{
delayus(245);
delayus(245);
}
}
bit lcd_check_busy() {
//延时函数ms 级
//判忙函数
P0=0xff;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(P0&0x80); //忙返回值是一,不忙是零
}
void lcd_write_com(uchar com) //写命令
{
while(lcd_check_busy());
RS=0;
RW=0;
EN=1;
P0=com;
_nop_();
EN=0;
}
void lcd_write_date(uchar date) {
while(lcd_check_busy());
RS=1;
RW=0;
EN=1;
P0=date;
_nop_();
//写数据
EN=0;
}
void lcd_clear()
{
lcd_write_com(0x01);
delay(5);
}
void LCD_Write_String(uchar x,uchar y,uchar *s) {
if (y==0)
{
lcd_write_com(0x80+x); //表示第一行
}
//液晶写入一个字符串
else
{
lcd_write_com(0xC0+x); //表示第二行
}
while (*s)
{
lcd_write_date( *s); s++;
}
}
void lcd_init() {
lcd_write_com(0x38); //初始化函数
/*显示模式设置*/
delay(5);
lcd_write_com(0x38);
delay(5);
lcd_write_com(0x0c); lcd_write_com(0x06); lcd_write_com(0x01); lcd_write_com(0x80); }
void keyscan()
{
if(!s0) { delay(20);
//设置开显示,不显示光标
//写第一个字符后指针加一
//显示清零,数据指针指零
//显示第一行
//按键按下
//延时
if(!s0) //确定按下
{
while(!s0); //松手有效
press0_num++;
if(press0_num==1) //按一下
{
TR0=0; //d定时器关闭
}
if(press0_num==2) //按两下
{
TR0=1; //定时器开始
press0_num=0; //按键次数清零
}
}
}
if(!s1)
{
delay(20);
if(!s1)
{
while(!s1);
press1_num++;
if(press1_num==1)
{
TR0=0;
time=0; //计时从零开始
}
if(press1_num==2)
{
TR0=1;
press1_num=0;
}
}
}
}
void main()
{
TMOD=0x11; TH0=(66536-47040)/256;
//选择中断方式3
//覆初值
TL0=(66536-47040)%256;
EA=1;
ET0=1;
TR0=1;
lcd_init();
while(1)
{
keyscan();
s0=1;
s1=1;
if(count==20)
{
count=0;
time++;
if(time>100)
time=0;
lcd_clear();
ge=time%10;
shi=time/10%10;
bai=time/100;
lcd_write_com(0x80); //选地址
lcd_write_date(0x30+bai); 个字符后指针加一
//十位地址 lcd——init中有0x06有写第一
lcd_write_date(0x30+shi); //十位地址
lcd_write_date(0x30+ge); //个位地址
LCD_Write_String(1,1,table);
}
}
}
void timer0() interrupt 1
{
TH0=(66536-47040)/256;
TL0=(66536-47040)%256;
count++;
}