久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 4四位數碼管帶時鐘冒號,冒號閃爍問題 [打印本頁]

作者: 玉萌業余發展    時間: 2022-8-10 16:09
標題: 4四位數碼管帶時鐘冒號,冒號閃爍問題


我思考了半天,打出了冒號閃爍代碼,測試發現每分鐘只閃57下。
一開始直接用延時500毫秒循環閃,發現搶了數碼管的動態掃描時間,造成數碼管閃爍。
這里是插入在動態掃描里的,顯示效果都還算理想,只是少了幾次閃爍。
自學的,不怎么會跳延時和keil看單步時間……
想問問黑友盡善的閃爍辦法。

作者: lkc8210    時間: 2022-8-10 17:00
冒號是哪根腳/段位?
假設是W3的dp段

  1. P1=0xFF;w3=1;P1=smgduan[shi%16];
  2. if(ss>=500)
  3. {
  4.         ss==0;
  5.         if(flash)
  6.         {
  7.                 P1 &= 0x7F;
  8.         }
  9.         flash = !flash;
  10. }else{
  11.         ss+=ms*4;
  12. }
  13. delay(ms);w3=0;//....
復制代碼




作者: haiyang201    時間: 2022-8-10 17:06
定時器不是好一點,不占用時間
作者: 天ノ憶    時間: 2022-8-10 17:35
要想準確就用定時器
作者: npn    時間: 2022-8-10 18:00
你要用定時器中斷進行動態掃描和計時。
作者: 188610329    時間: 2022-8-10 18:06
這要具體情況具體分析,不能任死理的。
一般如果時鐘點 是獨立引腳的話,我比較習慣用 DS1307 的 SQW 引腳輸出 1秒 的脈沖 來驅動。
而如果時鐘點 是和其他段是公用引腳,比如,在位2的 小數點。 那么會 利用定時器  每 500ms 翻轉一次 Flag_TimePiont 標志, 在數碼管 動態掃描 顯示  位2 數字的時候:
if(Flag_TimePiont)   Disp[2] |= 0x80;
else Disp[2] &= 0x7f;
這樣的方法。
作者: wulin    時間: 2022-8-10 20:54
這個程序里有關于數碼管閃點的代碼,可以借鑒用于冒號閃爍。
4位數碼管時鐘溫度表仿真.rar (175.43 KB, 下載次數: 28)


作者: 董云交    時間: 2022-8-11 09:08
可以用定時器延伸出來做一個軟定時器,然后置標志位進行準確定時
作者: mengsiu    時間: 2022-8-11 10:35
這種閃爍我會用定時器中斷,不占用系統延時。他在閃爍的話給我的信息就是系統在運行。至于一分鐘閃多少下,是57下還是63下,其實并不是那么重要的了。
作者: man1234567    時間: 2022-8-11 12:05
用個定時器之類的,約500ms滅,然后時鐘變秒時亮就可以。
作者: 玉萌業余發展    時間: 2022-8-11 12:17
lkc8210 發表于 2022-8-10 17:00
冒號是哪根腳/段位?
假設是W3的dp段

感謝黒友回復。。mh
作者: 玉萌業余發展    時間: 2022-8-11 12:18
haiyang201 發表于 2022-8-10 17:06
定時器不是好一點,不占用時間

感謝黒友回復。。自學的技術不是很會
作者: 玉萌業余發展    時間: 2022-8-11 12:18
天ノ憶 發表于 2022-8-10 17:35
要想準確就用定時器

感謝黒友回復。
作者: 玉萌業余發展    時間: 2022-8-11 12:19
npn 發表于 2022-8-10 18:00
你要用定時器中斷進行動態掃描和計時。

感謝黒友回復。。自學的技術,還不是很熟悉
作者: 玉萌業余發展    時間: 2022-8-11 12:20
188610329 發表于 2022-8-10 18:06
這要具體情況具體分析,不能任死理的。
一般如果時鐘點 是獨立引腳的話,我比較習慣用 DS1307 的 SQW 引腳 ...

感謝黒友回復。。那個是SQW引腳
作者: 玉萌業余發展    時間: 2022-8-11 12:20
wulin 發表于 2022-8-10 20:54
這個程序里有關于數碼管閃點的代碼,可以借鑒用于冒號閃爍。

感謝黒友回復。
作者: 玉萌業余發展    時間: 2022-8-11 12:20
董云交 發表于 2022-8-11 09:08
可以用定時器延伸出來做一個軟定時器,然后置標志位進行準確定時

感謝黒友回復。
作者: 玉萌業余發展    時間: 2022-8-11 12:21
mengsiu 發表于 2022-8-11 10:35
這種閃爍我會用定時器中斷,不占用系統延時。他在閃爍的話給我的信息就是系統在運行。至于一分鐘閃多少下, ...

感謝黒友回復。。要精確閃爍哦
作者: 玉萌業余發展    時間: 2022-8-11 12:23
lkc8210 發表于 2022-8-10 17:00
冒號是哪根腳/段位?
假設是W3的dp段

冒號是哪根腳/段位?
假設是W3的dp段

