找回密码
 立即注册
查看: 401|回复: 2

请教STC8H8K64U 用了I2C, P2.4/P2.5后其他P2口不正常问题

[复制链接]

该用户从未签到

3

主题

4

回帖

37

积分

新手上路

积分
37
发表于 2023-6-16 18:06:54 | 显示全部楼层 |阅读模式
业余爱好,STC8H8K64U, 32脚的,P2口配置为准双向,另外I2C用了P2.4、P2.5,
P26、P27分别接了个五向开关的2个脚,上电设置为1,用万用表检测这两个I/O口一直为低电平,请问该怎么配置?
P0口相同配置,P00、P01、P02也是接五向开关,P0口就正常,单机双击长按检测均正常,就P26、P27一直是低电平,外接上拉也不行。

1:main.c
  1. #include "GPIO.h"
  2. #include "I2C.h"
  3. #include "timer.h"
  4. #include "key.h"
  5. #include "delay.h"
  6. #include "ssd1312.h"
  7. #include "bmp.h"
  8. bit T_10ms = 0;
  9. void        GPIO_config(void)
  10. {
  11.         GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
  12.         GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
  13.         GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  14.         GPIO_Inilize(GPIO_P0,&GPIO_InitStructure);        //初始化
  15.         GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
  16.         GPIO_InitStructure.Mode = GPIO_PullUp;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  17.         GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);        //初始化
  18. }
  19. /****************  I2C初始化函数 *****************/
  20. void        I2C_config(void)
  21. {
  22.         I2C_InitTypeDef                I2C_InitStructure;
  23.         I2C_InitStructure.I2C_Mode      = I2C_Mode_Master;        //主从选择   I2C_Mode_Master, I2C_Mode_Slave
  24.         I2C_InitStructure.I2C_Enable    = ENABLE;                                                //I2C功能使能,   ENABLE, DISABLE
  25.         I2C_InitStructure.I2C_MS_WDTA   = DISABLE;                                        //主机使能自动发送,  ENABLE, DISABLE
  26.         I2C_InitStructure.I2C_MS_Interrupt = DISABLE;                                //使能主机模式中断,  ENABLE, DISABLE
  27.         I2C_InitStructure.I2C_Speed     = 32;                                                                //总线速度=Fosc/2/(Speed*2+4),      0~63
  28.         I2C_InitStructure.I2C_IoUse     = I2C_P24_P25;                        //IO口切换   I2C_P14_P15, I2C_P24_P25, I2C_P33_P32
  29.         I2C_Init(&I2C_InitStructure);
  30. }
  31. void        Timer_config(void)
  32. {
  33.         TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
  34.         TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
  35.         TIM_InitStructure.TIM_Priority  = Priority_0;                        //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  36.         TIM_InitStructure.TIM_Interrupt = ENABLE;                                        //中断是否允许,   ENABLE或DISABLE
  37.         TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
  38.         TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
  39.         TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (100*12));                //中断频率, 100次/秒
  40.         TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
  41.         Timer_Inilize(Timer3,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
  42. }
  43. void Settings(void)
  44. {
  45.         OLED_Clear();
  46.         OLED_ShowChinese(48, 3, 0, 16);
  47.         OLED_ShowChinese(64, 3, 1, 16);
  48. }
  49. void main()
  50. {        
  51.         u8 key;
  52. //        GPIO_config();
  53.         P0M0 = 0x00;
  54.         P0M1 = 0x00;
  55.         P2M0 = 0x00;
  56.         P2M1 = 0x00;
  57.         I2C_config();
  58.         OLED_Init();
  59.         Timer_config();
  60.         OLED_WR_Byte(0xA5, OLED_CMD); //全亮
  61.         OLED_Clear();
  62.         OLED_WR_Byte(0xA4, OLED_CMD); //正常模式
  63.         OLED_DrawBMP(30, 0, 69, 64, BMP1);
  64.         delay_ms(1000);
  65.         OLED_Clear();
  66.         EA = 1;
  67.         KA=1;KB=1;KC=1;KD=1;KP=1;
  68.         while(1)
  69.         {
  70.                 if(T_10ms)
  71.                 {
  72.                         T_10ms = 0;
  73.                         key = key_read();
  74.                         if(key == L_key) OLED_ShowString(32, 3, "L_KEY", 16);
  75.                         else if(key == D_key) OLED_ShowString(32, 3, "D_KEY", 16);
  76.                         else if(key == S_key) OLED_ShowString(32, 3, "S_KEY", 16);
  77.                 }
  78.         }
  79. }
复制代码
2: Key
  1. #define KA P26
  2. #define KB P27
  3. #define KC P00
  4. #define KD P01
  5. #define KP P02
复制代码
3:原理图
屏幕截图 2023-06-16 175403.png


回复 送花

使用道具 举报

该用户从未签到

552

主题

9496

回帖

1万

积分

管理员

积分
14067
发表于 2023-6-17 21:56:29 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

4

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2023-6-18 18:20:40 | 显示全部楼层
神农鼎 发表于 2023-6-17 21:56
建议你直接用仿真,单步跟踪进去看下程序哪有问题

STC8H8K64U自带硬件USB直接仿真步骤 - 编译器/仿真器/IS ...

非常感谢,问题找到了,五向开关AB两个通道直接跟地连通了,明明装好的时候都测试过的,不知道是不是我按的太用力了…
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-18 19:46 , Processed in 0.059556 second(s), 39 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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