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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13224|回復(fù): 24
打印 上一主題 下一主題
收起左側(cè)

ATmega16計算器代碼(數(shù)碼管顯示)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114509 發(fā)表于 2018-12-20 14:27 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
ATmega16計算器

單片機源程序如下:


  1. /**********************************************************************/

  2.     /**計數(shù)器按鍵**
  3.         
  4.     (1) (2) (3) (4)
  5.         (5) (6) (7) (8)
  6.         (9) (0) (C) (=)
  7.         (+) (-) (*) (/)
  8.         
  9.         10:清零 11:確認 12:加 13:減 14:乘 15:除
  10.         
  11. **********************************************************************/
  12. //頭文件
  13. #include <iom16v.h>   //包含型號頭文件
  14. #include <macros.h>  //包含"位"操作頭文件
  15. //宏定義
  16. #define uchar unsigned char
  17. #define uint unsigned int
  18. //定義按鍵返回值
  19. unsigned char keyvalue;
  20. //定義數(shù)碼管段碼(共陽)
  21. uchar LED[]=
  22. {        
  23.         0xC0,0xF9,0xA4,0xB0,
  24.         0x99,0x92,0x82,0xF8,
  25.         0x80,0x90
  26. };
  27. //定義數(shù)碼管位的控制端
  28. uchar tab[]={0,0,0,0};
  29. //IO端口初始化
  30. void IO_init(void)         
  31. {         
  32.          DDRA = 0XFF;
  33.          DDRB = 0XFF;
  34.          DDRC = 0XFF;
  35.          DDRD = 0XF0;
  36.         PORTA = 0X00;
  37.         PORTB = 0X00;
  38.         PORTC = 0X08;
  39.         //PORTD = 0XFF;
  40. }
  41. //8M晶振下,延時1ms
  42. void delayms(uint z)  
  43. {
  44.          uint x,y;
  45.          for(x=z;x>0;x--)
  46.                   for(y=1333;y>0;y--);
  47. }
  48. //數(shù)碼管顯示
  49. void display(uint num)
  50. {
  51.         tab[0]=num%10;                   //取個位數(shù)
  52.         tab[1]=num/10%10;        //取十位數(shù)
  53.         tab[2]=num/100%10;        //取百位數(shù)
  54.         tab[3]=num/1000%10; //取千位數(shù)
  55.         
  56.         if(num<=9)//檢測為小于等于9的在個位數(shù)顯示
  57.         {
  58.                  PORTA=LED[tab[0]];
  59.                 PORTC=0x08;
  60.                 delayms(1);
  61.         }
  62.         if(num>9&&num<=99)//檢測為大于9與小于等于99在個十位顯示
  63.         {
  64.                  PORTA=LED[tab[0]];
  65.                 PORTC=0x08;
  66.                 delayms(1);
  67.                 PORTA=LED[tab[1]];
  68.                 PORTC=0x04;
  69.                 delayms(1);
  70.         }
  71.         if(num>99&&num<=999)//檢測為大于99與小于等于999在個十百位顯示
  72.         {
  73.                  PORTA=LED[tab[0]];
  74.                 PORTC=0x08;
  75.                 delayms(1);
  76.                 PORTA=LED[tab[1]];
  77.                 PORTC=0x04;
  78.                 delayms(1);
  79.                 PORTA=LED[tab[2]];
  80.                 PORTC=0x02;
  81.                 delayms(1);
  82.         }
  83.         if(num>999&&num<=9999)//檢測為大于999與小于等于9999在個十百千位顯示
  84.         {
  85.                  PORTA=LED[tab[0]];
  86.                 PORTC=0x08;
  87.                 delayms(1);
  88.                 PORTA=LED[tab[1]];
  89.                 PORTC=0x04;
  90.                 delayms(1);
  91.                 PORTA=LED[tab[2]];
  92.                 PORTC=0x02;
  93.                 delayms(1);
  94.                 PORTA=LED[tab[3]];
  95.                 PORTC=0x01;
  96.                 delayms(1);
  97.         }
  98. }
  99. //按鍵掃描
  100. int key_scan(void)
  101. {
  102.          uint j;//按鍵循環(huán)次數(shù)變量定義
  103.         PORTD=0xEF;// PD端口輸出 1111 1110
  104.         for(j=0;j<5;j++)//按鍵檢測4次
  105.         if((PIND&0x0F)!=0x0F)//按鍵檢測
  106.         {
  107.                  delayms(20);//延時消抖
  108.                 if((PIND&0x0F)!=0x0F)//再次檢測
  109.                 {
  110.                          if((PIND&0x01)==0)        //第一個按鍵按下
  111.                         keyvalue=1;                        //返回按鍵值 1
  112.                         if((PIND&0x02)==0)        //第二個按鍵按下
  113.                         keyvalue=2;                        //返回按鍵值 2
  114.                         if((PIND&0x04)==0)        //第三個按鍵按下
  115.                         keyvalue=3;                        //返回按鍵值 3
  116.                         if((PIND&0x08)==0)        //第四個按鍵按下
  117.                         keyvalue=4;                        //返回按鍵值 4
  118.                         while((PIND&0x0F)!=0x0F);//等待按鍵釋放
  119.                 }
  120.         }
  121.         PORTD=0xDF;
  122.         for(j=0;j<5;j++)
  123.         if((PIND&0x0F)!=0x0F)
  124.         {
  125.                  delayms(20);
  126.                 if((PIND&0x0F)!=0x0F)
  127.                 {
  128.                          if((PIND&0x01)==0)
  129.                         keyvalue=5;
  130.                         if((PIND&0x02)==0)
  131.                         keyvalue=6;
  132.                         if((PIND&0x04)==0)
  133.                         keyvalue=7;
  134.                         if((PIND&0x08)==0)
  135.                         keyvalue=8;
  136.                         while((PIND&0x0F)!=0x0F);
  137.                 }
  138.         }
  139.         PORTD=0xBF;
  140.         for(j=0;j<5;j++)
  141.         if((PIND&0x0F)!=0x0F)
  142.         {
  143.                  delayms(20);
  144.                 if((PIND&0x0F)!=0x0F)
  145.                 {
  146.                          if((PIND&0x01)==0)
  147.                         keyvalue=9;
  148.                         if((PIND&0x02)==0)
  149.                         keyvalue=0;
  150.                         if((PIND&0x04)==0)
  151.                         keyvalue=10;
  152.                         if((PIND&0x08)==0)
  153.                         keyvalue=11;
  154.                         while((PIND&0x0F)!=0x0F);
  155.                 }
  156.         }
  157.         PORTD=0x7F;
  158.         for(j=0;j<5;j++)
  159.         if((PIND&0x0F)!=0x0F)
  160.         {
  161.                  delayms(20);
  162.                 if((PIND&0x0F)!=0x0F)
  163.                 {
  164.                          if((PIND&0x01)==0)
  165.                         keyvalue=12;
  166.                         if((PIND&0x02)==0)
  167.                         keyvalue=13;
  168.                         if((PIND&0x04)==0)
  169.                         keyvalue=14;
  170.                         if((PIND&0x08)==0)
  171.                         keyvalue=15;
  172.                         while((PIND&0x0F)!=0x0F);
  173.                 }
  174.         }
  175. }
  176. /*  
  177. //兩種按鍵掃描都可以選擇
  178. //按鍵掃描
  179. uint key_scan(void)
  180. {
  181.           unsigned char X,Y,Z;
  182.         DDRD=0xF0;
  183.         PORTD=0x0F;
  184.         if(PIND!=0x0F) //判斷是否有鍵按下
  185.         {
  186.                  delayms(5); //延時,軟件去干擾
  187.                 if(PIND!=0x0F) //確認按鍵按下
  188.                 {
  189.                          X=PIND|0xF0;
  190.                         delayms(5);
  191.                         DDRD=0x0F;
  192.                         PORTD=0xF0;
  193.                         if(PIND!=0xF0) //判斷是否有鍵按下
  194.                         {
  195.                                  delayms(5); //延時,軟件去干擾
  196.                                 if(PIND!=0xf0) //確認按鍵按下
  197.                                 {
  198.                                          Y=PIND|0x0F;
  199.                                         Z=X&Y; //取出鍵值
  200.                                         switch ( Z ) //判斷鍵值(那一個鍵按下)
  201.                                         {
  202.                                                  //對鍵值賦值
  203.                                                 case 0b11101110: keyvalue= 1; break;//數(shù)字1鍵
  204.                                                 case 0b11101101: keyvalue= 2; break;//數(shù)字2鍵
  205.                                                 case 0b11101011: keyvalue= 3; break;//數(shù)字3鍵
  206.                                                 case 0b11100111: keyvalue= 4; break;//數(shù)字4鍵
  207.                                                 case 0b11011110: keyvalue= 5; break;//數(shù)字5鍵
  208.                                                 case 0b11011101: keyvalue= 6; break;//數(shù)字6鍵
  209.                                                 case 0b11011011: keyvalue= 7; break;//數(shù)字7鍵
  210.                                                 case 0b11010111: keyvalue= 8; break;//數(shù)字8鍵
  211.                                                 case 0b10111110: keyvalue= 9; break;//數(shù)字9鍵
  212.                                                 case 0b10111101: keyvalue= 0; break;//數(shù)字0鍵
  213.                                                 case 0b10111011: keyvalue=10; break;//刪除鍵
  214.                                                 case 0b10110111: keyvalue=11; break;//ok鍵
  215.                                                 case 0b01111110: keyvalue=12; break;//加鍵
  216.                                                 case 0b01111101: keyvalue=13; break;//減鍵
  217.                                                 case 0b01111011: keyvalue=14; break;//乘鍵
  218.                                                 case 0b01110111: keyvalue=15; break;//除鍵
  219.                                                 default:break;
  220.                                         }
  221.                                         while(PIND!=0xf0); //等待按鍵釋放
  222.                                 }
  223.                         }
  224.                 }
  225.         }
  226. }  */

  227. void main(void)
  228. {
  229.          uint num=0;//按鍵值
  230.         uint shu=0,shu1=0,shu2=0,flag=0,jieguo,fuhao;//數(shù)值定義
  231.         IO_init();//IO端口初始化
  232.         while(1)
  233.          {
  234.                   /*鍵盤值賦給num,如果小于9,說明是數(shù)值,假如先按的數(shù)值鍵為2,
  235.                 第一次用到shu1的值為0,則shu1=shu1*10+num(0*10+2=2),
  236.                 如果再按下第二個數(shù)值鍵,假設(shè)按下的數(shù)值鍵為3,
  237.                 則shu1=shu1*10+num(2*10+2=23),這樣就能按下的數(shù)值顯示出來。
  238.                 */
  239.                 keyvalue=20;//按鍵初值
  240.                 key_scan();//按鍵掃描
  241.                 num=keyvalue;//按鍵值賦給num
  242.                 if(num<=9&&flag==0)//按鍵0~9
  243.                 {
  244.                          shu1=shu1*10+num; //計算第一個數(shù)
  245.                         shu=shu1;
  246.                 }
  247.                 /*flag是標(biāo)志位,作用就是第一次按下數(shù)值鍵賦值后,再按下功能鍵后,
  248.                 flag=1,當(dāng)再按下數(shù)值鍵,就運行下面程序。
  249.                 */
  250.                 if(num>=0&&num<=9&&flag==1)//按鍵0~9
  251.                 {
  252.                          shu2=shu2*10+num;//計算第二個數(shù)
  253.                         shu=shu2;
  254.                 }
  255.                 /*使得數(shù)碼管把第二次的數(shù)值shu2顯示出來*/
  256.                 if(num>=12&&num<=15)//按鍵12~15 顯示運算符號
  257.                 {
  258.                          fuhao=num;
  259.                         flag=1;   
  260.                 }
  261.                 /*這程序表示按下功能鍵后,把功能鍵值賦給fuhao這個數(shù),
  262.                 同時把fuaho置1,為下次按下數(shù)值鍵作準(zhǔn)備。
  263.                 */
  264.                 if(num==11)//計算數(shù)值確認
  265.                 {
  266.                          flag=0;
  267.                         switch(fuhao)
  268.                         {
  269.                                  case 12:jieguo=shu1+shu2;break;
  270.                                 case 13:jieguo=shu1-shu2;break;
  271.                                 case 14:jieguo=shu1*shu2;break;
  272.                                 case 15:jieguo=shu1/shu2;break;
  273.                                 default:break;
  274.                         }
  275.                         shu=jieguo;//計算結(jié)果送到shu顯示,把shu1和shu2數(shù)清零。
  276.                         shu1=0;
  277.                         shu2=0;
  278.                 }
  279.                 if(num==10)//計算結(jié)果清零
  280.                 {
  281.                          num=0;
  282.                         jieguo=0;
  283.                         shu=0;   
  284.                         shu1=0;
  285.                         shu2=0;
  286.                         flag=0;
  287.                         fuhao=0;
  288.                 }
  289.                 display(shu);//計算結(jié)果顯示
  290.          }
  291. }
