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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1992|回復: 22
打印 上一主題 下一主題
收起左側

關于單片機數碼管消隱問題

[復制鏈接]
跳轉到指定樓層
樓主
應該是關于消隱的內容沒有弄好,第七位數碼管的數字看不到了,各位大佬能幫忙看看到底應該怎么改代碼才能得到穩定的顯示呢?

數碼管第七位不顯示


單片機源程序如下:
  1. #include<stc15.h>
  2. #define uChar unsigned char
  3. #define uInt unsigned int
  4. uChar a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰0.1.2.3.4.5.6.7.8.9
  5. uChar b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //不斷進1位
  6. uChar second=46,minute=59,hour=12,year=24,month=9,day=17,count;

  7. sbit Key1 = P2^0; //計時停止
  8. sbit Key2 = P2^1; //調位
  9. sbit Key3 = P2^2; //加一
  10. sbit Key4 = P2^3; //切換  
  11. sbit Buzzer=P5^4;
  12. /*********************延遲函數********************/
  13. void Delay(uInt t)
  14. {
  15. while(t)
  16. {
  17. t--;
  18. }
  19. }
  20. /*********************時分秒顯示函數*******************/
  21. void Dispaly1(uChar second,uChar minute,uChar hour)
  22. {
  23. /*********************第一位數碼管*********************/
  24. P1=b[0];
  25. P0=a[hour/10];
  26. Delay(10);
  27. /*********************第二位數碼管*********************/
  28. P1=b[1];
  29. P0=a[hour%10];
  30. Delay(10);
  31. /*********************第三位數碼管*********************/
  32. P1=b[2];
  33. P0=0x40;
  34. Delay(10);
  35. /*********************第四位數碼管*********************/
  36. P1=b[3];
  37. P0=a[minute/10];
  38. Delay(10);
  39. /*********************第五位數碼管*********************/
  40. P1=b[4];
  41. P0=a[minute%10];
  42. Delay(10);
  43. /*********************第六位數碼管*********************/
  44. P1=b[5];
  45. P0=0x40;
  46. Delay(10);
  47. /*********************第七位數碼管*********************/
  48. P1=b[6];
  49. P0=a[second/10];
  50. Delay(10);
  51. /*********************第八位數碼管*********************/
  52. P1=b[7];
  53. P0=a[second%10];
  54. Delay(10);
  55. }
  56. /*********************年月日顯示函數********************/
  57. void Dispaly2(uChar day,uChar month,uChar year)
  58. {
  59. P1=b[0];
  60. P0=a[day/10];
  61. Delay(10);

  62. P1=b[1];
  63. P0=a[day%10];
  64. Delay(10);

  65. P1=b[2];
  66. P0=0x40;
  67. Delay(10);

  68. P1=b[3];
  69. P0=a[month/10];
  70. Delay(10);

  71. P1=b[4];
  72. P0=a[month%10];
  73. Delay(10);

  74. P1=b[5];
  75. P0=0x40;
  76. Delay(10);

  77. P1=b[6];
  78. P0=a[year/10];
  79. Delay(10);

  80. P1=b[7];
  81. P0=a[year%10];
  82. Delay(10);
  83. }


  84. /*********************時鐘按鍵掃描函數*********************/
  85. void Keyscan1()
  86. {
  87. static uChar i=0,j=0;
  88. if(Key1==0)
  89. {
  90. Delay(10); //消抖
  91. if(Key1==0)
  92. while(!Key1); //等待按鍵彈
  93. i++;
  94. }
  95. /*時鐘暫停功能*/
  96. if(i%2==1)
  97. {
  98. TR0=0;/*如果是奇數次按鍵自然關閉定時器0*/
  99. }
  100. if(i%2==0)
  101. {
  102. TR0=1;/*如果是偶數次按鍵則打開定時器0*/
  103. }
  104. /*時鐘調位和數值加一功能*/
  105. if(Key2==0)
  106. {
  107. Delay(10);
  108. if(Key2==0)
  109. while(!Key2);
  110. j++;
  111. }
  112. if(j%4==1)  //調秒的時間
  113. {
  114. if(Key3==0)
  115. {
  116. Delay(10);
  117. if(Key3==0)
  118. while(!Key3);
  119. second++;
  120. if(second==60)
  121. second=0;
  122. }
  123. }
  124. if(j%4==2)  //調分的時間
  125. {
  126. if(Key3==0)
  127. {
  128. Delay(10);
  129. if(Key3==0)
  130. while(!Key3);
  131. minute++;
  132. if(minute==60)
  133. minute=0;
  134. }
  135. }
  136. if(j%4==3) //調時的時間
  137. {
  138. if(Key3==0)
  139. {
  140. Delay(10);
  141. if(Key3==0)
  142. while(!Key3);
  143. hour++;
  144. if(hour==24)
  145. hour=0;
  146. }
  147. }
  148. }
  149. /*********************日期按鍵掃描函數*********************/
  150. void Keyscan2()
  151. {
  152. static uChar m=0,n=0;
  153. if(Key1==0)
  154. {
  155. Delay(10);
  156. if(Key1==0)
  157. while(!Key3);
  158. m++;
  159. }
  160. if(m%2==1)
  161. {
  162. TR0=0;/*奇數次按鍵則關閉定時器0*/
  163. }

  164. if(m%2==0)
  165. {
  166. TR0=1;/*偶數次按鍵則打開定時器0*/
  167. }
  168. if(Key2==0)
  169. {
  170. Delay(10);
  171. if(Key2==0)
  172. while(!Key2);
  173. n++;
  174. }
  175. /*日期調位和日期加一功能*/
  176. if(n%4==1)
  177. {
  178. if(Key3==0)
  179. {
  180. Delay(10);
  181. if(Key3==0)
  182. while(!Key3);
  183. day++;
  184. if(day==30)
  185. day=0;
  186. }
  187. }
  188. if(n%4==2)
  189. {
  190. if(Key3==0)
  191. {
  192. Delay(10);
  193. if(Key3==0)
  194. while(!Key3);
  195. month++;
  196. if(month==12)
  197. month=0;
  198. }
  199. }
  200. if(n%4==3)
  201. {
  202. if(Key3==0)
  203. {
  204. Delay(10);
  205. if(Key3==0)
  206. while(!Key3);
  207. year++;
  208. if(year==99)
  209. year=0;
  210. }
  211. }
  212. }

  213. /************************************************/
  214. /***************主函數***************************/
  215. /************************************************/
  216. void main()
  217. {                                                
  218. TMOD=0x01;          /*定時器以方式一工作*/
  219. TH0=(65536-10000)/256;
  220. TL0=(65536-10000)%256;/*10ms計時*/
  221. ET0=1;/*允許定時器0中斷*/
  222. EA=1;
  223. TR0=1;/*打開定時器0*/
  224. while(1)
  225. {
  226. static uChar h=0;
  227. /*時鐘和日期切換功能*/
  228. if(Key4==0)
  229. {
  230. Delay(10);
  231. if(Key4==0)
  232. while(!Key4);
  233. h++;
  234. }
  235. if(h%2==0)/*如果按鍵偶數次則顯示時鐘*/
  236. {
  237. Dispaly1(second,minute,hour);
  238. Keyscan1();
  239. }

  240. if(h%2==1)/*如果按鍵奇數次則顯示日期*/
  241. {
  242. Dispaly2(year,month,day);
  243. Keyscan2();
  244. }
  245. }
  246. }

  247. /**********************中斷函數**************************/
  248. void time0_int(void) interrupt 1
  249. {
  250. TH0=(65536-10000)/256;
  251. TL0=(65536-10000)%256;
  252. count++;
  253. if(count==100)
  254. {
  255. count=0;
  256. second++;
  257. if(second==60)
  258. {
  259. second=0;
  260. minute++;
  261. if(minute==60)
  262. {
  263. minute=0;
  264. hour++;
  265. if(hour==24)
  266. {
  267. hour=0;
  268. day++;
  269. if(day==30)
  270. {
  271. day=0;
  272. month++;
  273. if(month==12)
  274. {
  275. month=0;
  276. year++;
  277. if(year==99)
  278. {
  279. year=0;
  280. }
  281. }
  282. }                  
  283. }
  284. }
  285. }
  286. }
  287. /*判斷整點提醒*/
  288. if(second==00&&minute==00)                                                                  
  289. Buzzer=0;
  290. else
  291. Buzzer=1;
  292. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1131511 發表于 2024-9-10 11:49 | 只看該作者
我后面發現應該是延時的問題,但是當我把延時增加到10000后,屏幕閃爍,這樣它的頻率在肉眼上就不夠快且看著很難受,各位大佬有沒有其他更加好的辦法呢
回復

使用道具 舉報

板凳
ID:1109793 發表于 2024-9-10 19:11 | 只看該作者
在delay(10)之后要換下一位顯示之前要先消隱,比如在移位前先把段驅動P0=0;
要么delay(10)要么delay(10000),搞代碼不要這極端。你還可以試試比如delay(100);
又或者使用定時器獲得更好的效果。
回復

使用道具 舉報

地板
ID:468209 發表于 2024-9-10 19:38 來自手機 | 只看該作者
數碼管應該用for循環顯示 如:  for(i=0;i<8;i++) {      
回復

使用道具 舉報

5#
ID:468209 發表于 2024-9-10 19:38 來自手機 | 只看該作者
數碼管應該用for循環顯示 如:  for(i=0;i<8;i++) {      
回復

使用道具 舉報

6#
ID:344848 發表于 2024-9-10 21:02 | 只看該作者
qiuqiubuyao 發表于 2024-9-10 11:49
我后面發現應該是延時的問題,但是當我把延時增加到10000后,屏幕閃爍,這樣它的頻率在肉眼上就不夠快且看 ...

視覺暫留時間,它的長短因人而異,一般在50~200ms。
若數碼管為N位,驅動位選的信號頻率應大于N*50Hz。
回復

使用道具 舉報

7#
ID:462827 發表于 2024-9-10 23:34 | 只看該作者
你的數碼管顯示代碼里根本就沒有消影,還有,掃描的間隔/延時太短了
回復

使用道具 舉報

8#
ID:1131511 發表于 2024-9-11 08:13 | 只看該作者
xiaobendan001 發表于 2024-9-10 19:11
在delay(10)之后要換下一位顯示之前要先消隱,比如在移位前先把段驅動P0=0;
要么delay(10)要么delay(10000 ...

感謝回復,我按照您的修改之后顯示確實好了,之后秒數的時間又延長了,之后在定時器那里修改之后,時間問題也基本沒有了,又或者有沒有更好確定時間精度的辦法呢
回復

使用道具 舉報

9#
ID:1131511 發表于 2024-9-11 08:18 | 只看該作者
1860774xxxx 發表于 2024-9-10 19:38
數碼管應該用for循環顯示 如:  for(i=0;i

感謝回復,雖然剛開始我也覺得用for會更加好,但是因為我的數據是分時分秒來著的,如果單單用for來表示b【i】的位置的話,代碼長度也沒有辦法變短,反而看起來也不夠直觀,所以就直接這樣顯示了,或者您會有更好的使用方法。
回復

使用道具 舉報

10#
ID:1131713 發表于 2024-9-11 09:51 | 只看該作者
數碼管的顯示,要遵循先關閉,然后驅動segment,然后驅動com,所有共享segment的管都要先關閉,比如4個數字的,6個數字一起的,全部都先關閉com,最后所有數字配完再開com
回復

使用道具 舉報

11#
ID:1109793 發表于 2024-9-11 11:46 | 只看該作者
qiuqiubuyao 發表于 2024-9-11 08:13
感謝回復,我按照您的修改之后顯示確實好了,之后秒數的時間又延長了,之后在定時器那里修改之后,時間問 ...

時間的操作還有用定時器吧,顯示方面還好一些,建議使用專用的顯示芯片
回復

使用道具 舉報

12#
ID:619259 發表于 2024-9-11 15:56 | 只看該作者
數碼管動態顯示程序中沒有消隱程序行,在proteus仿真中會出現一些無序的亂碼或意想不到的顯示錯誤。
程序中8個數碼管的程序段最后都要加上消隱,以第一個數碼管為例:
原程序為:
P1=b[0];
P0=a[hour/10];
Delay(10);
加上消隱后程序應為(增加一行):
P1=b[0];
P0=a[hour/10];
Delay(10);
P0=0x00;

另外8個數碼管的總延時時間不要超過20ms,所以每一個數碼管的延時建議選用1ms-2ms為宜。
回復

使用道具 舉報

13#
ID:57657 發表于 2024-9-11 18:27 | 只看該作者
是否需要消隱看IO口并行位寬,51單片機為8位并行IO,段碼和位碼做不到并行發送,所以需要消影處理(先關閉前一位再打開下一位),是否顯示正常以實物驗證為準。
用74HC595或273并行鎖存發送、FPGA、16位并行IO的單片機驅動 8位8段數碼管或8*8點陣不需要消影。
回復

使用道具 舉報

14#
ID:468209 發表于 2024-9-11 19:19 | 只看該作者
qiuqiubuyao 發表于 2024-9-11 08:18
感謝回復,雖然剛開始我也覺得用for會更加好,但是因為我的數據是分時分秒來著的,如果單單用for來表示b ...

#include <STC89C5xRC.H>//此文件中定義了單片機的一些特殊功能寄存器


typedef unsigned char u8;   //無符號字符形數據類型進行聲明定義 定義名稱u8 所占位數8位 范圍0~255
typedef unsigned int u16;   //無符號整形數據類型進行聲明定義 定義名稱u16 所占位數16位 范圍0~65535

u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //數字"0123456789-" 共陰
u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位開始點亮 0x7f  0111 1111 .........
u8 wei_num[8]; //存儲記錄數碼管8個段碼位的值 要發送數字到哪一位的暫存區

u8 shi,fen,miao; //時 分 秒 變量


/*12T 12M晶振 延時函數 Delay_ms(1)時大約1ms*/
void Delay_ms(u16 ms)
{
    u8 t;
    while(ms--)
    {
        for(t = 0; t < 98; t ++);
    }
}

/*主函數*/
void main()
{
        u8 i;
    while(1)
    {
                  /*數碼管顯示處理*/
        wei_num[7]=ma[shi%100/10];  //顯示 時
        wei_num[6]=ma[shi%10];      //
        wei_num[5]=ma[10];          //顯示"-"
        wei_num[4]=ma[fen%100/10];  //顯示 分
        wei_num[3]=ma[fen%10];      //
        wei_num[2]=ma[10];          //顯示"-"
        wei_num[1]=ma[miao%100/10]; //顯示 秒
        wei_num[0]=ma[miao%10];     //
               
                 for(i=0; i<8; i++)
        {
            P0=wei_num; //發送段碼
                        P2=wei;     //位
            Delay_ms(1); //間隔一段時間掃描
            P0=0x00;//消隱
        }
    }
}

難道這樣還不夠明朗嗎 加上定時器加上按鍵就可以了  再說你那按鍵用while(!xx); 按鍵按下是會卡死 數碼管消滅
回復

使用道具 舉報

15#
ID:468209 發表于 2024-9-11 19:45 來自手機 | 只看該作者
1860774xxxx 發表于 2024-9-11 19:19
#include //此文件中定義了單片機的一些特殊功能寄存器



P0=wei_num; //發送段碼
P2=wei;// 位
這里寫漏了
回復

使用道具 舉報

16#
ID:1109793 發表于 2024-9-11 19:49 | 只看該作者
1860774xxxx 發表于 2024-9-11 19:19
#include //此文件中定義了單片機的一些特殊功能寄存器

P0=wei_num; //發送段碼
P0=wei_num; //發送段碼
回復

使用道具 舉報

17#
ID:468209 發表于 2024-9-11 22:20 來自手機 | 只看該作者
xiaobendan001 發表于 2024-9-11 19:49
P0=wei_num; //發送段碼
P0=wei_num; //發送段碼

我也不知道為什么 后面的i看不到

IMG_20240911_221824.jpg (643.84 KB, 下載次數: 11)

IMG_20240911_221824.jpg
回復

使用道具 舉報

18#
ID:1109793 發表于 2024-9-12 07:22 | 只看該作者
1860774xxxx 發表于 2024-9-11 22:20
我也不知道為什么 后面的i看不到

可能需要使用代碼功能吧
我發的第二行也有括弧的,實際上是沒有的
回復

使用道具 舉報

19#
ID:1109793 發表于 2024-9-12 07:35 | 只看該作者
  1. #include <STC89C5xRC.H>//此文件中定義了單片機的一些特殊功能寄存器


  2. typedef unsigned char u8;   //無符號字符形數據類型進行聲明定義 定義名稱u8 所占位數8位 范圍0~255
  3. typedef unsigned int u16;   //無符號整形數據類型進行聲明定義 定義名稱u16 所占位數16位 范圍0~65535

  4. u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //數字"0123456789-" 共陰
  5. u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位開始點亮 0x7f  0111 1111 .........
  6. u8 wei_num[8]; //存儲記錄數碼管8個段碼位的值 要發送數字到哪一位的暫存區

  7. u8 shi,fen,miao; //時 分 秒 變量


  8. /*12T 12M晶振 延時函數 Delay_ms(1)時大約1ms*/
  9. void Delay_ms(u16 ms)
  10. {
  11.     u8 t;
  12.     while(ms--)
  13.     {
  14.         for(t = 0; t < 98; t ++);
  15.     }
  16. }

  17. /*主函數*/
  18. void main()
  19. {
  20.         u8 i;
  21.     while(1)
  22.     {
  23.                   /*數碼管顯示處理*/
  24.         wei_num[7]=ma[shi%100/10];  //顯示 時
  25.         wei_num[6]=ma[shi%10];      //
  26.         wei_num[5]=ma[10];          //顯示"-"
  27.         wei_num[4]=ma[fen%100/10];  //顯示 分
  28.         wei_num[3]=ma[fen%10];      //
  29.         wei_num[2]=ma[10];          //顯示"-"
  30.         wei_num[1]=ma[miao%100/10]; //顯示 秒
  31.         wei_num[0]=ma[miao%10];     //
  32.                
  33.                  for(i=0; i<8; i++)
  34.         {
  35.             P0=wei_num; //發送段碼
  36.                         P2=wei;     //位
  37.             Delay_ms(1); //間隔一段時間掃描
  38.             P0=0x00;//消隱
  39.         }
  40.     }
  41. }
復制代碼
回復

使用道具 舉報

20#
ID:1109793 發表于 2024-9-12 13:05 | 只看該作者

開來就是被系統刪除了
  1. #include <STC89C5xRC.H>//此文件中定義了單片機的一些特殊功能寄存器


  2. typedef unsigned char u8;   //無符號字符形數據類型進行聲明定義 定義名稱u8 所占位數8位 范圍0~255
  3. typedef unsigned int u16;   //無符號整形數據類型進行聲明定義 定義名稱u16 所占位數16位 范圍0~65535

  4. u8 code ma[11]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //數字"0123456789-" 共陰
  5. u8 code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位 第一位開始點亮 0x7f  0111 1111 .........
  6. u8 wei_num[8]; //存儲記錄數碼管8個段碼位的值 要發送數字到哪一位的暫存區

  7. u8 shi,fen,miao; //時 分 秒 變量


  8. /*12T 12M晶振 延時函數 Delay_ms(1)時大約1ms*/
  9. void Delay_ms(u16 ms)
  10. {
  11.     u8 t;
  12.     while(ms--)
  13.     {
  14.         for(t = 0; t < 98; t ++);
  15.     }
  16. }

  17. /*主函數*/
  18. void main()
  19. {
  20.         u8 i;
  21.     while(1)
  22.     {
  23.                   /*數碼管顯示處理*/
  24.         wei_num[7]=ma[shi%100/10];  //顯示 時
  25.         wei_num[6]=ma[shi%10];      //
  26.         wei_num[5]=ma[10];          //顯示"-"
  27.         wei_num[4]=ma[fen%100/10];  //顯示 分
  28.         wei_num[3]=ma[fen%10];      //
  29.         wei_num[2]=ma[10];          //顯示"-"
  30.         wei_num[1]=ma[miao%100/10]; //顯示 秒
  31.         wei_num[0]=ma[miao%10];     //
  32.                
  33.                  for(i=0; i<8; i++)
  34.         {
  35.             P0=wei_num[i]; //發送段碼
  36.                         P2=wei[i];     //位
  37.             Delay_ms(1); //間隔一段時間掃描
  38.             P0=0x00;//消隱
  39.         }
  40.     }
  41. }
復制代碼
回復

使用道具 舉報

21#
ID:849913 發表于 2024-9-15 20:20 | 只看該作者

        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
   設置有關系吧
回復

使用道具 舉報

22#
ID:849913 發表于 2024-9-17 23:27 | 只看該作者
想請教一下你的stc單片機是怎么加到軟件里的 我的軟件里沒有這個
回復

使用道具 舉報

23#
ID:1109793 發表于 2024-9-18 07:26 | 只看該作者
老董 發表于 2024-9-17 23:27
想請教一下你的stc單片機是怎么加到軟件里的 我的軟件里沒有這個

STC的工具軟件里面有個按鍵
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 完全免费在线视频 | 国产在线观看一区 | 国产精品久久精品 | 在线看一区二区三区 | 午夜99 | 免费人成在线观看网站 | 在线小视频 | 精品自拍视频 | 久久精片| 亚洲天堂中文字幕 | 亚洲成人a v| 日韩中文字幕在线视频 | 久久精品国产一区二区电影 | 亚洲国产成人av | 欧美一区二区三区在线观看 | 夜操| 亚洲成人99 | 天天操天天玩 | 精品国产网 | av在线视 | 婷婷去俺也去 | 97视频精品 | 久久激情网 | 国产日韩欧美 | 美女国产一区 | 91精品国产色综合久久 | 久草免费在线视频 | 视频一区二区三区四区五区 | 久久国产精品72免费观看 | 这里只有精品99re | 中文字幕亚洲一区二区va在线 | 奇色影视| 北条麻妃99精品青青久久主播 | 中文字幕在线免费观看 | 国产欧美日韩综合精品一区二区 | 91精品国产综合久久久久久丝袜 | 精品国产乱码久久久久久88av | 欧美日韩一二三区 | 超碰在线亚洲 | 香蕉91| 欧产日产国产精品视频 |