#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delaynop(){_nop_;_nop_;_nop_;_nop_;}
sbit LCD_RS = P2^0; //寄存器选择(RS=0,命令寄存器;RS=1,数据寄存器)
sbit LCD_RW = P2^1; //读写端(RW=1,读;RW=0,写)
sbit LCD_EP = P2^2;
void delay(int ms)
{ //延时子程序
int i;
while(ms--)
{
for(i = 0; i< 120; i++) ;
}
}
/****************查忙函数************************/
bit lcd_bz()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80); //检测P0最高位是否为1
LCD_EP = 0;
return result;//返回查忙结果
}
/****************写命令函数************************/
void lcd_wcmd(uchar cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd; //将8位指令通过P0口传给1602
_nop_();
_nop_(); //用于产生一个脉冲宽度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
/*****设定显示位置***********/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80);
}
/****************写数据函数************************/
void lcd_wdat(uchar dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //将8位数据通过P0口传给1602
_nop_();
_nop_(); //用于产生一个脉冲宽度
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
/*******LCD初始化设定*********/
void lcd_init()
{
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
sbit k1=P1^0;
sbit k2=P1^1;
uchar keycount=0;
uchar code msg1[]={"second watch 0"};
uchar code msg2[]={">>>> "};
uchar code prompts[][16]={
{"::1----> "},
{"::1---->::2" },
{"::1->2::3--> "},
{"::1->2::3-->4 "},
};
uchar time_buffer[]={0,0,0,0};
uchar LCD_display_buffer[]={"00:00:00:00"};
void show_second()
{
uchar i;
lcd_pos(0x45);
for(i=3;i!=0xff;i--)
{
LCD_display_buffer[2*i+1]=time_buffer[i]/10+'0';
LCD_display_buffer[2*i]=time_buffer[i]%10+'0';
lcd_wdat(LCD_display_buffer[2*i+1]);
lcd_wdat(LCD_display_buffer[2*i]);
lcd_wdat(":");
}
}
void time0() interrupt 1 using 0
{
TH0=-10000/256;
TL0=-10000%256;
time_buffer[0]++;
if (time_buffer[0]==100)
{
time_buffer[0]=0;
time_buffer[1]++;
}
if (time_buffer[1]==60)
{
time_buffer[1]=0;
time_buffer[2]++;
}
if (time_buffer[2]==60)
{
time_buffer[2]=0;
time_buffer[3]++;
}
if (time_buffer[3]==24)
{
time_buffer[3]=0;
}
}
void display_string(uchar * str,uchar lineno)
{
uchar k;
lcd_pos(lineno);
for(k=0;k<16;k++)
lcd_wdat(str[k]);
}
void main()
{
uchar i;
IE=0X82;
TMOD=0X01;
TH0=-10000/256;
TL0=-10000%256;
lcd_init();
display_string(msg1,0x00);
display_string(msg2,0x40);
EA=1;
ET0=1;
while(1)
{
if(k1==0)
{
delay(100);
i=++keycount;
switch(i)
{
case1:
case3:TR0=1;
display_string(prompts[i-1],0);
break;
case2:
case4:TR0=0;
display_string(prompts[i-1],0);
break;
default:TR0=0;
break;
}
while(k1==0);
}
else
if(k2==0)
{
TR0=0;
keycount=0;
for(i=0;i<4;i++)
time_buffer[i]=0;
display_string(msg1,0);
delay(100);
while(k2==0);
}
show_second();
}
}
|