復(fù)制代碼

所有資料51hei提供下載:
ATmega16計算器.zip (36.21 KB, 下載次數(shù): 94)


評分

參與人數(shù) 2黑幣 +51 收起 理由
51單片機1234 + 1 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2018-12-20 15:59 | 只看該作者
能分享原理圖嗎?
回復(fù)

使用道具 舉報

板凳
ID:114509 發(fā)表于 2018-12-21 10:00 | 只看該作者
實物圖和手畫原理圖,供參考。

捕獲.PNG (2.14 MB, 下載次數(shù): 274)

捕獲.PNG

捕獲2.PNG (604.98 KB, 下載次數(shù): 293)

捕獲2.PNG
回復(fù)

使用道具 舉報

地板
ID:229361 發(fā)表于 2018-12-28 16:12 | 只看該作者
原理圖能提供么
回復(fù)

使用道具 舉報

5#
ID:229361 發(fā)表于 2019-3-17 11:42 | 只看該作者
原理圖能提供么
回復(fù)

使用道具 舉報

6#
ID:607710 發(fā)表于 2020-3-5 14:27 | 只看該作者
寫的清楚明了,贊一個。我剛從51轉(zhuǎn)過來的看一遍都明了七七八八!
回復(fù)

使用道具 舉報

7#
ID:703628 發(fā)表于 2020-3-6 16:38 | 只看該作者
老哥給個原理圖唄謝謝了
回復(fù)