P1=0xFF;w3=1;P1=smgduan[shi%16];
if(ss>=500)
{
        ss==0;
        if(flash)
        {
                P1 &= 0x7F;
        }
        flash = !flash;
}else{
        ss+=ms*4;
}
delay(ms);w3=0;//....



用的是單獨帶冒號的數碼管,不是小數點分出的;其實小數點分出可以節省硬件連接
作者: Y_G_G    時間: 2022-8-11 13:36
Miao在定時器中斷中改變,1秒鐘取反一次
OUT=..........;                   //顯示,冒號不亮
if(Miao)OUT&=.....;//冒號亮燈
如果你不會寫一個一秒鐘的定時器,那.............


作者: 188610329    時間: 2022-8-11 14:54
玉萌業余發展 發表于 2022-8-11 12:20
感謝黒友回復。。那個是SQW引腳

時鐘點是獨立引腳控制的話,建議用ds1307替代ds1302,因為ds1307有sqw引腳,可直接控制時鐘點,給07地址分別寫入0x00,0x80,0x10可控制時鐘點亮,滅,閃。
作者: 玉萌業余發展    時間: 2022-8-11 17:59
wulin 發表于 2022-8-10 20:54
這個程序里有關于數碼管閃點的代碼,可以借鑒用于冒號閃爍。


看,按你的程序修改了單按鍵調時。就是單片機延時得調精準些

作者: 玉萌業余發展    時間: 2022-8-11 18:00
188610329 發表于 2022-8-11 14:54
時鐘點是獨立引腳控制的話,建議用ds1307替代ds1302,因為ds1307有sqw引腳,可直接控制時鐘點,給07地址 ...

好,有錢再買回來研究
作者: 玉萌業余發展    時間: 2022-8-11 18:01
Y_G_G 發表于 2022-8-11 13:36
Miao在定時器中斷中改變,1秒鐘取反一次
OUT=..........;                   //顯示,冒號不亮
if(Miao)OUT&=.....;//冒 ...

修改了一個。本來就學著玩得
作者: Y_G_G    時間: 2022-8-12 07:24
玉萌業余發展 發表于 2022-8-11 17:59
看,按你的程序修改了單按鍵調時。就是單片機延時得調精準些

你這個代碼,寫得讓人耳目一新啊,有黑客帝國風范
作者: 玉萌業余發展    時間: 2022-8-13 10:28
Y_G_G 發表于 2022-8-12 07:24
你這個代碼,寫得讓人耳目一新啊,有黑客帝國風范

其實我什么都不懂
作者: Y_G_G    時間: 2022-8-13 14:50
玉萌業余發展 發表于 2022-8-13 10:28
其實我什么都不懂

話不是這么說的
你多少是會點的
雖說不是一定要像人家科班出身那樣,寫出嚴謹的規范的C語言代碼出來
但至少,一個語句占一行,這一點是要的
因為大家都是這樣的,如果你要貼代碼出來,多少是要考慮一下別人能不能看得明白你的代碼
像你這種代碼,很多時候,過一段時間,只怕是你自己都不知道自己代碼是什么意思了
作者: wulin    時間: 2022-8-14 07:21
玉萌業余發展 發表于 2022-8-11 17:59
看,按你的程序修改了單按鍵調時。就是單片機延時得調精準些

