找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2816|回復(fù): 1
收起左側(cè)

基于51單片機(jī)四位一體數(shù)碼管顯示定時(shí)器控制短按加或減數(shù)值及長(zhǎng)按連加或連減數(shù)值的...

[復(fù)制鏈接]
ID:171036 發(fā)表于 2020-5-20 14:55 | 顯示全部樓層 |閱讀模式
本帖最后由 51黑電子會(huì)員 于 2020-5-26 22:08 編輯
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit add=P3^0;
  5. sbit dec=P3^4;
  6. uchar lingweiflag;//顯示0標(biāo)志位變量
  7. uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管位碼表
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
  9. uint num;
  10. uint count;
  11. uint qian,bai,shi,ge;//定義拆字變量
  12. ///**ms級(jí)延時(shí)子程序**/
  13. //  void delay(uint x)
  14. //{
  15. //   uint i,j;                       
  16. //   for(i=0;i<x;i++)     
  17. //    for(j=0;j<110;j++);
  18. //  }
  19. ///**定時(shí)器ms級(jí)延時(shí)子程序**/
  20. //  void time0_delay(uchar time)//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)函數(shù)。
  21. //{
  22. //   TR0=1;
  23. //   count = 0;//需要定時(shí)器延時(shí)count,先清零,再循環(huán)檢測(cè)是否計(jì)到count,是則退出。
  24. //   while(1)
  25. // {
  26. //    if(count>=time)
  27. //  {     
  28. //     break;
  29. //   }
  30. //  }  
  31. // }
  32. //  void display()
  33. //{
  34. //   qian=num/1000;//取得千位
  35. //   bai=num%1000/100;//取得百位
  36. //   shi=num%100/10;//取得十位數(shù)字
  37. //   ge=num%10;//取得個(gè)位數(shù)字
  38. //
  39. //   P2=0xfe;//數(shù)碼管千位顯示位
  40. //   P1=table[qian];//數(shù)碼管千位數(shù)值顯示
  41. //   delay(2);//延時(shí)
  42. //
  43. //   P2=0xfd;//數(shù)碼管百位顯示位
  44. //   P1=table[bai];//數(shù)碼管百位數(shù)值顯示
  45. //   delay(2);//延時(shí)
  46. //
  47. //   P2=0xfb;//數(shù)碼管十位顯示位
  48. //   P1=table[shi];//數(shù)碼管十位數(shù)值顯示
  49. //   delay(2);//延時(shí)
  50. //
  51. //   P2=0xf7;//數(shù)碼管個(gè)位顯示位
  52. //   P1=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
  53. //   delay(2);//延時(shí)
  54. // }
  55.   void display()//顯示程序
  56. {
  57.    static uchar i;
  58.    P1=0x00;
  59.    P2=0xff;
  60.    switch(i)
  61. {
  62.     case 0:
  63.            P2=weima[i];
  64.            P1=table[num/1000];
  65.            i++;
  66.            break;
  67.     case 1:
  68.            P2=weima[i];
  69.            P1=table[num%1000/100];
  70.            i++;
  71.            break;
  72.     case 2:
  73.            P2=weima[i];
  74.            P1=table[num%100/10];
  75.            i++;
  76.            break;
  77.     case 3:
  78.            P2=weima[i];
  79.            P1=table[num%10];
  80.            i++;
  81.            break;
  82.     default : break;//自定義
  83.    }
  84.    if(i>3)
  85.    i=0;
  86. }
  87.   void keyscan()
  88. {         
  89.    while(!add)//增加鍵短按長(zhǎng)按。為什么只用while(!add)?while(!add)它又表示什么?解釋?zhuān)寒?dāng)你的按鍵一直沒(méi)有釋放,即add=0,那么while(!add)中的!add就為1,表示為真,可以執(zhí)行while(!add)語(yǔ)句所在花括號(hào)內(nèi)的程序。當(dāng)你松開(kāi)按鍵,即add=1,那么 while(!add)中的!add為0,表示為假,不可執(zhí)行while(!add)語(yǔ)句所在花括號(hào)內(nèi)的程序。
  90. {   
  91.     if(count>=100)
  92.   {
  93.      num++;
  94.      count=0;
  95.      lingweiflag=0;
  96.     }
  97.    }
  98.    while(!dec)//減少鍵短按長(zhǎng)按。為什么只用while(!dec)?while(!dec)它又表示什么?解釋?zhuān)寒?dāng)你的按鍵一直沒(méi)有釋放,即dec=0,那么while(!dec)中的!dec就為1,表示為真,可以執(zhí)行while(!dec)語(yǔ)句所在花括號(hào)內(nèi)的程序。當(dāng)你松開(kāi)按鍵,即dec=1,那么 while(!dec)中的!dec為0,表示為假,不可執(zhí)行while(!dec)語(yǔ)句所在花括號(hào)內(nèi)的程序。
  99. {   
  100.     if(lingweiflag==0)
  101.   {
  102.      if(count>=100)
  103.    {
  104.       num--;
  105.       count=0;
  106.       if(num==0)
  107.     {
  108.        num=0;
  109.        lingweiflag=1;
  110.       }
  111.      }
  112.     }
  113.    }
  114. //   if(add==0)//增加長(zhǎng)按
  115. // {         
  116. //    TR0=1;
  117. //    if(count==100)
  118. //  {
  119. //     num++;
  120. //     count=0;
  121. //     lingweiflag=0;
  122. //    }
  123. //   }
  124. //   if(add==0)//增加短按
  125. // {         
  126. //    TR0=1;
  127. //      time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
  128. //    display();
  129. //    if(add==0)
  130. //  {
  131. //       time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
  132. //       while(!add)
  133. //       display();
  134. //     led=0;
  135. //       while(!add);
  136. //       led=1;
  137. //       num++;  
  138. //       count=0;
  139. //       lingweiflag=0;
  140. //    }
  141. //   }
  142. //   else if(dec==0&&lingweiflag==0)//減少長(zhǎng)按
  143. // {
  144. //      TR0=1;
  145. //      if(count==100)
  146. //  {
  147. //       num--;
  148. //       count=0;
  149. //    }
  150. //   }
  151. //   if(dec==0&&lingweiflag==0)//減少短按
  152. // {         
  153. //    TR0=1;
  154. //      time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
  155. //    display();
  156. //    if(dec==0)
  157. //  {
  158. //       time0_delay(20);//注意這里不是普通延時(shí),而是定時(shí)器延時(shí)。
  159. //       while(!dec)
  160. //       display();
  161. //       num--;
  162. //       count=0;
  163. //    }
  164. //   }
  165.    if(num>9999)
  166. {
  167.     num=0;
  168.    }
  169.    if(num==0)
  170. {
  171.     num=0;
  172.     lingweiflag=1;
  173.    }
  174. }
  175.   void Time0_init()
  176. {
  177.    TMOD=0x01;
  178.    TH0=(65536-2000)/256;
  179.    TL0=(65536-2000)%256;
  180.    EA=1;
  181.    ET0=1;
  182.    TR0=1;
  183.   }
  184.   void time0() interrupt 1
  185. {
  186.    TH0=(65536-2000)/256;
  187.    TL0=(65536-2000)%256;
  188.    count++;
  189.    display();
  190. }
  191.   void main()
  192. {
  193.    Time0_init();
  194.    while(1)
  195. {
  196.     keyscan();
  197.    }
  198.   }



  199. //按鍵短按加或減,長(zhǎng)按連加或連減,四位一體數(shù)碼管顯示0~9999。
  200. //#include<reg52.h>
  201. //#define uchar unsigned char
  202. //#define uint unsigned int
  203. //#define key_short 10//宏定義短按20ms
  204. //#define key_long 50//宏定義長(zhǎng)按100ms
  205. //#define key_middle 40//宏定義長(zhǎng)按間隔80ms
  206. //sbit led=P1^4;//啟停指示燈
  207. //sbit addkey=P3^0;//位定義加鍵
  208. //sbit deckey=P3^2;//位定義減鍵
  209. //sbit qiting=P3^4;//位定義啟動(dòng)按鍵端口
  210. //sbit tingzhi=P3^6;//位定義停止按鍵端口
  211. ////uchar i;//數(shù)碼管位數(shù)變量
  212. //uchar flag;//顯示函數(shù)標(biāo)志位變量
  213. //uchar qitingnum;//聲明啟停次數(shù)變量
  214. //uint num;//數(shù)值變量
  215. //uint addcount,deccount;//計(jì)數(shù)變量
  216. //uint qian,bai,shi,ge;//定義拆字變量
  217. ////uchar code weima[]={0xfe,0xfd,0xfb,0xf7};//數(shù)碼管位碼表
  218. //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
  219. ///**ms級(jí)延時(shí)子程序**/
  220. //  void delay(uint x)
  221. //{
  222. //   uint i,j;                       
  223. //   for(i=0;i<x;i++)     
  224. //    for(j=0;j<110;j++);
  225. //  }
  226. //  void display()
  227. //{
  228. //   qian=num/1000;//轉(zhuǎn)速/10000的余數(shù)/1000得到千位
  229. //   bai=num%1000/100;//取得百位
  230. //   shi=num%100/10;//取得十位數(shù)字
  231. //   ge=num%10;//取得個(gè)位數(shù)字
  232. //
  233. //   P2=0xfe;//數(shù)碼管千位顯示位
  234. //   P0=table[qian];//數(shù)碼管千位數(shù)值顯示
  235. //   delay(2);//延時(shí)
  236. //
  237. //   P2=0xfd;//數(shù)碼管百位顯示位
  238. //   P0=table[bai];//數(shù)碼管百位數(shù)值顯示
  239. //   delay(2);//延時(shí)
  240. //
  241. //   P2=0xfb;//數(shù)碼管十位顯示位
  242. //   P0=table[shi];//數(shù)碼管十位數(shù)值顯示
  243. //   delay(2);//延時(shí)
  244. //
  245. //   P2=0xf7;//數(shù)碼管個(gè)位顯示位
  246. //   P0=table[ge];//數(shù)碼管個(gè)位數(shù)值顯示
  247. //   delay(2);//延時(shí)
  248. //}
  249. //  void qidongkeyscan()//啟動(dòng)函數(shù)
  250. //{
  251. //   if(qiting==0)
  252. // {
  253. //    delay(15);
  254. //    if(qiting==0)
  255. //  {
  256. //     qitingnum++;
  257. //     TR0=1;
  258. //     flag=0;
  259. //     while(qiting==1);
  260. //    }
  261. //   }
  262. // }
  263. //  void tingzhikeyscan()//關(guān)掉函數(shù)
  264. //{
  265. //   if(tingzhi==0)
  266. // {
  267. //    delay(15);
  268. //    if(tingzhi==0)
  269. //  {
  270. //     led=1;
  271. //     flag=1;
  272. //     TR0=0;
  273. //     P2=0xff;
  274. //     P0=0x00;
  275. //     qitingnum=0;
  276. //     while(tingzhi==1);
  277. //    }
  278. //   }
  279. // }
  280. //  void keyscan()//設(shè)置函數(shù)
  281. //{
  282. //   if(qitingnum==1)
  283. // {
  284. //    led=0;
  285. //    if(!addkey)
  286. //  {
  287. //     addcount++;
  288. ////   delay(10);
  289. //     if(addcount>=key_long)//增加長(zhǎng)按
  290. //   {
  291. //      if(num<9999)
  292. //      num++;        
  293. //      addcount=key_middle;//為什么存在addcount=key_middle,由于一直按著按鍵,addcount計(jì)數(shù)會(huì)溢出,設(shè)定addcount=key_middle能讓addcount在這個(gè)addcount=key_middle基礎(chǔ)上反復(fù)累積計(jì)數(shù),從而不會(huì)出現(xiàn)計(jì)數(shù)溢出的情況。
  294. //     }
  295. //    }
  296. //     else
  297. //   {
  298. //      if(key_short<addcount&&addcount<key_long)//增加短按,為什么不可以是key_short<addcount<key_long,假若是key_short<addcount<key_long,就相當(dāng)于按鍵還沒(méi)按下,條件已經(jīng)滿足,按鍵再按下去就沒(méi)意義啦。
  299. //    {
  300. //       if(num<9999)
  301. //       num++;        
  302. //      }
  303. //      addcount=0;
  304. //    }
  305. //    if(!deckey)
  306. //  {
  307. //     deccount++;
  308. ////   delay(10);
  309. //     if(deccount>=key_long)//減少長(zhǎng)按
  310. //   {
  311. //      if(num>0)
  312. //      num--;        
  313. //      deccount=key_middle;//為什么存在deccount=key_middle,由于一直按著按鍵,deccount計(jì)數(shù)會(huì)溢出,設(shè)定deccount=key_middle能讓addcount在這個(gè)deccount=key_middle基礎(chǔ)上反復(fù)累積計(jì)數(shù),從而不會(huì)出現(xiàn)計(jì)數(shù)溢出的情況。
  314. //     }
  315. //    }
  316. //     else
  317. //   {
  318. //      if(key_short<deccount&&deccount<key_long)//減少短按,為什么if條件不可以是key_short<deccount<key_long,假若是key_short<deccount<key_long,就相當(dāng)于按鍵還沒(méi)按下,條件已經(jīng)滿足,按鍵再按下去就沒(méi)意義啦。
  319. //    {
  320. //       if(num>0)
  321. //       num--;        
  322. //      }
  323. //      deccount=0;
  324. //    }
  325. //   }
  326. //  }
  327. ////  void display()//顯示程序
  328. ////{
  329. ////// static uchar i;
  330. ////   P0=0x00;
  331. ////   P2=weima[i];
  332. ////   switch(i)
  333. //// {
  334. ////    case 0:
  335. ////           P0=table[num/1000];
  336. ////           break;
  337. ////    case 1:
  338. ////           P0=table[num%1000/100];
  339. ////           break;
  340. ////    case 2:
  341. ////           P0=table[num%100/10];
  342. ////           break;
  343. ////    case 3:
  344. ////           P0=table[num%10];
  345. ////           break;
  346. ////  }
  347. ////   i++;
  348. ////   i%=4;
  349. //// }
  350. //  /**定時(shí)器0初始化子程序**/
  351. //  void Time0_init()
  352. //{
  353. //   TMOD=0X01;//模式選定時(shí)器0、計(jì)數(shù)器1,工作方式選定時(shí)器0定時(shí)模式1、計(jì)數(shù)器1計(jì)數(shù)模式1。
  354. //   TH0=(65536-5000)/256;//定時(shí)器0高8位定時(shí)50毫秒
  355. //   TL0=(65536-5000)%256;//定時(shí)器0低8位定時(shí)50毫秒
  356. //   EA=1;//打開(kāi)總中斷
  357. //   ET0=1;//打開(kāi)定時(shí)器0的中斷
  358. //   TR0=0;//打開(kāi)定時(shí)器0
  359. //  }
  360. //  void Timer0() interrupt 1//定時(shí)器0中斷子程序
  361. //{
  362. //   TH0=(65536-5000)/256;//重裝定時(shí)器0高8位定時(shí)50毫秒
  363. //   TL0=(65536-5000)%256;//重裝定時(shí)器0低8位定時(shí)50毫秒
  364. //   keyscan();//設(shè)置函數(shù)
  365. //   if(flag==0)
  366. //   display();//顯示函數(shù)
  367. //   tingzhikeyscan();//關(guān)掉函數(shù)
  368. //  }
  369. //  void main()//主函數(shù)
  370. //{
  371. //   Time0_init();//定時(shí)器0初始化子程序
  372. //   while(1)
  373. // {
  374. //    qidongkeyscan();//啟動(dòng)函數(shù)
  375. //  }
  376. // }
復(fù)制代碼
圖片101.png

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:293762 發(fā)表于 2020-5-23 08:10 | 顯示全部樓層
好好學(xué)習(xí),感謝分享!
回復(fù)

使用道具 舉報(bào)

ID:171036 發(fā)表于 2020-5-23 12:22 | 顯示全部樓層
本帖最后由 51黑電子會(huì)員 于 2020-5-26 22:10 編輯
守候楓林紅葉時(shí) 發(fā)表于 2020-5-23 08:10
好好學(xué)習(xí),感謝分享!

謝謝 小伙伴
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表