使用道具 舉報

8#
ID:721786 發(fā)表于 2020-4-3 16:43 | 只看該作者
好東西,多謝分享
回復(fù)

使用道具 舉報

9#
ID:470504 發(fā)表于 2020-5-14 16:58 | 只看該作者
你好,為什么我用proteus仿真不行咧,連接圖有問題嗎?能幫忙看看嗎?感謝!

Lesson_design圖片_20200514165729.png (85.51 KB, 下載次數(shù): 209)

Lesson_design圖片_20200514165729.png
回復(fù)

使用道具 舉報

10#
ID:470504 發(fā)表于 2020-5-14 17:12 | 只看該作者
你好,我用proteus進行仿真的時候為什么一開始就只顯示8.,而且按鍵不起作用,是我原理圖連接錯了嗎,求教!!!!!

Lesson_design圖片_20200514165729.png (85.51 KB, 下載次數(shù): 211)

Lesson_design圖片_20200514165729.png
回復(fù)

使用道具 舉報

11#
ID:780712 發(fā)表于 2020-6-16 14:51 | 只看該作者
原理圖有嗎?
回復(fù)

使用道具 舉報

12#
ID:784515 發(fā)表于 2020-6-19 20:58 | 只看該作者
原理圖能提供一下嗎
回復(fù)

