5679|11

56

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

检测按键并输出至数码管显示不正确 [复制链接]

 
本帖最后由 JLennon 于 2018-2-2 08:35 编辑

程序如下,proteus代码见附件,按键K8,K12,K16无法显示,请教是哪里出错了?实在没找到原因,谢谢赐教。
  1.                 LIST P=18F4520                                            ;--- 器件型号定义 ---
  2.                 #include <P18F4520.INC>                            ;--- 器件的寄存器头文件包含 ---
  3.                 ;--------------------------------------------------------------------------------
  4.                 ;--- 单片机配置字配置区 ---
  5.                 CONFIG OSC = INTIO67                        ;--- 配置时钟源为内部RC振荡器 ---
  6.                 CONFIG WDT = OFF                                     ;--- 禁止看门狗功能 ---
  7.                 CONFIG DEBUG = OFF                            ;--- 禁止调试功能 ---
  8.                 CONFIG LVP = OFF                                ;--- 禁止低电压编程功能 ---
  9.                 CONFIG PBADEN = OFF                                   ;--- 配置RB端口全为数字IO引脚 ---
  10.                 ;--------------------------------------------------------------------------------
  11.                 ;--- 全局变量定义区 ---
  12.                 CBLOCK 0x10
  13.                         KEYTEMP
  14.                         KEY
  15.                         DELAY_A
  16.                         DELAY_B
  17.                         DELAY_C
  18.                 ENDC
  19.                 ;--------------------------------------------------------------------------------
  20.                 ;--- 程序的开始执行处 ---
  21.                 ORG 0                                                                   ;--- 单片机复位地址 ---
  22.                 GOTO START                                                        ;--- 跳到主程序 ---
  23.                 ORG 0x30                                                        ;--- 主程序入口地址 ---
  24. START:        NOP
  25.                 ;--------------------------------------------------------------------------------
  26.                 ;--- 初始化内部时钟源 ---
  27.                 MOVLW 0x70
  28.                 MOVWF OSCCON                                                ;--- 选择内部8MHZ的RC振荡器 ---
  29.                 BCF OSCTUNE,PLLEN                                        ;--- 禁止内部4倍PLL功能 ---
  30.                 ;--------------------------------------------------------------------------------
  31.                 ;--- 初始化GPIO引脚 ---
  32.                 CLRF WREG
  33.                 MOVWF TRISD                                                        ;--- 配置RD端口为输出方向 ---
  34.                 MOVWF LATD                                                        ;--- 让RD端口输出全为低电平 ---
  35.                 BCF INTCON2,RBPU                                        ;--- 使能RB端口的内部弱上拉功能 ---
  36.                 ;--------------------------------------------------------------------------------
  37.                 ;--- 初始化相关变量 ---               
  38.                 MOVLW 0x0F
  39.                 MOVWF TRISB                                                        ;--- 配置RB7..4为输出引脚,RB3..0为输入引脚 ---
  40.                 MOVWF LATB                                                        ;--- RB7..4输出低电平 ---
  41.                 ;--------------------------------------------------------------------------------
  42.                 ;--- 主程序:实现4X4矩阵键盘,将按键值送到LED数码管上显示 ---
  43. MAIN:        NOP
  44.                 MOVF PORTB,W                                                ;--- 检测是否有键按下 ---
  45.                 ANDLW 0x0F
  46.                 MOVWF KEYTEMP
  47.                 MOVLW 0x0F
  48.                 CPFSEQ KEYTEMP
  49.                 GOTO KEYA                                                        ;--- 有键按下,则跳到指定处 ---
  50.                 GOTO MAIN                                                        ;--- 无键按下,则继续检测 ---
  51. KEYA:        CALL DELAY                                                        ;--- 去按键抖动 ---
  52.                 MOVF PORTB,W                                                ;--- 检测是否真得有键按下 ---
  53.                 ANDLW 0x0F
  54.                 MOVWF KEYTEMP
  55.                 MOVLW 0x0F
  56.                 CPFSEQ KEYTEMP
  57.                 GOTO KEYB                                                        ;--- 真得有键按下,则跳到指定处 ---
  58.                 GOTO MAIN                                                        ;--- 表示无键按下 ---
  59. KEYB:        MOVLW 0xF0                                                        ;--- 读取当前值之后,将行和列方向交换 ---
  60.                 MOVWF TRISB
  61.                 MOVWF LATB
  62.                 MOVF PORTB,W                                                ;--- 读取当前按键的代码值 ---
  63.                 ANDLW 0xF0
  64.                 IORWF KEYTEMP                                                ;--- 和上次读到的按键代码值组合 ---
  65.                 CLRF KEY
  66. KEYD:        MOVF KEY,W                                                        ;--- 将读取的按键代码值与KEYTAB表中值比较 ---
  67.                 ADDWF WREG,W
  68.                 CALL KEYTAB
  69.                 CPFSEQ KEYTEMP
  70.                 GOTO KEYC                                                        ;--- 没有找到,则找下一个按键代码值 ---
  71.                 GOTO FIND                                                        ;--- 找到键值代码,跳到指定处 ---
  72. KEYC:        INCF KEY
  73.                 MOVLW 0x10
  74.                 CPFSLT KEY
  75.                 GOTO NOFIND                                                        ;--- 在按键代码值中没有找到,跳到指定处 ---
  76.                 GOTO KEYD
  77. FIND:        MOVF KEY,W                                                        ;--- 将找到的键值通过查找数码管显示代码值 ---
  78.                 ADDWF WREG,W
  79.                 CALL LEDSEG
  80.                 MOVWF LATD                                                        ;--- 送出去显示 ---
  81. NOFIND:        NOP
  82. WAIT:        MOVF PORTB,W                                                ;--- 等待按键释放 ---
  83.                 ANDLW 0xF0
  84.                 MOVWF KEYTEMP
  85.                 MOVLW 0xF0
  86.                 CPFSEQ KEYTEMP
  87.                 GOTO WAIT
  88.                 MOVLW 0x0F                                                        ;--- 将行和列方向交换 ---
  89.                 MOVWF TRISB
  90.                 MOVWF LATB
  91.                 GOTO MAIN                                                        ;--- 跳到主程序开始处 ---
  92.                 ;--------------------------------------------------------------------------------
  93.                 ;--- 4x4矩阵键盘代码值 ---
  94. KEYTAB:        ADDWF PCL,F
  95.                 DT 0xEE,0xED,0xEB,0xE7
  96.                 DT 0xDE,0xDD,0xDB,0xD7
  97.                 DT 0xBE,0xBD,0xBB,0xB7
  98.                 DT 0x7E,0x7D,0x7B,0x77
  99.                 ;--------------------------------------------------------------------------------
  100.                 ;--- 定义数码管显示0-9,A-F的笔段代码 ---
  101. LEDSEG:        ADDWF PCL,F
  102.                 DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
  103.                 DT 0x77,0x7C,0x39,0x5E,0x79,0x71
  104.                 ;--------------------------------------------------------------------------------
  105.                 ;--- 延时子程序 ---
  106. DELAY:        MOVLW 0x01
  107.                 MOVWF DELAY_A
  108. DLY_A:        MOVLW 0x10
  109.                 MOVWF DELAY_B
  110. DLY_B:        MOVLW 0xFF
  111.                 MOVWF DELAY_C
  112. DLY_C:        DECFSZ DELAY_C
  113.                 GOTO DLY_C
  114.                 DECFSZ DELAY_B
  115.                 GOTO DLY_B
  116.                 DECFSZ DELAY_A
  117.                 GOTO DLY_A
  118.                 RETURN               
  119.                 END
  120.                
