标题:
LCD12864_DS32231单片机时钟程序在设置时间参数时闪烁
[打印本页]
作者:
zying
时间:
2020-2-27 12:17
标题:
LCD12864_DS32231单片机时钟程序在设置时间参数时闪烁
用STC15F408AS单片机驱动LCD12864的时钟,现在还存在设置时间参数时闪烁问题没有得到解决,希望坛友高手帮忙指导来解决。
单片机源程序如下:
#include<INC\STC15F.H>
#include<intrins.h>
#include <INC\DS3231.h>
#include<DS32231.c>
#include<LCD12864.c>
#include <KEY.c> //按键
#define uint unsigned int
#define uchar unsigned char
uchar K1;
void key_zx() //按键执行程序
{
uchar n1,n2;
uchar A,B,C,D,E,F,G,X;
switch(B1)
{
case 1: //短按键执行程序
if(K1 == 1) //调整 秒
{
A ++;
if(A > 59)
A = 0;
}
if(K1 == 2) //调整 分
{
B ++;
if(B > 59)
B = 0;
}
if(K1 == 3) //调整 时
{
C++;
if(C > 23)
C = 0;
}
if(K1 == 4) //调整 日
{
D ++;
if(D > 31)
D = 1;
}
if(K1 == 5) //调整 月
{
E ++;
if(E > 12)
E = 1;
}
if(K1 == 6) //调整 年
{
F ++;
if(F > 50)
F = 20;
}
if(K1 == 7) //调整 星期
{
G ++;
if(G > 8)
G = 1;
}
B1 = 0;
break;
case 2: //按键长按程序
if(bz2 == 0) //设置时预读日期、时间数据
{
X = read_random(DS3231_SEC);; //秒
A = BCD2HEX(X);
X = read_random(DS3231_MIN); //分
B = BCD2HEX(X);
X = read_random(DS3231_HOUR); //时 24小时制
C = BCD2HEX(X);
X = read_random(DS3231_DATE); //日
D = BCD2HEX(X);
X = read_random(DS3231_MONTH); //月
E = BCD2HEX(X);
X = read_random(DS3231_YEAR); //年
F = BCD2HEX(X);
G = read_random(DS3231_DAY); //星期;
bz2 = 1;
}
bz3 = 1;
K1 ++; //切换调整项目
B1 = 0;
break;
}
switch(K1) //短按键执行程序
{
case 1: //调整 秒
sfm_rst(0x97,0x90,0x8f,0x80); //清除秒位置字符
sfm_rst(0x96,0x90,0x8e,0x80);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(A); //秒闪烁
a1 = 0x96;
a3 = 0x8e;
lcd_disdata(sw);
a1 = 0x97;
a3 = 0x8f;
lcd_disdata(gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 2://调整 分
sfm_rst(0x94,0x90,0x8c,0x80); //清除分位置字符
sfm_rst(0x93,0x90,0x8b,0x80);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(B); //分闪烁
a1 = 0x93;
a3 = 0x8b;
lcd_disdata(sw);
a1 = 0x94;
a3 = 0x8c;
lcd_disdata(gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 3://调整 时
sfm_rst(0x91,0x90,0x89,0x80); //清除时位置字符
sfm_rst(0x90,0x90,0x88,0x80);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(C);//时闪烁
a1 = 0x90;
a3 = 0x88;
lcd_disdata(sw);
a1 = 0x91;
a3 = 0x89;
lcd_disdata(gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 4: //调整 日
lcd_addr(0x85);
lcd_data(0xa1);
lcd_data(0xa0);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(D);//日闪烁
lcd_addr(0x85);
lcd_data(0x30+sw);
lcd_data(0x30+gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 5: //调整 月
lcd_addr(0x83);
lcd_data(0xa1);
lcd_data(0xa0);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(E);//月闪烁
lcd_addr(0x83);
lcd_data(0x30 + sw);
lcd_data(0x30 + gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 6: //调整 年
lcd_addr(0x81);
lcd_data(0xa1);
lcd_data(0xa0);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(F);//年闪烁
lcd_addr(0x81);
lcd_data(0x30 + sw);
lcd_data(0x30 + gw);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 7: //调整 星期
lcd_addr(0x9a);
lcd_data(0xa1);
lcd_data(0xa0);
for(n1 = 0;n1 < 250;n1 ++)
{
delay(1);
}
datafl(G);
week_disp(G);
for(n2 = 0;n2 < 250;n2 ++)
{
delay(1);
}
break;
case 8:
K1 = 0; //退出设置状态
bz2 = 0;
bz3 = 0;
SetTime(F,E,D,C,B,A,G); //修改年月日时分秒星期
break;
}
}
void main(void)//
{
TMOD |= 0x01;
ET0 = 1;
TR0 = 1;
TL0 = 0xAE; //
TH0 = 0xFB; //
EA = 1; //开总中断
lcd_init(); //
lcd_clear(); //
lcd_disp(0x92,0x90,0x8a,0x80,tabm);//
lcd_disp(0x95,0x90,0x8d,0x80,tabm);//
nyrhz();//固定年月日周汉字显示
while(1)//
{
if(bz3 == 0)
{
Readtime();
ReadDate();
ReadDtemp();
}
key_zx();
}
}
void tinme0() interrupt 1
{
TL0 = 0xAE; //
TH0 = 0xFB; //
key_sm1();//按键处理
}
复制代码
所有资料51hei提供下载:
LCD12864_DS32231时钟程序.rar
(88.23 KB, 下载次数: 13)
2020-2-27 12:16 上传
点击文件名下载附件
作者:
man1234567
时间:
2020-2-27 13:36
在设置时间时,被修改的对象反显,是这个意思 ?
如果是,将新建个反显汉字的函数,或将现有字库求反使用。
如果正反显来闪烁可用中断来实现,心痛闪存容量的同时感觉在脱放
作者:
zying
时间:
2020-2-27 16:53
设置时间参数时闪烁的问题已解决了,增加闪烁延时。
作者:
zying
时间:
2020-2-27 16:55
设置时间参数时闪烁问题已解决,增加闪烁延时时间,都改为10倍。
作者:
billy_2005
时间:
2020-2-27 17:11
闪烁代表刷新频率低于人眼的感受了,直接用定时刷新数据就不会闪了
作者:
hantu
时间:
2020-2-28 09:31
你这个闪烁处理的框架不够好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1