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

標題: 關于單片機數碼管消隱問題 [打印本頁]

作者: qiuqiubuyao    時間: 2024-9-10 11:12
標題: 關于單片機數碼管消隱問題
應該是關于消隱的內容沒有弄好,第七位數碼管的數字看不到了,各位大佬能幫忙看看到底應該怎么改代碼才能得到穩定的顯示呢?

數碼管第七位不顯示


單片機源程序如下:
  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. }
復制代碼


作者: qiuqiubuyao    時間: 2024-9-10 11:49
我后面發現應該是延時的問題,但是當我把延時增加到10000后,屏幕閃爍,這樣它的頻率在肉眼上就不夠快且看著很難受,各位大佬有沒有其他更加好的辦法呢
作者: xiaobendan001    時間: 2024-9-10 19:11
在delay(10)之后要換下一位顯示之前要先消隱,比如在移位前先把段驅動P0=0;
要么delay(10)要么delay(10000),搞代碼不要這極端。你還可以試試比如delay(100);
又或者使用定時器獲得更好的效果。
作者: 1860774xxxx    時間: 2024-9-10 19:38
數碼管應該用for循環顯示 如:  for(i=0;i<8;i++) {      
作者: 1860774xxxx    時間: 2024-9-10 19:38
數碼管應該用for循環顯示 如:  for(i=0;i<8;i++) {      
作者: donglw    時間: 2024-9-10 21:02
qiuqiubuyao 發表于 2024-9-10 11:49
我后面發現應該是延時的問題,但是當我把延時增加到10000后,屏幕閃爍,這樣它的頻率在肉眼上就不夠快且看 ...

視覺暫留時間,它的長短因人而異,一般在50~200ms。
若數碼管為N位,驅動位選的信號頻率應大于N*50Hz。
作者: hantu    時間: 2024-9-10 23:34
你的數碼管顯示代碼里根本就沒有消影,還有,掃描的間隔/延時太短了
作者: qiuqiubuyao    時間: 2024-9-11 08:13
xiaobendan001 發表于 2024-9-10 19:11
在delay(10)之后要換下一位顯示之前要先消隱,比如在移位前先把段驅動P0=0;
要么delay(10)要么delay(10000 ...

感謝回復,我按照您的修改之后顯示確實好了,之后秒數的時間又延長了,之后在定時器那里修改之后,時間問題也基本沒有了,又或者有沒有更好確定時間精度的辦法呢
作者: qiuqiubuyao    時間: 2024-9-11 08:18
1860774xxxx 發表于 2024-9-10 19:38
數碼管應該用for循環顯示 如:  for(i=0;i

感謝回復,雖然剛開始我也覺得用for會更加好,但是因為我的數據是分時分秒來著的,如果單單用for來表示b【i】的位置的話,代碼長度也沒有辦法變短,反而看起來也不夠直觀,所以就直接這樣顯示了,或者您會有更好的使用方法。
作者: icefree    時間: 2024-9-11 09:51
數碼管的顯示,要遵循先關閉,然后驅動segment,然后驅動com,所有共享segment的管都要先關閉,比如4個數字的,6個數字一起的,全部都先關閉com,最后所有數字配完再開com
作者: xiaobendan001    時間: 2024-9-11 11:46
qiuqiubuyao 發表于 2024-9-11 08:13
感謝回復,我按照您的修改之后顯示確實好了,之后秒數的時間又延長了,之后在定時器那里修改之后,時間問 ...

時間的操作還有用定時器吧,顯示方面還好一些,建議使用專用的顯示芯片
作者: cy009    時間: 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為宜。
作者: npn    時間: 2024-9-11 18:27
是否需要消隱看IO口并行位寬,51單片機為8位并行IO,段碼和位碼做不到并行發送,所以需要消影處理(先關閉前一位再打開下一位),是否顯示正常以實物驗證為準。
用74HC595或273并行鎖存發送、FPGA、16位并行IO的單片機驅動 8位8段數碼管或8*8點陣不需要消影。
作者: 1860774xxxx    時間: 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); 按鍵按下是會卡死 數碼管消滅
作者: 1860774xxxx    時間: 2024-9-11 19:45
1860774xxxx 發表于 2024-9-11 19:19
#include //此文件中定義了單片機的一些特殊功能寄存器



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

作者: xiaobendan001    時間: 2024-9-11 19:49
1860774xxxx 發表于 2024-9-11 19:19
#include //此文件中定義了單片機的一些特殊功能寄存器

P0=wei_num; //發送段碼
P0=wei_num; //發送段碼
作者: 1860774xxxx    時間: 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

作者: xiaobendan001    時間: 2024-9-12 07:22
1860774xxxx 發表于 2024-9-11 22:20
我也不知道為什么 后面的i看不到

可能需要使用代碼功能吧
我發的第二行也有括弧的,實際上是沒有的
作者: xiaobendan001    時間: 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. }
復制代碼

作者: xiaobendan001    時間: 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. }
復制代碼

作者: 老董    時間: 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;
   設置有關系吧
作者: 老董    時間: 2024-9-17 23:27
想請教一下你的stc單片機是怎么加到軟件里的 我的軟件里沒有這個
作者: xiaobendan001    時間: 2024-9-18 07:26
老董 發表于 2024-9-17 23:27
想請教一下你的stc單片機是怎么加到軟件里的 我的軟件里沒有這個

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久久久亚洲影视 | 福利视频在线 | 高清久久久 | av网站网址| 久久久久一区二区三区 | 亚洲黄色天堂 | 国产精品99久久久久久久久久久久 | 日韩精品极品视频在线观看免费 | 亚洲精品一二区 | 国产传媒一区二区 | 99视频网站| 91福利区 | 国产在线小视频 | 国产精品免费在线 | 超碰在线观看免费 | 精品久久一区二区 | 亚洲 欧美 激情 另类 校园 | 亚洲二区视频 | 日韩在线免费观看视频 | 亚洲高清视频在线 | 免费看大片a | 日本中文字幕在线播放 | 亚欧洲精品在线视频免费观看 | 婷婷av在线| 午夜视频在线 | 精品国产区一区二 | 成人影片在线 | 欧美不卡一区 | 中文字幕在线不卡 | 国产一区二区自拍 | 日韩一区不卡 | 在线视频一区二区 | 男人操女人视频网站 | 色综合天天综合网国产成人网 | 色综合一区 | 手机成人在线视频 | 三级黄色片网站 | 中文字幕少妇 | 99热| 国产xxx | 国产黄色在线 |