2898|0

367

帖子

0

TA的资源

裸片初长成(高级)

楼主
 

GCC转换为类成员的指针的另一方法 [复制链接]

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) { }
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表