📄 12864lcd显示.c
字号:
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,2);
LCD_Write_number(d);
LCD_Write_number(e);
}
if(mon==1) //月闪烁标志位
{
if(flag==1)
{
d=read_clock(0x89); //读月
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,4);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(2,4);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x89); //读月
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,4);
LCD_Write_number(d);
LCD_Write_number(e);
}
if(day==1) //日闪烁标志位
{
if(flag==1)
{
d=read_clock(0x87); //读日
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,6);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(2,6);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x87); //读日
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,6);
LCD_Write_number(d);
LCD_Write_number(e);
}
if(weekk==1) //星期闪烁标志位
{
if(flag==1)
{
d=read_clock(0x8b); //读星期
LCD_Write_week(d);
}
else
{
LCD_Write_week(8); //显示空格
}
}
else
{
d=read_clock(0x8b); //读星期
LCD_Write_week(d);
}
}
void Disp2(void) //闹钟界面光标显示
{
if(Kgb==1) //开关闪烁标志位
{
if(flag==1)
{
if(Bell_Swh == 0)//0为关
{
LCD_Write_string(1,6,guan);//显示关
}
else
{
LCD_Write_string(1,6,kai);//显示开
}
}
else
{
LCD_Write_string(1,6,space_c); //显示空格
}
}
else
{
if(Bell_Swh == 0)//关
{
LCD_Write_string(1,6,guan);
}
else
{
LCD_Write_string(1,6,kai);
}
}
if(Hourb==1) //时闪烁标志位
{
if(flag==1)
{
d=read_clock(0xc3); //读闹钟小时的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(3,3);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0xc3); //读闹钟小时的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}
if(flag == 0)
LCD_Write_number(11); //显示:构成闪烁壮
else
LCD_Write_number(10); //显示空格
if(Minb==1) //分钟闪烁标志位
{
if(flag==1)
{
d=read_clock(0xc5); //读闹钟分钟的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0xc5); //读闹钟分钟的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}
}
void id_case1_key(void) //时间界面上下键判别
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_time(id,0); //调用Set_time函数
while(Add_Key ==0);
}
if (Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_time(id,1);
while(Dec_Key ==0);
}
}
void Set_time(unsigned char sel, bit sel_1) //设置时间光标位置
{
signed char address,item;
signed char max,mini;
if(sel==7)
{
address=0x80;
max=0;
mini=0;
} //秒
if(sel==6)
{
address=0x82;
max=59;
mini=0;
} //分钟
if(sel==5)
{
address=0x84;
max=23;
mini=0;
} //小时
if(sel==3)
{
address=0x86;
max=31;
mini=1;
} //日
if(sel==2)
{
address=0x88;
max=12;
mini=1;
} //月
if(sel==1)
{
address=0x8c;
max=99;
mini=0;
} //年
if(sel==4)
{
address=0x8a;
max=7;
mini=1;
} //星期
//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max)
item=mini;
if(item<mini)
item=max;
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}
void id_case2_key(void) //闹钟界面上下键判别
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_Bell(id2,0);//调用Set_time函数
while(Add_Key ==0);
}
if(Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_Bell(id2,1);
while(Dec_Key ==0);
}
}
void Set_Bell(unsigned char sel, bit sel_1) //闹钟闪烁位置设置
{
signed char address,item;
signed char max,mini;
if(sel==4)
{
address=0xc6;
max=59;
mini=0;
} //秒
if(sel==3)
{
address=0xc4;
max=59;
mini=0;
} //分
if(sel==2)
{
address=0xc2;
max=23;
mini=0;
} //时
if(sel==1) //标志位
{
address=0xc8;//for read
if(Add_Key ==0 || Dec_Key ==0)
Bell_Swh=~Bell_Swh;
write_clock(address,Bell_Swh);
} //开关
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max)
item=mini;
if(item<mini)
item=max;
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}
void Timer0_Init(void) //T0初始化
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Timer0(void) interrupt 1 using 1 //TO中断入口,来显示闪烁0.5秒每次
{
static unsigned char timecount = 0;//
TH0=(65535-50000)/256; //50ms定时
TL0=(65535-50000)%256;
timecount++;
if(timecount > 9)//500MS
{
timecount = 0;
flag = ~flag; //闪烁标志位
}
}
void Init_1302(void) //设置1302的初始时间
{
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x05);//年
write_clock(0x8a,0x06);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x12);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
void Lcd_Mark1(void)//在LCD预定的位置上写入汉字
{
Clr_Scr();//清屏
LCD_Write_string(1,1,bt);//标题-电子万年历-
LCD_set_xy(2,1);
LCD_Write_number(2);//2
LCD_Write_number(0);//0
LCD_Write_string(2,3,nian);//显示年月日
LCD_Write_string(2,5,yue);
LCD_Write_string(2,7,ri);
LCD_Write_string(3,0,xq);//星期
LCD_Write_string(4,0,sw);//室温
LCD_Write_string(4,4,ssd);//℃
if(Bell_Swh == 1)//闹钟为开
{
LCD_Write_string(4,6,nzbz);//显示闹钟图标
}
}
void Lcd_Mark2(void) //闹钟界面显示字符
{
Clr_Scr();//清屏
//显示闹钟设定等几个汉字
LCD_Write_string(1,1,nzsd);//
LCD_Write_string(2,3,xsfz);//
}
void Bell(void) //启动蜂鸣器
{
Bell_Out = 0;
Delaynms(150);//150ms
Bell_Out = 1;
Delaynms(50);//50ms
Bell_Out = 0;
Delaynms(250);//250ms
Bell_Out = 1;
Delaynms(400);//400ms
}
void main(void)//主函数
{
Timer0_Init();//定时器T0初始化
Lcd_init();//设置液晶显示器
Clr_Scr();//清屏
Disp_img(logo); //显示LOGO
Delaynms(1000);
Lcd_init();//从图形显示状态下返回
Bell_Swh = read_clock(0xc9);//读取开关的状态
Lcd_Mark1( );
while(1)//主循环
{
//设置时钟的初始值,显示05年1月1号12:00:00
if(Add_Key == 0 && Dec_Key == 0)
{
Delay(1000);
if(Add_Key == 0 && Dec_Key == 0)
{
Init_1302();
}
}
if(OK_Key == 0 && Dec_Key ==0 )//进入闹钟设置界面
{
Delaynms(100);
if(OK_Key == 0 && Dec_Key ==0 )
{
Lcd_Mark2();
if(Bell_Swh == 0)
{
LCD_Write_string(1,6,guan);
}//关
else
{
LCD_Write_string(1,6,kai);
}
while(1)
{
if (OK_Key == 0) // 设置和选择项目键
{
Delay(1000);
if(OK_Key == 0)
{
id2++;
if(id2>4)
id2=0;
}
while(OK_Key == 0);//等待键松开
}
switch( id2 )
{
case 0:
Disp2();
break;//正常显示
case 1:
Kgb = 1;
id_case2_key();
Disp2();
break;//开关
case 2:
Kgb= 0;
Hourb=1;
id_case2_key();
Disp2();
break;//
case 3:
Hourb=0;
Minb=1;
id_case2_key();
Disp2();break;
case 4:
Minb=0;
id2=0;
Lcd_Mark1();
goto MF;
break;//返回主界面
default:
break;
}
}//while(1)
}//if
}//if
/*****************************************/
MF: //返回主界面
/*****************************************/
if (OK_Key == 0) // 设置和选择项目键
{
Delay(1000);
if(OK_Key == 0)
{
id++;if(id>7)id=0;
}
while(OK_Key == 0);//等待键松开
}
switch( id )
{
case 0:
sec=0;
Disp();
break;//正常显示
case 1:
year=1;
id_case1_key();
Disp();
break;//年
case 2:
year=0;
mon=1;
id_case1_key();
Disp();
break;//月
case 3:
mon=0;
day=1;
id_case1_key();
Disp();
break; //日
case 4:
day=0;
weekk=1;
id_case1_key();
Disp();
break;//星期
case 5:
weekk=0;
hour=1;
id_case1_key();
Disp();
break; //小时
case 6:
hour=0;
min=1;
id_case1_key();
Disp();
break; //分钟
case 7:
min=0;
sec=1;
id_case1_key();
Disp();
break; //秒
default:
break;
}
if(Bell_Swh == 1)//闹钟为开
{
H_Bell=read_clock(0xc3);//读取闹钟的时
S_Bell=read_clock(0xc5);//读取闹钟的分
H_1302=read_clock(0x85);//读小时
S_1302=read_clock(0x83);//读分钟
if(H_Bell == H_1302)
{
if(S_Bell == S_1302)
{
Clr_Scr();//清屏
LCD_Write_string(2,2,nzsjd);//闹钟显示时间到!
while(S_Bell == S_1302)//判断是否到闹钟设定时间
{
Bell();
S_Bell=read_clock(0x83);//读分钟
if(Add_Key ==0 ||Dec_Key ==0 || OK_Key ==0)
break;//按任意键退出
}
Bell_Swh =0;
Lcd_Mark1();
}//if
}
}//if
}//while
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -