请选择 进入手机版 | 继续访问电脑版
查看: 2601|回复: 2

【S08P闯关赛经验分享】(三)S08P-Lite KBI 按键

[复制链接]
  • TA的每日心情
    擦汗
    2023-12-24 19:50
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    7

    主题

    95

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    374
    最后登录
    2023-12-24
    发表于 2020-6-23 23:53:22 | 显示全部楼层 |阅读模式
    本帖最后由 xyzml 于 2020-6-24 00:05 编辑

    今天SW2按着按着突然没了反应,一开始还以为是程序瞎改改废了,最后想到是不是按键坏了,结果拆下来一测SW2果然挂了

    按键.jpg

    于是从其他地方拆下来一个按键换了上去,OK
    既然如此,今天就来盘一下KPI按键中断吧

    S08PT60A共有两组16个KBI引脚
    BIT  :  7   6   5   4   3   2   1   0
    KBI0:B3 B2  B1 B0 A3  A2 A1 A0
    KBI1:D7 D6 D5 D4 D3 D2 D1 D0
    S08P-Lite 按键SW2、SW3分别对应D4、D5

    KBI寄存器一共有三个: SC、PE、ES
    (1)SC 状态控制寄存器
    [3:0] KBF KBACK KBIE KBMOD
    KBF: 中断标志位,只读,检测到中断请求时为1
    KBACK:写1可清空标志位
    KBIE:KBI中断使能,写1使能,写0禁用
    KBMOD:写0 KBI检测模式为边沿触发,写1为边沿+水平触发


    其他位是保留位

    (2)PE 中断引脚使能寄存器,哪一位写1对应引脚就使能,写0则屏蔽

    (3)ES 中断引脚边沿寄存器,哪一位写1对应引脚上升沿触发,反之下降沿触发


    上程序:
    相应按键键值的宏定义

    1. #define Button2_Is_Pressed()        !(buttonStates & (1<<4))
    2. #define Button3_Is_Pressed()        !(buttonStates & (1<<5))
    复制代码
    KBI 按键初始化
    1. void Button_Init(void)        
    2. {        
    3.     //KBI1^4=PD4=SW2   KBI1^5=PD5=SW3
    4.         KBI1_SC = 0x00;
    5.     KBI1_ES &= ((0<<4)&(0<<5));        //下降沿触发     
    6.     KBI1_PE |= ((1<<4)|(1<<5)); //开启KPI中断
    7.     KBI1_SC = 0x06;                                //清空标志位  开启KPI 边沿触发

    8. }
    复制代码
    KBI 按键中断(根据参考例程修改,我设置了一个变量dang,SW2按下dang+1,SW3按下dang-1)
    1. interrupt  VectorNumber_Vkbi1 void  Button_ISR(void)
    2. {
    3.     KBI1_SC_KBACK = 1;                     //清除标志位

    4.     KBI1_PE & =  ((0<<4)&(0<<5));     // 禁用 KBI pin
    5.     PORT_PTDIE |= (1<<4)|(1<<5);    //使能GPIO SW2 SW3为输入
    6.     asm(nop);
    7.     asm(nop);
    8.     buttonStates = PORT_PTDD;        //读键值

    9.     if(Button2_Is_Pressed())
    10.     {
    11.         dang++;
    12.     }
    13.     else if (Button3_Is_Pressed())
    14.     {
    15.         dang--;
    16.     }
    17.     else
    18.     {

    19.     }/ 恢复 KBI pin 的功能
    20.     KBI1_PE =((1<<4)|(1<<5)); /* 使能 KBI pin */
    21.     KBI1_SC_KBACK = 1;
    22. }
    复制代码
    为了显示直观,将dang值用LED显示出来,8档用8个LED,丢在while中
    1. while (1)
    2.     {                  
    3.             if(dang>8||dang<0)
    4.                 {
    5.                         if(dang>8) dang=8;
    6.                         else dang=0;               
    7.                 }
    8.             LED_Switch(dang);         
    9.     }
    复制代码
    实际效果如下
    KBI中断.gif
    参考资料:
    [1]MC9S08PT60芯片手册
    [2]MC9S08PT60数据手册
    [3]MC9S08PT60官方教程
    [4]官方例程S08P_LITE_SAMPLES
    [5]S08P_LITE说明书


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-12-24 19:50
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    7

    主题

    95

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    374
    最后登录
    2023-12-24
     楼主| 发表于 2020-6-24 00:08:12 | 显示全部楼层
    本人能力有限,欢迎大家对存在的不足进行批评指正
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    2020-7-20
    发表于 2020-7-20 17:16:21 | 显示全部楼层
    学习了~~
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-4-27 18:57 , Processed in 0.115581 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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