竹惊娇 2023-10-31 21:13 采纳率: 66.7%
浏览 8
已结题

51单片机的矩阵键盘检测为什么有问题

这个编码出来在单片机上不是所有数码管亮以及矩阵键盘按键不对应。

img

img

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-01 08:38
    关注

    【相关推荐】



    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7589756
    • 这篇博客你也可以参考下:51单片机可以用来做什么?单片机可以做的小产品
    • 您还可以看一下 吴刚老师的【吴刚大讲堂】视觉设计快速入门50讲课程中的 设计连续性与用户期待的一致性小节, 巩固相关知识点
    • 除此之外, 这篇博客: 【51单片机】静态数码管显示中的 什么是数码管? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      数码管非常常见,就是8字形管,形状很红路灯的倒计时一样,不过红绿灯是用多个LED模拟数码管,数码管引脚图
      从上图可以看到一个数码管有8段组成,abcdefg七段组成数字,dp是小数点,而七段数码管就 是少了dp小数点;数码管的abcdefg分别对应P0的低7位,dp对应第8位;由于我们的是共阴极的,所以只要在对应的段上加上高电平就可以点亮这个数码管。

      我们的代码实现如下:

      #include<reg52.h>
      typedef unsigned char u8;
      typedef unsigned int u16;
      
      #define TUBE P0    //定义宏变量
      sbit S1=P2^2;		//这三位是片选,我们的板子上有8个数码管,通过片选可以让任意一个有效;
      sbit S2=P2^3;
      sbit S3=P2^4;
      
      u8 code digit_table[]={//定义每一个数字对应的数码管值
      0x3f/*0*/, 0x06/*1*/, 0x5b/*2*/, 0x4f/*3*/,
      0x66/*4*/, 0x6d/*5*/, 0x7d/*6*/, 0x07/*7*/,
      0x7f/*8*/, 0x6f/*9*/, 0x77/*A*/, 0x7c/*b*/, 
      0x39/*C*/, 0x5e/*d*/, 0x79/*E*/, 0x71/*F*/,
      0x00
      };
      void select_tube(u8 n)
      {
      	S1=n%2;
      	S2=n/2%2;
      	S3=n/4%2;
      }
      
      void delay_ms(u16 n)
      {
      	u8 i;
      	while(n--)
      	{
      		i = 111;
      		while(i--);
      	}
      }
      
      void main()
      {
      	u8  j;
      	while(1)
      	{
      		for(j=0; j < 16; j++)
      		{
      			select_tube(0);
      			TUBE=digit_table[j];
      			delay_ms(300);
      		}
      	}
      }
      

      这个程序的效果就是让第一个数码管循环显示0-F。

      u8 code digit_table[]={//定义每一个数字对应的数码管值
      0x3f/*0*/, 0x06/*1*/, 0x5b/*2*/, 0x4f/*3*/,
      0x66/*4*/, 0x6d/*5*/, 0x7d/*6*/, 0x07/*7*/,
      0x7f/*8*/, 0x6f/*9*/, 0x77/*A*/, 0x7c/*b*/, 
      0x39/*C*/, 0x5e/*d*/, 0x79/*E*/, 0x71/*F*/,
      0x00
      };
      

      大家有没有发现这里有个code关键字,我也是第一次遇到,C语音中没有这个关键字,这个关键字是用来告诉编译器数组digit_table放在代码段,而不是放在默认的数据段;

      放在代码段可以减小程序的体积,但是会放在代码段的变量是不能修改的,必须是只读的;

      我还遇到一个疑问,正常来说如果放在代码段,code应该会增大,而data应该会减小;反过来如果放在数据段,data应该变大,而code应该变小,但结果却是放在代码段,data和code都变小了,如下:
      没有使用code编译时:
      Program Size: data=26.0 xdata=0 code=230

      使用code编译时:
      Program Size: data=9.0 xdata=0 code=99

      这是一个值得研究的问题!


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 修改了问题 10月31日
  • 修改了问题 10月31日
  • 展开全部