使用道具 舉報

13#
ID:114509 發(fā)表于 2020-6-20 22:46 | 只看該作者
程序好像有些問題

1.png (29.35 KB, 下載次數(shù): 182)

1.png
回復(fù)

使用道具 舉報

14#
ID:114509 發(fā)表于 2020-6-21 14:52 | 只看該作者
HI-XM 發(fā)表于 2020-6-20 22:46
程序好像有些問題

使用軟件仿真的話數(shù)碼管顯示會顯示不全?實物電路做的沒問題,不知道什么原因?
回復(fù)

使用道具 舉報

15#
ID:114509 發(fā)表于 2020-6-24 10:13 | 只看該作者
if(num<=9)//檢測為小于等于9的在個位數(shù)顯示
        {
                 PORTA=LED[tab[0]];
                PORTC =0x08;
                delayms(2);
                PORTC =0;//這里關(guān)閉數(shù)碼管顯示
        }

數(shù)碼管顯示問題找到了,打開數(shù)碼管顯示后再把它關(guān)閉,問題就解決了。

回復(fù)

使用道具 舉報

16#
ID:795159 發(fā)表于 2020-7-2 16:05 | 只看該作者
樓主,我試了一下,一旦數(shù)碼管顯示到了兩位數(shù),就會顯示不全
回復(fù)

使用道具 舉報

17#
ID:795159 發(fā)表于 2020-7-2 17:10 | 只看該作者
我試了一下,應(yīng)該是延時函數(shù)的問題
回復(fù)

使用道具 舉報

18#
ID:795159 發(fā)表于 2020-7-2 19:52 | 只看該作者
可以把數(shù)碼管顯示函數(shù)里面,選位和選段的語句調(diào)換一下順序
回復(fù)

使用道具 舉報

