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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9021|回復: 2
收起左側

51單片機簡單計算器用數碼管顯示

[復制鏈接]
ID:72519 發表于 2015-1-21 22:03 | 顯示全部樓層 |閱讀模式
是用51hei單片機開發板 電路圖詳見:http://www.zg4o1577.cn/f/51hei-5.pdf  的數碼管部分, 用2個74hc573 鎖存,p0口作為數據口 ,p3.6和p3.7分別是段和位的鎖存端口.

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P3^6;//573段選使能
  5. sbit wela=P3^7;//573位選使能
  6. sbit beep=P3^4;//蜂鳴器
  7. uchar temp,key;//按鍵變量
  8. uchar fun;//加,減,乘,除,標志位
  9. long int num1,num2,res;//num1與num2是2個要運算的變量,res是結果
  10. uchar aa,dis;//aa 2個運算數標志位 dis 2個運算數與結果標志
  11. uchar code table[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數碼管段碼
  12. uchar code weixuan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//數碼管位碼

  13. void delay(unsigned char i)//延時
  14. {
  15. uchar j,k;
  16.   for(j=i;j>0;j--)
  17.     for(k=125;k>0;k--);
  18. }

  19. void bee()//蜂鳴器
  20. {
  21. beep=0;        
  22. delay(255);
  23. delay(255);
  24. beep=1;        
  25. }

  26. key_scan()//按鍵檢測
  27. {
  28. P1=0xfe;
  29.    temp=P1;
  30.    temp=temp&0xf0;
  31.    if(temp!=0xf0)
  32.    {
  33.      delay(10);
  34.      if(temp!=0xf0)
  35.      {
  36.        temp=P1;
  37.        switch(temp)
  38.        {
  39.          case 0xee:
  40.               key=0;
  41.               break;
  42.          case 0xde:
  43.               key=1;
  44.               break;
  45.          case 0xbe:
  46.               key=2;
  47.               break;
  48.          case 0x7e:
  49.               key=3;
  50.               break;
  51.         }
  52.         while(temp!=0xf0)
  53.         {
  54.           temp=P1;
  55.           temp=temp&0xf0;
  56.         }
  57.      }
  58.    }
  59.    P1=0xfd;
  60.    temp=P1;
  61.    temp=temp&0xf0;
  62.    if(temp!=0xf0)
  63.    {
  64.      delay(10);
  65.      if(temp!=0xf0)
  66.      {
  67.        temp=P1;
  68.        switch(temp)
  69.        {
  70.          case 0xed:
  71.               key=4;
  72.               break;
  73.          case 0xdd:
  74.               key=5;
  75.               break;
  76.          case 0xbd:
  77.               key=6;
  78.               break;
  79.          case 0x7d:
  80.               key=7;
  81.               break;
  82.         }
  83.         while(temp!=0xf0)
  84.         {
  85.           temp=P1;
  86.           temp=temp&0xf0;
  87.         }
  88.      }
  89.      }
  90.    P1=0xfb;
  91.    temp=P1;
  92.    temp=temp&0xf0;
  93.    if(temp!=0xf0)
  94.    {
  95.      delay(10);
  96.      if(temp!=0xf0)
  97.      {
  98.        temp=P1;
  99.        switch(temp)
  100.        {
  101.          case 0xeb:
  102.               key=8;
  103.               break;
  104.          case 0xdb:
  105.               key=9;
  106.               break;
  107.          case 0xbb:
  108.               key=10;
  109.               break;
  110.          case 0x7b:
  111.               key=11;
  112.               break;
  113.         }
  114.         while(temp!=0xf0)
  115.         {
  116.           temp=P1;
  117.           temp=temp&0xf0;
  118.         }
  119.      }
  120.      }
  121.    P1=0xf7;
  122.    temp=P1;
  123.    temp=temp&0xf0;
  124.    if(temp!=0xf0)
  125.    {
  126.      delay(10);
  127.      if(temp!=0xf0)
  128.      {
  129.        temp=P1;
  130.        switch(temp)
  131.        {
  132.          case 0xe7:
  133.               key=12;
  134.               break;
  135.          case 0xd7:
  136.               key=13;
  137.               break;
  138.          case 0xb7:
  139.               key=14;
  140.               break;
  141.          case 0x77:
  142.               key=15;
  143.               break;
  144.         }
  145.         while(temp!=0xf0)
  146.         {
  147.           temp=P1;
  148.           temp=temp&0xf0;
  149.         }
  150.      }
  151.    }
  152. }

  153. void Init()//初始化
  154. {
  155. num1=0;
  156. num2=0;
  157. wela=1;
  158. P0=0xdf;
  159. wela=0;
  160. dula=1;
  161. P0=table[1];
  162. dula=0;

  163. key=16;
  164. aa=0;
  165. dis=0;
  166. res=0;
  167. }




  168. void dis_play(long int nm)//顯示函數
  169. {
  170. uchar a1,a6;//a1位段選變量,a6為位選變量
  171. long int shu;
  172. shu=nm;
  173. if(shu==0)
  174. {
  175. wela=1;
  176. P0=0xdf;
  177. wela=0;
  178.      dula=1;
  179. P0=table[1];
  180. dula=0;
  181. }
  182. else
  183. {
  184. for(a6=0;a6<6;a6++)
  185. {
  186. a1=shu%10;//shu%10 shu比10小a1=shu本身
  187. if(shu!=0)
  188. {
  189. a1=a1+1;
  190. }
  191. shu=shu/10;//shu/10 shu比10小 shu為0
  192. P0=table[a1];
  193.            dula=1;
  194. dula=0;
  195. P0=weixuan[a6];
  196. wela=1;
  197. wela=0;
  198. delay(5);
  199. }        
  200. }
  201. }
  202. void display()//顯示選擇函數,dis 0或1顯示運算數,dis為2顯示結果
  203. {
  204. switch (dis)
  205.    {
  206.      case 0:{

  207. dis_play(num1);
  208. }        
  209. break;
  210.      case 1:{

  211. dis_play(num2);
  212. }        
  213. break;
  214.               case 2:{

  215. dis_play(res);
  216. }        
  217. break;
  218.    }        
  219. }

  220. void shanshuo()//數碼管閃爍
  221. {
  222. wela=1;
  223. P0=0xff;
  224. wela=0;
  225. delay(255);
  226. }

  227. void check()//運算函數
  228. {
  229. if(key!=16)
  230. {
  231. bee();
  232. if(key>=10)
  233. {
  234. switch (key)
  235.    {
  236.      case 10:Init();break;  // CE
  237.      case 11:{
  238.    switch (fun)//加,減,乘,除選擇標志位
  239.    {
  240.      case 0:res=num1+num2,dis=2;break;//加法
  241.      case 1:res=num1-num2,dis=2;break;//減法
  242.      case 2:res=num1*num2,dis=2;break;//乘法
  243.      case 3:res=num1/num2,dis=2;break;//除法
  244.    }
  245. };break;  // =
  246.      case 12:fun=0,aa=1,shanshuo();break;   // +
  247.      case 13:fun=1,aa=1,shanshuo();break;   // -
  248. case 14:fun=2,aa=1,shanshuo();break;   // *
  249.      case 15:fun=3,aa=1,shanshuo();break;   // /
  250.    }
  251. }
  252. else
  253. {
  254. switch (aa)//運算變量賦值標志位
  255.    {
  256.      case 0:{
  257. num1=num1*10+key;//把按鍵檢測到的值賦給num1運算變量1        
  258. };break;
  259.      case 1:{
  260. dis=1;
  261. num2=num2*10+key;//把按鍵檢測到的值賦給num2運算變量2
  262. };break;
  263.    }
  264. }
  265. }
  266. key=16;
  267. }

  268. void main()
  269. {
  270. Init();
  271. while(1)
  272. {
  273. key_scan();
  274. check();
  275. display();
  276. }
  277. }
復制代碼


回復

使用道具 舉報

ID:54731 發表于 2015-1-23 14:47 | 顯示全部樓層
學習中
回復

使用道具 舉報

ID:72399 發表于 2015-1-23 16:16 | 顯示全部樓層
呵呵很好不過沒有仿真就不想用你的程序了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产美女黄色片 | 欧美极品一区二区 | 日韩在线免费视频 | 夜夜骚| 国产精品久久国产精品99 | 国产黄色在线观看 | 欧美日韩视频 | 免费日韩av | 自拍偷拍中文字幕 | 婷婷99| 狠狠操av| 婷婷免费在线 | 成人黄色av | 亚洲欧美男人天堂 | www日本在线 | 久草精品在线 | 精品国产一区一区二区三亚瑟 | 中文字幕精品一区 | 国产精品a一区二区三区网址 | 欧美日韩高清 | 成年人在线视频 | 色av一区| 9191av| 一区二区三区免费 | 青青操91 | 日韩成人免费中文字幕 | 精品久久一区 | 欧美a∨| 免费观看毛片 | 亚洲第1页 | av在线一区二区三区 | 久久久久久九九九九九九 | 欧美一区2区三区4区公司 | 久草视频观看 | 国产黄色av网站 | 美女视频黄的免费 | 久久一区视频 | 久久精品播放 | 国产精品一区二区三区在线 | 免费在线视频a | 欧美激情精品久久久久久 |