#include //包含单片机寄存器的头文件 #include //包含随机函数rand()的定义文件 #include //包含_nop_()函数定义的头文件
sbit RS=P2^6; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^5; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚 sbit s1=P1^1; //定义按键--功能键 sbit s2=P1^2; //定义按键--增加键 sbit s3=P1^3; //定义按键--减小键 sbit rd=P1^7;
unsigned char code digit[ ]={\"01234567\定义字符数组显示数字
unsigned char code string[ ]={\"Second Clock\定义字符数组显示提示信息
unsigned char count; //定义变量统计中断累计次数
unsigned char hs,s,m,h,rt=0,re=0; //定义变量储存秒、分钟和小时
unsigned char data1[10],data2[10],data3[10],data4[10]; /***************************************************** 函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() {
unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++)
; }
/***************************************************** 函数功能:延时若干毫秒 入口参数:n
***************************************************/ void delay1(unsigned char n) {
unsigned char i; for(i=0;i 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ unsigned char BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; //将E恢复低电平 return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void WriteInstruction (unsigned char dictate) { 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置高电平
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }
/***************************************************** 函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/ void WriteAddress(unsigned char x) {
WriteInstruction(x|0x80); //显示位置的确定方法规定为\"80H+地址码x\"
}
/***************************************************** 函数功能:将数据(字符的标准ASCII码)写入液晶模块 入口参数:y(为字符常量)
***************************************************/ void WriteData(unsigned char y) {
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置\"0\" P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }
/***************************************************** 函数功能:对LCD的显示模式进行初始化设置 ***************************************************/ void LcdInitiate(void) {
delay1(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay1(5); //延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delay1(5);
WriteInstruction(0x38); //连续三次,确保初始化成功 delay1(5);
WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁
delay1(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移 delay1(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除 delay1(5); }
/******************************************************************************
函数功能:显示小时
******************************************************************************/
void DisplayHour() {
unsigned char i,j;
i=h/10; //取整运算,求得十位数字 j=h%10; //取余运算,求得各位数字
WriteAddress(0x42); //写显示地址,将十位数字显示在第2行第5列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示分钟
******************************************************************************/
void DisplayMinute() {
unsigned char i,j;
i=m/10; //取整运算,求得十位数字 j=m%10; //取余运算,求得各位数字
WriteAddress(0x45); //写显示地址,将十位数字显示在第2行第8列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示秒
***************************************************************
***************/
void DisplaySecond() {
unsigned char i,j;
i=s/10; //取整运算,求得十位数字 j=s%10; //取余运算,求得各位数字
WriteAddress(0x48); //写显示地址,将十位数字显示在第2行第11列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示haomiao
******************************************************************************/
void Displayhaomiao() {
unsigned char i,j;
i=hs/10; //取整运算,求得十位数字 j=hs%10; //取余运算,求得各位数字
WriteAddress(0x4b); //写显示地址,将十位数字显示在第2行第5列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示小时
******************************************************************************/
void DisplayHour1() {
unsigned char i,j;
i=data1[rt]/10; //取整运算,求得十位数字 j=data1[rt]%10; //取余运算,求得各位数字
WriteAddress(0x42); //写显示地址,将十位数字显示在第2行第5列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示分钟
******************************************************************************/
void DisplayMinute1() {
unsigned char i,j;
i=data2[rt]/10; //取整运算,求得十位数字 j=data2[rt]%10; //取余运算,求得各位数字
WriteAddress(0x45); //写显示地址,将十位数字显示在第2行第8列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/**************************************************************
****************
函
数功能:显示秒
******************************************************************************/
void DisplaySecond1() {
unsigned char i,j;
i=data3[rt]/10; //取整运算,求得十位数字 j=data3[rt]%10; //取余运算,求得各位数字
WriteAddress(0x48); //写显示地址,将十位数字显示在第2行第11列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD }
/******************************************************************************
函数功能:显示haomiao
******************************************************************************/
void Displayhaomiao1() {
unsigned char i,j;
i=data4[rt]/10; //取整运算,求得十位数字 j=data4[rt]%10; //取余运算,求得各位数字
WriteAddress(0x4b); //写显示地址,将十位数字显示在第2行第5列
WriteData(digit[i]); //将十位数字的字符常量写入LCD WriteData(digit[j]); //将个位数字的字符常量写入LCD
}
/*********************************************************************
main function
***********************************************************************/
void main(void) {
unsigned char i;
LcdInitiate(); //调用LCD初始化函数
TMOD=0x10; //使用定时器T0的模式1 TH1=0xd8; //定时器T0的高8位设置初值 TL1=0xf0; //定时器T0的低8位设置初值 EA=1; //开总中断
ET1=1; //定时器T1中断允许 TR1=1; //启动定时器T1
count=0; //中断次数初始化为0 s=0; //秒初始化为0 m=0; //分钟初始化为0 h=0; //小时初始化为0
WriteAddress(0x03); //写地址,从第1行第4列开始显示 i=0; //从字符数组的第1个元素开始显示
while(string[i]!='\\0') //只要没有显示到字符串的结束标志'\\0',就继续
{
WriteData(string[i]); //将第i个字符数组元素写入LCD i++; //指向下一个数组元素
}
WriteAddress(0x44); //写地址,将第二个分号显示在第2行第5列
WriteData(':'); //将分号的字符常量写入LCD
WriteAddress(0x47); //写地址,将第二个分号显示在第2行第8列
WriteData(':'); //将分号的字符常量写入LCD
WriteAddress(0x4a); //写地址,将第二个分号显示在第2行第11列
WriteData(':'); //将分号的字符常量写入LCD while(1) //无限循环 { rd=0; if(s1==0) delay1(5); if(s2==0) delay1(5); if(s3==0) delay1(5);
if(s1==0&&rt<10)//确认功能键被按下 {
while(!s1);//释放确认 data1[rt]=h; data2[rt]=m; data3[rt]=s;
data4[rt]=hs; rt++; re++; }
if(rt==10||s2==0||s3==0) {
delay1(5); while(!s2||!s3); m=0; s=0; hs=0; h=0; rt=0; while(1) {
if(s2==0||s3==0) delay1(5);
if(s2==0&&rt<=10)//确认功能键被按下 {
while(!s2);//释放确认
DisplayHour1(); //显示小时 delay1(5); //给硬件一点反应时间 DisplayMinute1(); //显示分钟 delay1(5); //给硬件一点反应时间 DisplaySecond1(); //显示秒 delay1(5); //给硬件一点反应时间 Displayhaomiao1(); delay1(5); rt++;
if(rt==re)rt=0; }
if(s3==0)//确认功能键被按下 {
while(!s3);//释放确认 rt--;
if(rt==-1)rt=re-1;
DisplayHour1(); //显示小时 delay1(5); //给硬件一点反应时间 DisplayMinute1(); //显示分钟 delay1(5); //给硬件一点反应时间 DisplaySecond1(); //显示秒 delay1(5); //给硬件一点反应时间 Displayhaomiao1(); delay1(5); } } }
DisplayHour(); //显示小时 delay1(5); //给硬件一点反应时间 DisplayMinute(); //显示分钟 delay1(5); //给硬件一点反应时间 DisplaySecond(); //显示秒 delay1(5); //给硬件一点反应时间 Displayhaomiao(); delay1(5); }
}
/******************************************************* 函数功能:定时器T0的中断服务函数
********************************************************/ void Time0(void ) interrupt 3 using 1 //定时器T1的中断编号为3,使用第1组工作寄存器
{
count++; //每产生1次中断,中断累计次数加1 hs++;
if(count==100) //如果中断次数计满100次 {
count=0; //中断累计次数清0 hs=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
}
TH1=0xd8; //定时器T0高8位重新赋初值 TL1=0xf0; //定时器T0低8位重新赋初值 }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务