找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3071|回复: 2
收起左侧

LED数码管显示与按钮输入的单片机源程序

[复制链接]
ID:392349 发表于 2018-9-1 16:35 | 显示全部楼层 |阅读模式
  1. /***********************************************************
  2. 实验名称:LED数码管显示与按钮输入   
  3. 说 明:1.3.2(INT0)作为按钮输入口构成一个"0#~#7"的8个按钮和8个LED的显示按钮电路,
  4.        系统复位时,显示"HELLO--88",当按下任意键时,在最右边LED上显示该键号,原显示内容自动左移;
  5. ***********************************************************/
  6. #include<reg51.h>              //51单片机头文件//
  7. #include <intrins.h>

  8. #define uchar unsigned char     //无符号8位变量 //
  9. #define uint unsigned int     //无符号16位变量 //

  10. sbit P2_6= P2^6;             //段锁存//
  11. sbit P2_7= P2^7;             //位锁存//
  12. sbit P3_2= P3^2;       //外部中断0

  13. uchar Disp_Tab[14] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x79,0x76,0x38,0x40};  //段码控制     0    1    2   3   4   5    6    7   8   9   E   H   L    -//                                                            
  14. // 0-9,E(0x79),H(0x76),L(0x38),-(0x40)
  15. uchar weixuan[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制,查表的方法控制//
  16. //数码管位选通表
  17. uchar buffer[8]={11,10,12,12,0,13,8,8};//HELLO-88
  18. uchar newkey,keyON=0;

  19. void shiftkey();
  20. void display();
  21. void keyscan();
  22. void delay(unsigned int i);
  23. /***********************************************************
  24. 函数名称:主函数  
  25. ***********************************************************/
  26. void main()
  27. {  
  28.    while(1)
  29.   {        
  30.       display();               //调用显示函数//
  31.         keyscan();               //按键检测函数//
  32.         shiftkey();          //按键移位函数//
  33.   }     
  34. }
  35. /**********************************************************
  36. 函数名称:数码管显示函数
  37. **********************************************************/
  38. void display()
  39. {
  40.     char i,num=0;
  41.     for(i=0;i<8;i++)
  42.     {
  43.         P0=0xff;            //位锁存清除//
  44.         P2_7=1;            
  45.         P2_7=0;

  46.         num=buffer[i];
  47.         P0=Disp_Tab[num];    //段选值//
  48.         P2_6=1;               
  49.     P2_6=0;          //段锁存//

  50.         P0=weixuan[i];        //位选值//
  51.         P2_7=1;            
  52.         P2_7=0;           //位锁存//
  53.         
  54.         delay(1);
  55.     }
  56. }

  57. /**********************************************************
  58. 函数名称:按键检测函数
  59. **********************************************************/
  60. void keyscan()
  61. {
  62.     unsigned char i;
  63.     P0=0x00;               //清空段选//
  64.     P2_6=1;               
  65.     delay(1);
  66.     P2_6=0;                    //段锁存//
  67.    
  68.     P0=0x00;               //位选全为低电平零
  69.     P2_7=1;              
  70.     delay(1);
  71.     P2_7=0;         //位锁存//
  72.    
  73.     if(P3_2==0)           //如果有键按下
  74.     {
  75.         for(i=0;i<8;i++)       //8个键值依次扫描
  76.         {   
  77.             delay(1);
  78.             P0=weixuan[i];       //位选控制,依次给出低电平
  79.             P2_7=1;
  80.             delay(1);
  81.             P2_7=0;
  82.         
  83.             if(P3_2==0)      //是否有对应键按下
  84.             {
  85.                 delay(10);      //去抖//
  86.                 if(P3_2==0)  //再次判断是否有键按下
  87.                 {
  88.                     delay(3);
  89.                     newkey=i+1;     //记录相应键值//
  90.                     keyON=1;         //设有键按下标志
  91.                
  92.                 while(P3_2==0);//去抖,此处按键未弹起则数码管不显示//                  
  93.                 }
  94.             }
  95.         }   
  96.     }   
  97. }   
  98. /**********************************************************
  99. 函数名称:按键移位函数
  100. **********************************************************/
  101. void shiftkey()
  102. {
  103.      if(keyON==1)                      //进入按键//
  104.      {
  105.           buffer[0]=buffer[1];      //值的移位//
  106.           buffer[1]=buffer[2];
  107.           buffer[2]=buffer[3];
  108.           buffer[3]=buffer[4];
  109.           buffer[4]=buffer[5];
  110.           buffer[5]=buffer[6];
  111.           buffer[6]=buffer[7];
  112.           buffer[7]=newkey;
  113.           keyON=0;
  114.      }
  115. }   
  116. /***********************************************************
  117. 函数名称:延时函数  
  118. ***********************************************************/
  119. void Delay(uint t)
  120. {
  121.     uint i,j;
  122.     for(i=t;i>0;i--)
  123.         for(j=1100;j>0;j--)
  124.             ;
  125. }
复制代码
回复

使用道具 举报

ID:1 发表于 2018-9-1 17:25 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:277550 发表于 2018-9-1 21:06 | 显示全部楼层
       P0=Disp_Tab[num];    //段选值//
        P2_6=1;               
        P2_6=0;            //段锁存//

        P0=weixuan[i];        //位选值//
        P2_7=1;            
        P2_7=0;             //位锁存//

位和段都是P0输出,另两个IO控制是段还是位,没用过这样的芯片、模块。。。。。。


功能在代码前面有说明,但没说哪种芯片。所以电路图,就不好说了

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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