复制代码






KEY_4X4_ASM.zip

56.73 KB, 下载次数: 0

最新回复

仿真还是非常有用的,可以详细看到程序在哪里出的问题  详情 回复 发表于 2018-2-5 11:50
点赞 关注
 

回复
举报

1234

帖子

4

TA的资源

纯净的硅(高级)

沙发
 
不明白你那NOP加上是干嘛的,没事自我消耗?
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

板凳
 
按键K8,K12,K16无法显示。现象是什么。显示用的什么。可以用io高低电平表示按键状态。看能否得到正确按键状态。

点评

7段数码管显示,K8,K12,K16按下时,LATD=0X0,其余按键显示都是对的。  详情 回复 发表于 2018-2-1 19:38
 
 
 

回复

56

帖子

2

TA的资源

一粒金砂(中级)

4
 
ienglgge 发表于 2018-2-1 18:21
按键K8,K12,K16无法显示。现象是什么。显示用的什么。可以用io高低电平表示按键状态。看能否得到正确按键状 ...

7段数码管显示,K8,K12,K16按下时,LATD=0X0,其余按键显示都是对的。
 
 
 

回复

1304

帖子

0

TA的资源

纯净的硅(高级)

5
 
K8,K12,K16按下时,LATD=0X0------------数码管是没有显示?还是数码管错误显示?数码管显示出来的是什麽?

点评

数码管无显示,用的是共阴数码管。  详情 回复 发表于 2018-2-2 08:36
 
 
 

回复

1304

帖子

0

TA的资源

纯净的硅(高级)

6
 
K8,K12,K16按键的硬件连接关系是什么?也许你的硬件出问题了(比如K8,K12,K16这三个键在同行或同列上,行线或列线接触不好,或者类似问题)。 你是仿真出问题还是实物出问题?  仿真的话,查查连线,实物的话,用万用表量量引脚间电阻。

点评

仿真的,主贴附件是proteus8.6的仿真文件,cof文件就是用主贴的代码编译一下即可。  详情 回复 发表于 2018-2-2 08:33
 
 
 

回复

56

帖子

2

TA的资源

一粒金砂(中级)

7
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽
 
 
 

回复

56

帖子

2

TA的资源

一粒金砂(中级)

8
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽
 
 
 

回复

1304

帖子

0

TA的资源

纯净的硅(高级)

9
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽

点评

搞定了,谢谢提示,错误定位在LINE101,DEF的段码存放在0x100处,超过了BSR默认的地址范围(0x00~0xFF),把代码上移调整到地址0xFF之内,问题解决。  详情 回复 发表于 2018-2-2 14:34
 
 
 

回复

56

帖子

2

TA的资源

一粒金砂(中级)

10
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽
 
 
 

回复

1304

帖子

0

TA的资源

纯净的硅(高级)

11
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽
 
 
 

回复

6366

帖子

4901

TA的资源

版主

12
 
鏌ョ湅鏈笘鍏ㄩ儴璁ㄨ锛岃鐧诲綍鎴栬€�娉ㄥ唽
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表