这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » PnIN 请问为何PnIN的值总在变?

共2条 1/1 1 跳转至

PnIN 请问为何PnIN的值总在变?

院士
2006-09-17 18:14:16     打赏
PnIN 请问为何PnIN的值总在变?



关键词: 请问     为何     值总    

院士
2006-12-22 22:43:00     打赏
2楼
问 键盘为9线输出,4行4列1公共端。我将公共端接电阻接地
P1口前4位行输出,后四位读入,P2口悬空
仿真是一切正常的

但在实际运行时,发现P1IN和P2IN不停在变化,即使根本没有对P1口、P2口操作,Pnout正常。P1IN的变化是乱的,P2IN的变化还有点规律(总是0,1,3)
使得后来的按键判别无法进行。换了一块芯片也一样。


不知道可能是什么原因,请大虾们帮忙 1: P1口前4位行输出,后四位读入
这样好像不行阿!P1口要么设置为输出要么设置为输入,(通过P1DIR)
看你的意思是P1口既做输出又做输入了。
你改改电路吧,让P1口做的前4个口做输出,后4个悬空。(这时P1DIR=0XFF)
P2口的前4个输入,后4个接地。(P2DIR=0X00)
这样试试吧! 2: TO:小梁大虾
P1口按理应该能够部分作为输入部分输出的吧.
我用P1口作为中断输入,P1口没用的管脚设为输出没什么问题啊.
我想应该是程序有问题,外部硬件的干扰可能性大点 3: 应该是程序的问题 你把程序贴出来 4: 非常谢谢各位大虾,把所有的外接器件都去掉,之剩下键盘,用TI的板,做了几个尝试,好像是外部原因
发现:1.在不外接键盘的时候,运行正常,无按键按下,KEYJUDGE中C的状态正常
2.外接键盘就不行,PIN1的状态在KEYJUDGE的最后一步,有时不对。程序执行中,P1IN不断变化
3.P1口只外接导线,悬空,不挂键盘上去,P1IN都会出现乱的?这点实在是不知道怎么理解?

程序如下:
#include <MSP430x14x.h> ;头文件


COM EQU 210h ;指令放在210h
STATE EQU 211h ;LCD 的状态
DAT EQU 212h ;
PAGENUM EQU 213h
ROW EQU 214h
LINE EQU 215h

ORG 01100h
RESET mov.w #00A00h,SP
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupTB mov.w #TBSSEL0+TBCLR+TBIE,&TBCTL ; ACLK, clear TAB, interrupt
SetupCx mov.w #OUTMOD_4+CCIE,&TBCCTL0 ; TBCCR0 interrupt enabled

Mainloop
;P1口前4位输出,后4位输入
clr.b &P1SEL
MOV.B #0FH,&P1DIR

JUDGELOOP: CALL #KEYJUDGE
JNC JUDGELOOP
CALL #DELAY10MS
CALL #KEYJUDGE
JNC JUDGELOOP
CALL #KEYCODE ;将键码值存放在R5中
PUSH R5
KEYLOOP1: CALL #KEYJUDGE
JC KEYLOOP1
POP R5
; .........
JMP Mainloop


;判断按键有无
KEYJUDGE MOV.B #0FFH,&P1DIR
MOV.B #0,&P1OUT ;try?
MOV.B #0FH,&P1DIR
MOV.B #0FH,&P1OUT ;输出行线高电平
BIT.B #0F0H,&P1IN ;输出4条;列线,判断是否有高
RET ;若有,C=1

;获取键值,放到R5中
KEYCODE MOV.B #0FH,&P1DIR ;低4输出,高4读入
MOV #0,R5
MOV #1,R8 ;扫描信号的输出
KEYCODELOOP: MOV.B R8,&P1OUT
BIT.B #10H,&P1IN
JC KEYCODE1 ;测试P1.4
BIT.B #20H,&P1IN
JC KEYCODE2 ;测试P1.5
BIT.B #40H,&P1IN
JC KEYCODE3 ;测试P1.6
BIT.B #80H,&P1IN
JC KEYCODE4 ;测试P1.7
RLA.B R8
ADD.B #04,R5
CMP.B #16,R5
JNZ KEYCODELOOP
RET
KEYCODE1 ADD #0,R5
RET
KEYCODE2 ADD #1,R5
RET
KEYCODE3 ADD #2,R5
RET
KEYCODE4 ADD #3,R5


DELAY10MS POP R15
MOV #2666,R15
DELAYLOOP: DEC R15
JNZ DELAYLOOP
POP R15
RET
ORG 0FFFEh
DW RESET
END ;程序结束 5: 引用: 6: 挂了长线即使悬空也会不稳定,一般都是加上拉或下拉电阻。
参考slaue11.pdf,P6-4。 7: 引用: 8: 谢谢版主和“乡巴佬”大虾

请问 slaue11.pdf在哪里有下载的?光盘里没有找到 9: 作输入口的4条线应该上拉,输出口不用上拉,也不用下拉。
平时输出低电平,有中断后,依次输出高电平,看中断口是否变成高,但要有10到20ms的去抖。 10: 430的slaa,slau等应用文档在ti或lierda 的光盘里都有。
至于430的i/o,可以对每一根口线进行单独操作。不管是输入,输出还是中断,没有限制。
如果要低功耗设计,在键盘的区抖动软件设计中最好不要延时,具体的方法可以参考《单片机与嵌入式系统》2001年第七期P63 11: 如果是输入线悬空的话,那么输入会不稳定,我在做键盘的时候就碰到了这个问题。没按键都会有中断,后来行列线互换一下,即让其接个电阻接地就行了。不知道你的情况是不是这样子。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]