10422|13

1861

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

4*4键盘矩阵扫描VHDL程序中的一个问题,求大侠帮忙 [复制链接]

这两天在做毕设,其中一个矩阵键盘扫描的问题,让我有点困惑。

问题情况如下:
假设第一排每个按键分别对应着数码管显示:1 5 9 13四个数,但是
当按下第一排显示1的按键时候,数码管显示的数会在1和5,之间以扫描的频率交替显示,
按下显示5按键时,交替显示的是5和9,
按下9时,交替显示的是9和13;
按下13时,交替显示13和1。

同理与第二排,第三排,第四排;

现在困惑于为什么会出现这样的交替显示情况?

求大侠帮忙解答一下,感激不尽 !!!

以下是运行的程序,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity key44 is
port(c20hz : in std_logic;
   keyh : out std_logic_vector(3 downto 0);       --数码管十位
   keyl : out std_logic_vector(3 downto 0);    ---个位
   keyscan : buffer std_logic_vector(3 downto 0);    ----  列
   hang : in std_logic_vector(3 downto 0));        ---- 行
end entity key44;
------------------------------------------------------
architecture behave of key44 is
signal read_data : std_logic_vector(3 downto 0);
signal scan_data : std_logic_vector(1 downto 0);
signal z : std_logic_vector(7 downto 0);
begin
P1: process(c20hz)
variable temp : std_logic_vector(1 downto 0);
begin
    if c20hz'event and c20hz='1' then
  if temp < 3 then temp := temp + 1;
  else temp := (others => '0');
  end if;
end if;
scan_data <= temp;
end process;
z<=keyscan&hang;
P2: process(c20hz,scan_data)----------扫描
begin
  if scan_data="00" then keyscan <= "1110";
  case z is
   when "11101110" => read_data <= "0000";
   when "11101101" => read_data <= "0001";
   when "11101011" => read_data <= "0010";
   when "11100111" => read_data <= "0011";
   when others => null;
     end case;
elsif scan_data="01" then keyscan <= "1101";
    case z is
   when "11011110" => read_data <= "0100";
   when "11011101" => read_data <= "0101";
   when "11011011" => read_data <= "0110";
   when "11010111" => read_data <= "0111";
   when others => null;
     end case;
elsif scan_data="10" then keyscan <= "1011";
  case z is
   when "10111110" => read_data <= "1000";
   when "10111101" => read_data <= "1001";
   when "10111011" => read_data <= "1010";
   when "10110111" => read_data <= "1011";
   when others => null;
     end case;
elsif scan_data="11" then keyscan <= "0111";
  case z is
   when "01111110" => read_data <= "1100";
   when "01111101" => read_data <= "1101";
   when "01111011" => read_data <= "1110";
   when "01110111" => read_data <= "1111";
   when others => null;
     end case;
else null;
end if;
end process;
P3: process(c20hz,read_data)-------译码
  begin
  case read_data is
        when "0000"=> keyh<="0000";keyl<="0001";
        when "0001"=> keyh<="0000";keyl<="0010";
        when "0010"=> keyh<="0000";keyl<="0011";
        when "0011"=> keyh<="0000";keyl<="0100";
        when "0100"=> keyh<="0000";keyl<="0101";
        when "0101"=> keyh<="0000";keyl<="0110";
        when "0110"=> keyh<="0000";keyl<="0111";
        when "0111"=> keyh<="0000";keyl<="1000";
        when "1000"=> keyh<="0000";keyl<="1001";
        when "1001"=> keyh<="0001";keyl<="0000";
        when "1010"=> keyh<="0001";keyl<="0001";
        when "1011"=> keyh<="0001";keyl<="0010";
        when "1100"=> keyh<="0001";keyl<="0011";
        when "1101"=> keyh<="0001";keyl<="0100";
        when "1110"=> keyh<="0001";keyl<="0101";
        when "1111"=> keyh<="0001";keyl<="0110";
  end case;
end process;
end behave;
此帖出自FPGA/CPLD论坛

最新回复

问题已经解决,我做个总结,网络上的vhdl代码有的可以有的不行,要慎重参考,因为除了代码本身(代码本身是正确的,但是每个人写法不同,比如网上某个写的代码中0111表示第一列,或许另个人的代码中1110表示第一列),还有一个非常重要的因素----管脚的锁定,楼主的问题是,按下一个键,数字会交替显示,也就是说,有两个问题:1、扫描过程中无法定位确定的数字,而是只能定位一行,而在这一行中来回显示。2、按下按键后,扫描没有停止,还在继续扫描。问题1就是管脚锁定的问题,4*4矩阵键盘有一组输出管脚和输入管脚,这两组管脚都要设定,否则不能定位到具体的数字(但是管脚的具体功能我还没懂,总之都要设定)。问题2,增加一个中断信号,这个自己可以研究出来,百度里的代码里也有。 以上内容,仅供参考。若有错误,请指出  详情 回复 发表于 2016-1-6 10:26
点赞 关注
个人签名有目的的学习是最有效的学习!
 

