单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1533|回复: 0
收起左侧

51单片机4X4按键(0~15)数码管显示、并通过串口通信发送相应数字(Proteus仿真)

[复制链接]
几许清辉 发表于 2018-11-21 11:34 | 显示全部楼层 |阅读模式
1、Proteus原理图:
QQ图片20181121110601.jpg


2、C程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define GPIO_KEY P1
  5. #define weixuan P2

  6. //0~F的共阳数码管段码,最后一个是黑屏
  7. const uchar SEG_CODE[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
  8. sbit wei1=P2^0;
  9. sbit wei2=P2^1;
  10. uchar ge,shi,KeyValue,j,b;
  11. uchar temp,temp1;
  12. uchar flag=0;

  13. /*****延时函数*****/
  14. void delay1ms(uint z)
  15. {
  16.    uint x,y;
  17.    for(x=z;x>0;x--)
  18.    for(y=112;y>0;y--);  //12M晶振下,延时1MS
  19. }

  20. /*****初始化函数*****/
  21. void InitUART(void)
  22. {
  23.    TMOD=0x20;
  24.    SCON=0x50;
  25.    TH1=0xFD;
  26.    TL1=TH1;
  27.    PCON=0x00;  
  28.    EA=1;  
  29.    ES=1;   
  30.    TR1=1;   
  31. }  

  32. /*****串口通信中断*****/
  33. void send(uchar x)
  34. {
  35.        SBUF=x;  
  36.        while(TI==0);   
  37.        TI=0;      
  38. }

  39. /*****显示函数*****/
  40. void xianshi(uchar k)   
  41. {
  42.    ge=k%10;  
  43.    shi=k/10;
  44.    if(k>9)  
  45.    {
  46.       weixuan=0x02;   
  47.       P0=SEG_CODE[ge];
  48.       send(shi+48);   
  49.       delay1ms(10);   
  50.       weixuan=0x01;
  51.       P0=SEG_CODE[shi];//十位段码,显示
  52.       send(ge+48);   
  53.       delay1ms(10);            
  54.     }
  55.     else           
  56.     {
  57.        weixuan=0x02;
  58.        P0=SEG_CODE[ge];//个位段选
  59.        send(ge+48);
  60.        delay1ms(10);                                                  
  61.      }
  62. }
  63. /***键盘扫描函数***/
  64. uchar keyscan()   
  65. {
  66.    char a=0;      
  67.    GPIO_KEY=0x0f;   //P1口值准备  
  68.     if(GPIO_KEY!=0x0f)   
  69.     {
  70.        delay1ms(10);   //延时消抖  
  71.        if(GPIO_KEY!=0x0f)//再次判断
  72.        {
  73.           GPIO_KEY=0x0f;  //再次装值准备
  74.           switch(GPIO_KEY)  //测试行   
  75.            {
  76.               case(0x07):KeyValue=0;break;
  77.               case(0x0b):KeyValue=1;break;
  78.               case(0x0d):KeyValue=2;break;
  79.               case(0x0e):KeyValue=3;break;                                             
  80.             }
  81.            GPIO_KEY=0xf0;   //高四位赋1,判断准备  HIGH FOUR BIT GET VERTICAL
  82.            switch(GPIO_KEY) //测试行   
  83.             {
  84.                  case(0x70):KeyValue=KeyValue;break;     
  85.                  case(0xb0):KeyValue=KeyValue+4;break;  
  86.                  case(0xd0):KeyValue=KeyValue+8;break;  
  87.                  case(0xe0):KeyValue=KeyValue+12;break;           
  88.             }
  89.             while((GPIO_KEY!=0x0f)&&(a<10)) //判断是否松手,假若没有松手
  90.                                                                //一段延时后依旧判断松手完成
  91.             {
  92.                delay1ms(1);
  93.                a++;
  94.             }
  95.                a=0;
  96.          }
  97.      }
  98.      return KeyValue;
  99. }

  100. /*****主函数*******/
  101. void main()
  102. {
  103.    InitUART();
  104.    while(1)
  105.    {
  106.       b=keyscan();
  107.       xianshi(b);
  108.     }        
  109. }
复制代码

3、Proteus仿真图示例:
QQ图片20181121111647.png


4、串口精灵仿真接收数据示例:
单片机参数设置:
QQ图片20181121113605.png

串口参数设置:
QQ图片20181121113623.png

串口精灵仿真运行:
QQ图片20181121112722.jpg


5、顺便附上案例文件(能正常运行)
4X4按键串口通信.rar (55.64 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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