19#
ID:798940 發(fā)表于 2020-7-9 15:48 | 只看該作者
微塵。。 發(fā)表于 2020-5-14 17:12
你好,我用proteus進行仿真的時候為什么一開始就只顯示8.,而且按鍵不起作用,是我原理圖連接錯了嗎,求教! ...

你好,請問你解決了嗎?
回復(fù)

使用道具 舉報

20#
ID:114509 發(fā)表于 2020-7-18 17:57 | 只看該作者
1132209248 發(fā)表于 2020-7-2 16:05
樓主,我試了一下,一旦數(shù)碼管顯示到了兩位數(shù),就會顯示不全

我仿真了沒問題,我把程序和仿真文件發(fā)給你們。
回復(fù)

使用道具 舉報

21#
ID:208271 發(fā)表于 2020-12-23 22:22 | 只看該作者
HI-XM 發(fā)表于 2020-7-18 17:57
我仿真了沒問題,我把程序和仿真文件發(fā)給你們。

樓主,仿真文件程序可以一起發(fā)一下。真在學(xué)習(xí),改動后數(shù)碼管還有問題,謝謝分享 。
回復(fù)

使用道具 舉報

22#
ID:867997 發(fā)表于 2020-12-25 21:06 | 只看該作者
還是有問題?頭文件那邊以及void函數(shù)都不對    怎么辦大神
回復(fù)

使用道具 舉報

23#
ID:208271 發(fā)表于 2020-12-27 11:32 | 只看該作者

謝謝樓主,加了關(guān)數(shù)碼管語句后,顯示OK。
仿真里數(shù)碼管動態(tài)顯示程序與實物略有不同,靜態(tài)顯示是一樣的,總結(jié)了幾點如下:(做51仿真時遇到過)
1.開數(shù)碼管后關(guān)數(shù)碼管,實物不是這樣,仿真要這樣,目的應(yīng)該是消影。
2.改位選和段選間的延時函數(shù),多試幾個參數(shù)就OK。
3.段選和位選順序調(diào)換,哪個在前都試試,因為有時位在前有效,有時段在前有效。
以上問題,樓主和其它人回復(fù)里有說到,確實是有效的方法,本人也測試過,感謝分享!
仿真里多試試,也不用錢,不用焊,多試就行了!下面為測試OK畫面

51hei截圖20201227113223008.jpg (319.13 KB, 下載次數(shù): 182)

數(shù)碼管4位動態(tài)顯示

數(shù)碼管4位動態(tài)顯示
回復(fù)

使用道具 舉報

24#
ID:871440 發(fā)表于 2020-12-31 12:53 | 只看該作者
運行程序顯示兩個頭文件有錯誤
回復(fù)

使用道具 舉報

25#
ID:942119 發(fā)表于 2021-6-25 08:43 | 只看該作者
本帖最后由 ZYZY110 于 2021-6-25 10:36 編輯

改了無數(shù)次pd0-pd3始終沒反應(yīng) 看了代碼感覺也沒太大問題 個人感覺可能是編譯器不同導(dǎo)致的 請問是用iccavr編譯的嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频 | 国产乱码精品一品二品 | 51ⅴ精品国产91久久久久久 | 日韩精品免费在线观看 | 亚洲免费久久久 | 国产日韩精品一区二区三区 | 成人国内精品久久久久一区 | 一区二区三区在线 | 欧 | 成人免费视频久久 | 中文字幕在线一区 | 日本精品一区二区三区视频 | 91欧美激情一区二区三区成人 | 精品国产乱码久久久久久蜜臀 | 美国黄色毛片 | 亚洲视频一区在线观看 | 国产黄色精品 | 国产精品不卡视频 | 91精品国产综合久久婷婷香蕉 | 日韩不卡三区 | 日韩av在线中文字幕 | 成人亚洲精品 | 天天视频一区二区三区 | 国产亚洲精品久久久久久牛牛 | 91视频进入 | 小h片免费观看久久久久 | 成人免费视频网站在线看 | 亚洲欧美视频 | 国产香蕉视频 | 一区二区国产精品 | 精品视频导航 | www.47久久青青 | 欧美精品导航 | 1区2区视频 | 中文字幕亚洲国产 | 天堂一区 | 狠狠色综合网站久久久久久久 | 国产精品爱久久久久久久 | 九九精品在线 | 亚洲欧美一区二区三区国产精品 | 亚洲激情av | 91久久久久久久久久久久久 |