用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)
|