[PIC®/AVR®/dsPIC®产品] AVR328P的按键操作

[复制链接]
514|3
 楼主| xuanhuanzi 发表于 2019-10-17 15:45 | 显示全部楼层 |阅读模式
AVR, se, TE, AD, pad
  1. #include <avr/io.h>
  2. #include <util/delay.h>

  3. //*******************************
  4. #define KEYPAD_PORT         PORTB
  5. #define KEYPAD_DDR           DDRB
  6. #define KEYPAD_PIN           PINB

  7. #define Segment_PORT        PORTD
  8. #define Segment_DDR        DDRD
  9. //*******************************

  10. typedef unsigned char BYTE;

  11. int key_scan(void) {
  12.         BYTE KEY;
  13.         BYTE temp_SW;

  14.         //read Port D
  15.         KEY = KEYPAD_PIN & 0x07;
  16.         //get only low 3 bits
  17.         //KEY &= 0x07;

  18.         temp_SW = 0;

  19.         if (KEY != 0x07)  //if a key is pressed
  20.                         {
  21.                 //     KEY = PIND;
  22.                 //     KEY &= 0x0f;
  23.                 //          if(KEY != 0x0f)
  24.                 //          {
  25.                 switch (KEY) {
  26.                 case 0x03: //00000011
  27.                         temp_SW = 1;
  28.                         break;
  29.                 case 0x05: //00000101
  30.                         temp_SW = 2;
  31.                         break;
  32.                 default:
  33.                         temp_SW = 3;
  34.                 }
  35.                 //          }
  36.         }

  37.         return temp_SW;
  38. }

  39. int main(void) {
  40.         BYTE bKey;
  41.         BYTE SEG[12] = { 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XD8, 0X80, 0X90,
  42.                         0X88, 0X8e };

  43.         Segment_DDR = 0xff;  // 7 segments
  44.         Segment_PORT = 0xff;

  45.         // high 4bits: output
  46.         // low 4bits: input
  47.         KEYPAD_DDR = 0xF8; 0x11111000

  48.         while (1) {
  49.                 KEYPAD_PORT = 0xF7; // only bit 6 low, 0b11110111
  50.                 //PORTD = ~_BV(2); // only bit 6 low, 0b1011
  51.                 _delay_ms(20);
  52.                 bKey = key_scan();
  53.                 if (bKey == 1)
  54.                         Segment_PORT = 3;
  55.                 else if (bKey == 2)
  56.                         Segment_PORT = 6;
  57.                 else if (bKey == 3)
  58.                         Segment_PORT = 9;

  59.                 KEYPAD_PORT = 0xE8; // only bit 5 low, 0b1101
  60.                 //PORTD = ~_BV(1); // only bit 6 low, 0b1101
  61.                 _delay_ms(20);
  62.                 bKey = key_scan();
  63.                 if (bKey == 1)
  64.                         Segment_PORT = 2;
  65.                 else if (bKey == 2)
  66.                         Segment_PORT = 5;
  67.                 else if (bKey == 3)
  68.                         Segment_PORT = 8;

  69.                 KEYPAD_PORT = 0xD8;  // only bit 4 low, 0b1110
  70.                 //PORTD = ~_BV(0); // only bit 6 low, 0b1110
  71.                 _delay_ms(20);
  72.                 bKey = key_scan();
  73.                 if (bKey == 1)
  74.                         Segment_PORT = 1;
  75.                 else if (bKey == 2)
  76.                         Segment_PORT = 4;
  77.                 else if (bKey == 3)
  78.                         Segment_PORT = 7;
  79.         }
  80. }


wanduzi 发表于 2019-10-17 16:50 | 显示全部楼层
基本的操作,入门必备
CoolSilicon 发表于 2019-10-18 09:57 | 显示全部楼层
注意防抖哦!
zljiu 发表于 2019-11-13 13:06 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部