分享

51单片机简单计算器用数码管显示

 NS 2015-04-05
是用51hei单片机开发板 电路图详见:http://www./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. }
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多