delay1ms();
}
/*****************************************************
函数功能:
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;result=0,不忙
***************************************************/
unsignedcharBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;//将E恢复低电平
returnresult;
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/********************************************
函数功能:
转换
******************************************************************************/
voidCovhms()
{
table_1[0]=h/10+0x30;
table_1[1]=h%10+0x30;
table_1[3]=m/10+0x30;
table_1[4]=m%10+0x30;
table_1[6]=s/10+0x30;
table_1[7]=s%10+0x30;
}
/*****************************************************
函数功能:
指定字符显示的实际地址
入口参数:
x
***************************************************/
voidWriteAddress(unsignedcharx)
{
WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:
将数据(字符的标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
Covhms();
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
对LCD的显示模式进行初始化设置
***************************************************/
voidLcdInitiate(void)
{
delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delay(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);//连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delay(5);
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delay(5);
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delay(5);
}
/************************mainfunction***********************************************/
voidmain(void)
{
unsignedchari,j,k=0x00;
LcdInitiate();//调用LCD初始化函数
TMOD=0x01;//使用定时器T0的模式1
TH0=0xD8;//定时器T0的高8位设置初值
TL0=0xF0;//定时器T0的低8位设置初值
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0
count=0;//中断次数初始化为0
s=0;//秒初始化为0
m=0;//分钟初始化为0
h=12;
while(!
k0)//如果是按键k0按下静止
{
WriteAddress(0x10);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);}
LcdInitiate();
}
while(!
k1)//如果是按键k1按下整体闪烁
{
WriteAddress(0x10);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
delay(5000);
delay(5000);
WriteInstruction(0x01);
delay(5000);
delay(5000);
delay(5000);
}
while(!
k2)//如果是按键k2按下单字闪烁
{
for(j=0;j<8;j++)
{
WriteAddress(0x50);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);}
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x50);
for(i=0;i<8;i++)
{
if(i==j)
table_1[j]=0x00;
WriteData(table_1[i]);
};
if(j==2||j==5)
table_1[j]=0x3A;
delay(5000);
delay(5000);
LcdInitiate();
};
};
while(!
k3)//如果是按键k3按下向前向后滚动
{
for(j=0;j<33;j++)
{
WriteAddress(0x00+j);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
LcdInitiate();
}
for(j=31;j>0;j--)
{
WriteAddress(0x00+j);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
LcdInitiate();
};
};
while(!
k4)//如果是按键k4按下单字移动
{
for(j=0;j<8;j++)
{
WriteAddress(0x50);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x10+j);
WriteData(table_1[j]);
WriteAddress(0x50);
for(i=0;i<8;i++)
{
if(i==j)
table_1[j]=0x00;
WriteData(table_1[i]);
};
if(j==2||j==5)
table_1[j]=0x3A;
delay(5000);
delay(5000);
LcdInitiate();
}
};
while(!
k5)//如果是按键k5按下向两边扩张
{
WriteAddress(0x50);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x4c);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x48);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x44);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x40);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
}
while(!
k6)//如果是按键k6按下向中间压缩
{WriteAddress(0x40);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x44);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x48);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x4c);//写地址
for(i=0;i<8;i++)
{
WriteData(table_1[i]);
WriteData(table_1[8]);
};
delay(5000);
delay(5000);
LcdInitiate();
WriteAddress(0x50);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
delay(5000);
LcdInitiate();
}
while(!
k7)//如果是按键k7按下上下移动
{
WriteAddress(0x10);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
LcdInitiate();
WriteAddress(0x50);//写地址
for(i=0;i<8;i++)
{WriteData(table_1[i]);};
delay(5000);
LcdInitiate();
}
while(!
k8)//如果是按键k8按下,组合运动
{
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
WriteAddress(0x10+k);//写地址
WriteData(table_1[i]);
WriteAddress(0x50);
for(j=0;j<8;j++)
{
if(i==j)
table_1[j]=0x00;
WriteData(table_1[j]);
}
if(i==2||i==5)
table_1[i]=0x3A;
delay(5000);
LcdInitiate();
WriteAddress(0x50);
for(j=0;j<8;j++)
{
if(i==j)
table_1[j]=0x00;
WriteData(table_1[j]);
}
if(i==2||i==5)
table_1[i]=0x3A;
delay(5000);
delay(5000);
delay(5000);
}
}
}
}
/*******************************************************
函数功能:
定时器T0的中断服务函数
********************************************************/
voidTime0(void)interrupt1using1//定时器T0的中断编号为1,使用第1组工作寄存器
{
count++;//每产生1次中断,中断累计次数加1
if(count==100)//如果中断次数计满100次
{
count=0;//中断累计次数清0
s++;//秒加1
}
if(s==60)//如果计满60秒
{
s=0;//秒清0
m++;//分钟加1
}
if(m==60)//如果计满60分
{
m=0;//分钟清0
h++;//小时加1
}
if(h==24)//如果计满24小时
{
h=0;//小时清0
}
TH0=0xD8;//定时器T0高8位重新赋初值
TL0=0xF0;//定时器T0低8位重新赋初值
}
/**************************************************************/