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

標題: 51單片機簡單計算器用數碼管顯示 [打印本頁]

作者: liuda    時間: 2015-1-21 22:03
標題: 51單片機簡單計算器用數碼管顯示
是用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. }
復制代碼



作者: 南天白云    時間: 2015-1-23 14:47
學習中
作者: 綠源學習者    時間: 2015-1-23 16:16
呵呵很好不過沒有仿真就不想用你的程序了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 九一国产精品 | 亚洲av毛片成人精品 | 怡红院怡春院一级毛片 | 视频一区二区在线观看 | 国产精品亚洲一区 | 日韩一区二区三区精品 | 久久久久国产一区二区三区 | 亚洲成人国产综合 | 欧美一区二区视频 | 久久视频精品在线 | 尤物视频在线免费观看 | 亚洲成人三级 | 国产精品免费看 | 欧美精品久久久久 | 国产精品久久免费观看 | 欧美舔穴| 久草青青 | 国产精品亚洲一区二区三区在线 | 一级做a爰片性色毛片16 | 超碰精品在线 | 成人欧美一区二区三区黑人孕妇 | 美女视频黄色片 | 日本一区二区视频 | 欧美一级片中文字幕 | 亚洲国产成人av好男人在线观看 | 国产传媒毛片精品视频第一次 | 七七婷婷婷婷精品国产 | 一区日韩 | 黄色在线免费观看 | 色综合天天天天做夜夜夜夜做 | 成人在线视频免费观看 | 欧美色图另类 | 欧美九九 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 在线看亚洲 | 久久久久久国产精品免费免费狐狸 | 国产激情视频在线 | 欧美日韩高清免费 | 国产欧美精品一区 | 丝袜美腿一区二区三区 | 在线播放国产一区二区三区 |