OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8384|回复: 7

stm8s003写的3*4矩阵键盘程序,有点问题。

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-1-24
在线时间
0 小时
发表于 2015-1-24 16:34:51 | 显示全部楼层 |阅读模式
5金钱
程序在下面。PD3-6是行线,PA1-3是列线。按列扫描的。
结果是,刚开始那个参数key能显示第一行和第三行的。后来,不管按哪个键,都是进第一行,第n列的。
PD 的IDR,和ODR,只要输出了0x07.   IDR也是0x07的。 按键不变化。
  另外,又一次单步调试的时候,正确进了第
[mw_shl_code=c,true]void key1(void) { GPIO_Init(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6),GPIO_MODE_OUT_PP_HIGH_FAST );//行线推挽输出 GPIO_Init(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ), GPIO_MODE_IN_PU_IT );//列线上拉输入 GPIO_WriteLow(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6));//输出行线全部输出高 COLUMN_VALUE1=GPIO_ReadInputPin(GPIOA, GPIO_PIN_1); COLUMN_VALUE2=GPIO_ReadInputPin(GPIOA, GPIO_PIN_2); COLUMN_VALUE3=GPIO_ReadInputPin(GPIOA, GPIO_PIN_3); column_value=COLUMN_VALUE1+COLUMN_VALUE2+COLUMN_VALUE3; if(column_value!=0x0E)//cuo { GPIO_Write(GPIOD,0X70); ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3); ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5); ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6); row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4; key_value=row_value+column_value; switch(key_value) { case(0X76): {key=1;return;} case(0X7A): {key=2;return;} case(0X7C): {key=3;return;} } GPIO_Write(GPIOD,0X68); ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3); ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5); ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6); row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4; key_value=column_value+row_value; switch(key_value) { case(0X6E): {key=4;return;} case(0X72): {key=5;return;} case(0X74): {key=6;return;} } GPIO_Write(GPIOD,0X58); ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3); ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5); ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6); row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4; key_value=column_value+row_value; switch(key_value) { case(0X5E): {key=7;return;} case(0X62): {key=8;return;} case(0X64): {key=9;return;} } GPIO_Write(GPIOD,0X38); ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3); ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5); ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6); row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4; key_value=column_value+row_value; switch(key_value) { case(0X3E): {key=10;return;} case(0X42): {key=11;return;} case(0X44): {key=12;return;} } } }[/mw_shl_code]

二行的程序,当时IDR的值是0 1100 11 0(stm8没有PD0和PD7)

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]void key3() { GPIO_Init(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6),GPIO_MODE_OUT_PP_HIGH_FAST );//行线推挽输出 GPIO_Init(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ), GPIO_MODE_IN_PU_IT );//列线上拉输入 GPIO_WriteLow(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6));//输出行线全部输出高 COLUMN_VALUE1=GPIO_ReadInputPin(GPIOA, GPIO_PIN_1); COLUM ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-1-24
在线时间
0 小时
 楼主| 发表于 2015-1-24 16:34:52 | 显示全部楼层
[mw_shl_code=c,true]void key3() { GPIO_Init(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6),GPIO_MODE_OUT_PP_HIGH_FAST );//行线推挽输出 GPIO_Init(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ), GPIO_MODE_IN_PU_IT );//列线上拉输入 GPIO_WriteLow(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6));//输出行线全部输出高 COLUMN_VALUE1=GPIO_ReadInputPin(GPIOA, GPIO_PIN_1); COLUMN_VALUE2=GPIO_ReadInputPin(GPIOA, GPIO_PIN_2); COLUMN_VALUE3=GPIO_ReadInputPin(GPIOA, GPIO_PIN_3); column_value=COLUMN_VALUE1+COLUMN_VALUE2+COLUMN_VALUE3; if(column_value!=0x0E) { GPIO_Init(GPIOD,(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6),GPIO_MODE_IN_PU_IT);//列线上拉输入 GPIO_Init(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ),GPIO_MODE_OUT_PP_HIGH_FAST );//行线推挽输出 GPIO_WriteLow(GPIOA,(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 ));//线全部输出高 ROW_VALUE1=GPIO_ReadInputPin(GPIOD, GPIO_PIN_3); ROW_VALUE2=GPIO_ReadInputPin(GPIOD, GPIO_PIN_4); ROW_VALUE3=GPIO_ReadInputPin(GPIOD, GPIO_PIN_5); ROW_VALUE4=GPIO_ReadInputPin(GPIOD, GPIO_PIN_6); row_value=ROW_VALUE1+ROW_VALUE2+ROW_VALUE3+ROW_VALUE4; key_value=column_value+row_value; switch(key_value) { case(0x76): key=1;return; case(0x7A): key=2;return; case(0x7C): key=3;return; case(0x66): key=4;return; case(0x6A): key=5;return; case(0x6C): key=6;return; case(0x56): key=7;return; case(0x5A): key=8;return; case(0x5C): key=9;return; case(0x36): key=10;return; case(0x3A): key=11;return; case(0x3C): key=12;return; } }[/mw_shl_code]

回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-1-24 23:05:01 | 显示全部楼层
帮顶.....
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-1-24
在线时间
0 小时
 楼主| 发表于 2015-1-25 11:46:08 | 显示全部楼层
已解决…………贴出来好了。什么双向口准双向口的问题…………
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-1-26 00:03:21 | 显示全部楼层
回复【4楼】344352:
---------------------------------
谢谢分享.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2014-11-1
在线时间
2 小时
发表于 2015-4-9 16:29:14 | 显示全部楼层
回复【4楼】344352:
---------------------------------
楼主能分享整个工程不?谢谢
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-8-25 19:37:59 | 显示全部楼层
344352 发表于 2015-1-24 16:34
[mw_shl_code=c,true]void key3()
{

楼主,为什么列线配置成上拉,行线配置成推挽?
回复

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2019-5-12
在线时间
168 小时
发表于 2019-8-25 21:43:26 | 显示全部楼层
STM8有PD0和PD7
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 11:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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