回复
举报

6892

帖子

0

TA的资源

五彩晶圆(高级)

推荐
 
可以肯定的说,是你的程序设计出了问题。具体啥问题,要仔细分析你的程序
此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复

1861

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
后来加了一个检测到后的终止扫描语句,也依然会这样的状态,

时钟频率是20hz,
用的是红色飓风的开发板。
资料上说,在20hz情况下,可以不用另外去抖,
此帖出自FPGA/CPLD论坛
个人签名有目的的学习是最有效的学习!
 
 
 

回复

1861

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
P1: process(c20hz,hang)
        variable temp : std_logic_vector(1 downto 0);
        begin
           if c20hz'event and c20hz='1' then
                if temp < 3 then temp := temp + 1;
        
           if (hang="1110" or hang="1101" or hang="1011" or hang="0111") then    ----stop scan
              temp:=temp;
           end if;

                else temp := (others => '0');
                end if;
        end if;
        scan_data <= temp;
        end process;


这是后来修改后的终止扫描继续的片段
此帖出自FPGA/CPLD论坛
个人签名有目的的学习是最有效的学习!
 
 
 

回复

1861

帖子

0

TA的资源

五彩晶圆(中级)

4
 
我困惑了一个下午了,请坛友帮忙看看,哪里出的问题~~谢谢了!
此帖出自FPGA/CPLD论坛
个人签名有目的的学习是最有效的学习!
 
 
 

回复

1861

帖子

0

TA的资源

五彩晶圆(中级)

6
 

回复 5楼 eeleader 的帖子

谢谢!
正在分析,那个原因是因为没有去抖,
现在的问题成了只能识别一行,不能具体到一个按键~~
此帖出自FPGA/CPLD论坛
个人签名有目的的学习是最有效的学习!
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 5楼 eeleader 的帖子

顶这个回复,呵呵。
矩阵键盘的扫描注意在代码上加入10ms的延时祛痘,同时在8根扫描线上串接1~10K的去痘电阻,呵呵。
此帖出自FPGA/CPLD论坛
 
 
 

回复

1861

帖子

0

TA的资源

五彩晶圆(中级)

8
 

回复 7楼 pepsi360 的帖子

问题已解决,谢谢你的回复。
不过最后的问题不在于去抖,而是在扫描保持的控制上。
此帖出自FPGA/CPLD论坛
个人签名有目的的学习是最有效的学习!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
想问问大侠最后的问题是怎么解决的   我刚刚学习VHDL语言,你说的那个扫描停止控制,我尝试了很多次,依旧没有成功,还希望大侠能够不吝赐教!谢了!我得邮箱是gangling1987@163.com
此帖出自FPGA/CPLD论坛
 
 
 

回复

221

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个我也做了当时我只有5和B有用,按其他键都没用,最后发现是程序的问题···
此帖出自FPGA/CPLD论坛
个人签名学习
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

11
 
是不是写个延时啊?
此帖出自FPGA/CPLD论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

12
 
楼主 我们刚也遇到你这个问题,没法突破,你是怎么解决的,求指导
此帖出自FPGA/CPLD论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

13
 
就这么飘来飘去 发表于 2016-1-5 16:19
楼主 我们刚也遇到你这个问题,没法突破,你是怎么解决的,求指导

数字不会来回变,因为加了个中断时钟信号的设置,但是只能定位行,没法定位确定的数字,
此帖出自FPGA/CPLD论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

14
 
就这么飘来飘去 发表于 2016-1-5 16:20
数字不会来回变,因为加了个中断时钟信号的设置,但是只能定位行,没法定位确定的数字,

问题已经解决,我做个总结,网络上的vhdl代码有的可以有的不行,要慎重参考,因为除了代码本身(代码本身是正确的,但是每个人写法不同,比如网上某个写的代码中0111表示第一列,或许另个人的代码中1110表示第一列),还有一个非常重要的因素----管脚的锁定,楼主的问题是,按下一个键,数字会交替显示,也就是说,有两个问题:1、扫描过程中无法定位确定的数字,而是只能定位一行,而在这一行中来回显示。2、按下按键后,扫描没有停止,还在继续扫描。问题1就是管脚锁定的问题,4*4矩阵键盘有一组输出管脚和输入管脚,这两组管脚都要设定,否则不能定位到具体的数字(但是管脚的具体功能我还没懂,总之都要设定)。问题2,增加一个中断信号,这个自己可以研究出来,百度里的代码里也有。
以上内容,仅供参考。若有错误,请指出
此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表