找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1286|回复: 0
打印 上一主题 下一主题
收起左侧

单片机数码管与按键 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <ctype.h>   /*   isdigit()函数   */
  4. #include <stdlib.h>   /*    atoi()函数     */
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. uchar operand1[9], operand2[9];  /*   操作数   */
  8. uchar operator;      /*   操作符   */
  9. void delay(uint);
  10. uchar keyscan();
  11. void disp(void);
  12. void buf(uint value);
  13. uint compute(uint va1,uint va2,uchar optor);
  14. uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
  15.     0x92,0x82,0xf8,0x80,0x90,0xff};     /*   字符码表   */
  16. uchar dbuf[8] = {10,10,10,10,10,10,10,10};      /*   显示缓存   */
  17. /*   延时函数   */  
  18. void delay(uint z)
  19. {
  20. uint x,y;
  21. for(x=z;x>0;x--)
  22. for(y=110;y>0;y--);
  23. }

  24. uchar keyscan()
  25. {
  26. uchar skey;                     /*   按键值标记变量    */
  27.    
  28. P1 = 0xfe;
  29. while((P1 & 0xf0) != 0xf0)     /*      有按键按下     */
  30. {
  31.   delay(3);              /*      去抖动延时     */
  32.   while((P1 & 0xf0) != 0xf0) /*      仍有键按下     */
  33.   {
  34.    switch(P1)    /*    识别按键并赋值   */
  35.    {
  36.     case 0xee: skey = '7'; break;
  37.     case 0xde: skey = '8'; break;
  38.     case 0xbe: skey = '9'; break;
  39.     case 0x7e: skey = '/'; break;
  40.      
  41.     default:   skey = '#';
  42.    }
  43.    while((P1 & 0xf0) != 0xf0) /*   等待按键松开   */
  44.     ;
  45.   }
  46. }

  47. P1 = 0xfd;
  48. while((P1 & 0xf0) != 0xf0)
  49. {
  50.   delay(3);
  51.   while((P1 & 0xf0) != 0xf0)
  52.   {
  53.    switch(P1)
  54.    {
  55.     case 0xed: skey = '4'; break;
  56.     case 0xdd: skey = '5'; break;
  57.     case 0xbd: skey = '6'; break;
  58.     case 0x7d: skey = '*'; break;
  59.      
  60.     default:   skey = '#';
  61.    }
  62.    while((P1 & 0xf0) != 0xf0)
  63.     ;
  64.   }
  65. }

  66. P1 = 0xfb;
  67. while((P1 & 0xf0) != 0xf0)
  68. {
  69.   delay(3);
  70.   
  71.   while((P1 & 0xf0) != 0xf0)
  72.   {
  73.    switch(P1)
  74.    {
  75.     case 0xeb: skey = '1'; break;
  76.     case 0xdb: skey = '2'; break;
  77.     case 0xbb: skey = '3'; break;
  78.     case 0x7b: skey = '-'; break;
  79.      
  80.     default: skey = '#';
  81.    }
  82.    while((P1 & 0xf0) != 0xf0)
  83.     ;
  84.   }
  85. }

  86. P1 = 0xf7;
  87. while((P1 & 0xf0) != 0xf0)
  88. {
  89.   delay(3);
  90.   while((P1 & 0xf0) != 0xf0)
  91.   {
  92.    switch(P1)
  93.    {
  94.     case 0xe7: skey = '

  95. ; break;
  96.     case 0xd7: skey = '0'; break;
  97.     case 0xb7: skey = '='; break;
  98.     case 0x77: skey = '+'; break;
  99.      
  100.     default:   skey = '#';
  101.    }
  102.    while((P1 & 0xf0) != 0xf0)
  103.     ;
  104.   }
  105. }
  106. return skey;
  107. }
  108. void main()
  109. {
  110. uint value1, value2, value;     /*    数值1,数值2,结果    */
  111. uchar ckey, cut1 = 0, cut2 = 0;    /*    ckey键盘输入字符    */
  112. uchar operator;                 /*         运算符         */
  113. uchar i, bool = 0;
  114. init:           /*    goto语句定位标签    */
  115. buf(0);                            /*         初始化         */
  116. disp();
  117. value = 0;
  118. cut1 = cut2 = 0;
  119. bool = 0;
  120. for(i = 0;i < 9;i++)
  121. {
  122.   operand1[i] = '\0';
  123.   operand2[i] = '\0';
  124. }                                  /*         初始化         */
  125. while(1)
  126. {
  127.   ckey = keyscan();             /*         读取键盘        */
  128.   if(ckey != '#')
  129.   { /*  isdigit函数,字符是阿拉伯数字返回非0值,否则返回0  */
  130.    if(isdigit(ckey))         
  131.    {
  132.     switch(bool)
  133.     {
  134.      case 0:
  135.        operand1[cut1] = ckey;
  136.        operand1[cut1+1] = '\0';
  137.        value1 = atoi(operand1);  
  138.        cut1++;
  139.        buf(value1);
  140.        disp();
  141.        break;
  142.      case 1:
  143.        operand2[cut2] = ckey;
  144.        operand2[cut2+1] = '\0';
  145.        value2 = atoi(operand2);
  146.        cut2++;
  147.        buf(value2);
  148.        disp();
  149.        break;
  150.       
  151.      default: break;
  152.     }
  153.    }
  154.    else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
  155.    {
  156.     bool = 1;
  157.     operator = ckey;
  158.     buf(0);
  159.     dbuf[7] = 10;
  160.     disp();
  161.    }
  162.    else if(ckey == '=')
  163.    {
  164.     value = compute(value1,value2,operator);
  165.     buf(value);
  166.     disp();
  167.     while(1)                    
  168.     {
  169.      ckey = keyscan();
  170.      if(ckey == '

  171. )          /* 如果有清零键按下跳转到开始 */
  172.       goto init;
  173.      else
  174.       {
  175.        buf(value);
  176.        disp();
  177.       }
  178.     }
  179.    }
  180.    else if(ckey == '

  181. )
  182.    { goto init;}
  183.   }
  184.   disp();
  185. }
  186. }
  187. uint compute(uint va1,uint va2,uchar optor)
  188. {
  189. uint value;
  190. switch(optor)
  191. {
  192.   case '+' : value = va1+va2; break;
  193.   case '-' : value = va1-va2; break;
  194.   case '*' : value = va1*va2; break;
  195.   case '/' : value = va1/va2; break;
  196.   
  197.   default :  break;
  198. }
  199. return value;
  200. }
  201. void buf(uint val)
  202. {
  203. uchar i;
  204. if(val == 0)
  205. {
  206.   dbuf[7] = 0;
  207.   i = 6;
  208. }

  209. else
  210.   for(i = 7; val > 0; i--)
  211.   {
  212.    dbuf[i] = val % 10;
  213.    val /= 10;
  214.   }

  215. for( ; i > 0; i--)
  216.   dbuf[i] = 10;
  217. }
  218. void disp(void)
  219. {
  220. uchar bsel, n;

  221. bsel=0x01;
  222.     for(n=0;n<8;n++)
  223.     {
  224.   P2=bsel;
  225.   P0=table[dbuf[n]];
  226.   bsel=_crol_(bsel,1);
  227.   delay(3);
  228.   P0=0xff;
  229.     }
  230. }
复制代码

附件.zip

56.46 KB, 下载次数: 2, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表