[讨论] GCC转换为类成员的指针的另一方法

黑衣人   2008-2-14 15:14 楼主
GCC转换为类成员的指针问题: 今天找到另一种方法,使用memcpy_P而不用pgm_read_word,将其转换为类成员的指针,测试通过。 #include <avr/io.h> #include <avr/pgmspace.h> #include <compat/ina90.h> class KeyObj ; typedef prog_void (KeyObj::* PFV)(void); #define KeyCP (1) #define KeyCLK (2) #define KeyData (3) class KeyObj { private: unsigned char KeyVal; unsigned int KeyTest[8]; public: unsigned char KeyCount; KeyObj(void); void KeyInit(void); void SetKeyVal(unsigned char keyval); void SetKeyCount(unsigned char count); unsigned char GetKeyVal(void);// void KeyCommandExec(unsigned char); static const PFV KeyCommandTab[3][5]; void Exec(void); void Key00(void); ... void Key24(void); }; inline unsigned char KeyObj::GetKeyVal(void) { unsigned char KeyVal = 0; PORTC &= ~(1 << KeyCP); _NOP();//?? PORTC |= (1 << KeyCP); for(int i = 8; i > 0; i --) { KeyVal <<= 1; PORTC &= ~(1 << KeyCLK); _NOP();//?? if (!(PINC & (1 << KeyData))) KeyVal ++; PORTC |= (1 << KeyCLK); } return KeyVal;//?????0 } inline void KeyObj::Exec(void) { static const unsigned char KeyTab[8] PROGMEM = { 0b10000000, 0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001 }; KeyCount &= 0x07; KeyVal = GetKeyVal(); if (KeyVal & pgm_read_byte(&KeyTab[KeyCount])) { if (KeyTest[KeyCount] < 1200) { KeyTest[KeyCount] ++; if (KeyTest[KeyCount] == 2) { KeyCommandExec(1); } } else { KeyTest[KeyCount] = 2; KeyCommandExec(2); } } else { if (KeyTest[KeyCount] >= 2) { KeyCommandExec(0); } else { } KeyTest[KeyCount] = 0; } KeyCount ++; KeyCount &= 0x07; } void KeyObj::SetKeyVal(unsigned char keyval) { KeyVal = keyval; } void KeyObj::SetKeyCount(unsigned char count) { KeyCount = count; } const PFV KeyObj::KeyCommandTab[3][5] PROGMEM= { {&KeyObj::Key00, &KeyObj::Key01, &KeyObj::Key02, &KeyObj::Key03, &KeyObj::Key04}, //??????? {&KeyObj::Key10, &KeyObj::Key11, &KeyObj::Key12, &KeyObj::Key13, &KeyObj::Key14}, //?????? {&KeyObj::Key20, &KeyObj::Key21, &KeyObj::Key22, &KeyObj::Key23, &KeyObj::Key24} //??????? }; void KeyObj::KeyCommandExec(unsigned char mode) { KeyCount &= 0x07; if (KeyCount <= 4) { PFV f; memcpy_P(&f, &(KeyObj::KeyCommandTab[(int)mode][(int)KeyCount]), sizeof(PFV)); (this->*f)(); } } void KeyObj::Key00(void) { } ... void KeyObj::Key24(void) { }

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复