用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 上傳
點擊文件名下載附件
|