單鍵調時,適用帶冒號時鐘專用數碼管。


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define key_S 3                                        //宏定義短按(約15ms)
  5. #define key_L key_S*40                        //宏定義長按(約600ms)
  6. #define key_I key_S*20                        //宏定義長按連+間隔(約300ms)

  7. sbit K1=P2^4;//連接按鍵
  8. sbit DP=P0^7;//連接冒號

  9. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
  10. uchar displayData[4];//顯示數據緩存
  11. char shi=12,fen=0,sec=0;//時,分,秒
  12. uchar Cnt5ms;//5ms時基
  13. uchar KeySec;//鍵值
  14. uint num=0;//計數
  15. bit flashing=0;//閃爍標志

  16. //定時器初始化程序
  17. void Timer0Init()//5毫秒@12.000MHz
  18. {
  19.         TMOD=0x01;//定時器T0方式1
  20.         TH0=(65536-5000)/256;
  21.         TL0=(65536-5000)%256;
  22.         TF0=0;//中斷請求清0
  23.         TR0=1;//啟動T0
  24. }

  25. void keyscan()
  26. {
  27.         static unsigned int time=0;//計數變量
  28.         if(!K1)//按鍵按下
  29.         {
  30.                 time++;
  31.                 if(time>=key_L)//長按
  32.                 {
  33.                         switch(KeySec)
  34.                         {
  35.                                 case 1: shi++;if(shi>23)shi=0; break;
  36.                                 case 2: fen++;if(fen>59)fen=0; break;
  37.                         }
  38.                         time=key_I;//連+間隔
  39.                         num=1000;//自復位變量賦值(5秒)
  40.                 }
  41.         }
  42.         else                                //松手
  43.         {
  44.                 if(time>key_S && time<key_I)//短按
  45.                 {
  46.                         KeySec++;
  47.                         if(KeySec>2)
  48.                         {
  49.                                 KeySec=0;
  50.                                 Cnt5ms=0;
  51.                                 sec=0;
  52.                         }
  53.                         num=1000;//自復位變量賦值(5秒)
  54.                 }
  55.                 time=0;

  56.         }
  57. }

  58. void display()//顯示
  59. {
  60.         static uchar i=0;
  61.         displayData[0] = tab[shi/10%10];
  62.         displayData[1] = tab[shi%10];
  63.         displayData[2] = tab[fen/10%10];
  64.         displayData[3] = tab[fen%10];

  65.         P2&=0xf0;//消隱
  66.         if(KeySec==0)
  67.                 P0=displayData[i];

  68.         if(KeySec==1)
  69.         {
  70.                 if(flashing && (i==0||i==1) && K1)
  71.                         P0=0xff;//時調整閃爍
  72.                 else P0=displayData[i];
  73.         }

  74.         if(KeySec==2)
  75.         {
  76.                 if(flashing && (i==2||i==3) && K1)
  77.                         P0=0xff;//分調整閃爍
  78.                 else P0=displayData[i];
  79.         }
  80.         P2|=0x01<<i;
  81.         i=++i%4;
  82. }


  83. void main()//主函數
  84. {
  85.         Timer0Init();//初始化定時器
  86.         while(1)
  87.         {
  88.                 if(TF0)//查詢定時器中斷請求位
  89.                 {
  90.                         TF0=0;
  91.                         TH0=(65536-5000)/256;//5ms
  92.                         TL0=(65536-5000)%256;

  93.                         Cnt5ms++;
  94.                         if(KeySec!=0)
  95.                         {
  96.                                 num--;
  97.                                 if(num==0)//按鍵停止操作5秒自動恢復正常顯示
  98.                                 {
  99.                                         KeySec=0;
  100.                                         Cnt5ms=0;
  101.                                         sec=0;
  102.                                 }
  103.                                 if(Cnt5ms%50==0)   //0.25s 快閃
  104.                                         flashing=~flashing;
  105.                         }
  106.                         else if(Cnt5ms%100==0)//0.5s  慢閃
  107.                                         flashing=~flashing;

  108.                         if(Cnt5ms==200)//1s
  109.                         {
  110.                                 Cnt5ms=0;
  111.                                 sec++;
  112.                                 if(sec>=60)
  113.                                 {
  114.                                         sec=0;
  115.                                         fen++;
  116.                                         if(fen>=60)
  117.                                         {
  118.                                                 fen=0;
  119.                                                 shi++;
  120.                                                 if(shi>23)
  121.                                                         shi=0;
  122.                                         }
  123.                                 }
  124.                         }
  125.                         keyscan();                        //按鍵掃描
  126.                         display();                        //數碼管顯示
  127.                         if(KeySec==0)
  128.                                 DP=flashing;        //閃冒號 表示走時
  129.                         else DP=0;
  130.                 }
  131.         }
  132. }
復制代碼
4位數碼管時鐘仿真.rar (125.11 KB, 下載次數: 15)



作者: sheep5618    時間: 2022-8-14 10:14
調整延時時間
作者: 玉萌業余發展    時間: 2022-8-14 13:10
Y_G_G 發表于 2022-8-13 14:50
話不是這么說的
你多少是會點的
雖說不是一定要像人家科班出身那樣,寫出嚴謹的規范的C語言代碼出來

復制修改的,改好的就湊一起了
作者: 玉萌業余發展    時間: 2022-8-14 13:11
wulin 發表于 2022-8-14 07:21
單鍵調時,適用帶冒號時鐘專用數碼管。

下載了,慢慢玩
作者: 玉萌業余發展    時間: 2022-8-14 13:13
sheep5618 發表于 2022-8-14 10:14
調整延時時間

if(sec &1)ss=1;else ss=0;/*1s一翻*/
這個一秒一翻轉還實在,直接關系1302
編譯不了0.5要不然就按秒亮滅了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久狠狠 | 国产一区二区三区久久 | 国产精品国产三级国产aⅴ中文 | av片免费 | 日韩在线小视频 | av大片在线观看 | 日韩免费三级 | 99久久婷婷国产综合精品首页 | 一区二区三区精品视频 | 欧美不卡 | 青青草一区 | 国产自产21区 | 日本成人久久 | 久久精品99| 亚洲国产精品久久久久久 | 国产精品一区二区久久久久 | 久久综合九色综合欧美狠狠 | 艹逼网| 伊人免费视频二 | 亚洲在线一区二区 | 在线观看成人小视频 | 久久中文字幕av | 国产一区电影 | 精品国产一级 | 久久久久亚洲 | 国产精品我不卡 | 亚洲第一视频网站 | 国产毛片在线看 | 天天久久 | 五月天婷婷激情 | 国产精品一区二区三区久久久 | 亚洲一区二区三区久久久 | 亚洲综合一区二区三区 | 国产日韩一区二区三区 | 91色视频在线观看 | 精品一二区 | 一级欧美一级日韩片免费观看 | 天天插天天干 | 亚洲一区二区三区视频免费观看 | 日本在线免费看最新的电影 | 亚洲网在线 |