首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

挑战思维 看你能说几句

挑战思维 看你能说几句

编程思维挑战!!!

“按下P1^4,LED闪烁时间加快,按下时间越长,闪烁频率越快。
释放开关,频率固定停在当前值闪烁。这才是编程思维挑战“

首先声明:对于这里的多数人,这当然不是什么编程思维挑战,只不过有人一定要这么说,为了说明这个论坛水平,我这个中低手做了这么一段C代码在visual c++ 的演示,供辉阳的心等初学者参考。我相信有更多的人能做出比这更好的代码。因此,敬请某些人不必再怀疑本论坛众人的智商。


class CLEDTestDlg : public CDialog
{
struct LEDStatus
{
int frequency;
int counter;
bool status;
}
m_LEDStatus;

enum Keyboard
{
NOKEY,
LEFTKEY,
RIGHTKEY
} KEYBOARD;

struct KeyStatus
{
Keyboard key;
Keyboard pressedKey;
int keyState;
int keyTimer;
bool keyEventHandled;
}
m_KeyStatus;

CStatic LED1;   //模仿LED 闪烁。

**********************************************************************
BOOL CLEDTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
this->SetTimer(1, 20, NULL); //用定时器模仿定时中断。
m_LEDStatus.frequency = 50; //1 second;
m_LEDStatus.counter = 0;
m_KeyStatus.key = NOKEY;
m_KeyStatus.pressedKey = NOKEY;
m_KeyStatus.keyState = 0;
return TRUE;
}

void CLEDTestDlg::OnTimer(UINT_PTR nIDEvent)  //定时中断
{
BlinkLED();
DetectKeyPress();
}

void CLEDTestDlg::BlinkLED()  
{
if (++m_LEDStatus.counter >= m_LEDStatus.frequency) {
m_LEDStatus.counter = 0;
LED1.SetWindowText(m_LEDStatus.status ? " " : "*"); //Led 闪烁。
m_LEDStatus.status = !m_LEDStatus.status;
}

if (m_KeyStatus.key != NOKEY && !m_KeyStatus.keyEventHandled) {
m_KeyStatus.keyEventHandled = true;
if (m_KeyStatus.key == LEFTKEY) {
m_LEDStatus.frequency -= 10;
if (m_LEDStatus.frequency <= 0)
m_LEDStatus.frequency = 0;
}
else if (m_KeyStatus.key == RIGHTKEY) {
m_LEDStatus.frequency += 10;
if (m_LEDStatus.frequency >= 500)
m_LEDStatus.frequency = 500;
}
}
}


void CLEDTestDlg:etectKeyPress() //模仿键盘处理过程
{
switch (m_KeyStatus.keyState) {
case 0:
if (m_KeyStatus.pressedKey != NOKEY)
m_KeyStatus.keyState++; //去抖动
break;
case 1:
if (m_KeyStatus.pressedKey == NOKEY)
m_KeyStatus.keyState--;
else {
m_KeyStatus.key = m_KeyStatus.pressedKey;
m_KeyStatus.keyEventHandled = false;
m_KeyStatus.keyTimer = 100; //2 seconds
m_KeyStatus.keyState++;
}
break;
case 2:
if (m_KeyStatus.key != m_KeyStatus.pressedKey) {
m_KeyStatus.keyState = 0;
m_KeyStatus.key = NOKEY;
}
else {
if (--m_KeyStatus.keyTimer == 0) {
m_KeyStatus.keyTimer = 50; // 1 second
m_KeyStatus.keyEventHandled = false;
}
}
break;
default:
m_KeyStatus.keyState = 0;
}
}


//处理鼠标左右键的按下
BOOL CLEDTestDlg:reTranslateMessage(MSG* pMsg)
{
switch (pMsg->message) {
case WM_LBUTTONDOWN:
m_KeyStatus.pressedKey = LEFTKEY;
break;
case WM_RBUTTONDOWN:
m_KeyStatus.pressedKey = RIGHTKEY;
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
m_KeyStatus.pressedKey = NOKEY;
break;
}
return CDialog:reTranslateMessage(pMsg);
}

欢迎讨论。

支持一下!

有意义吗?

hehe

楼主写的是?

请问是做基础开发还是应用开发的,嵌入式

我不是很懂想学学,功能测试的

提供RoHS/WEEE/PoHS/PAHs/ PFOS/卤素/邻苯二甲酸酯/ W18检测服务:

PONY谱尼测试集团是检测服务网络遍及全球的大型跨国集团,检测报告得到美国、英国、德国等62个国家和地区互认,具有国际公信力。集团全球总部位于中国北京,下设伦敦、香港、北京、上海、深圳、天津、青岛、宁波共8家子公司,及电子、食品、环境、日用消费品、汽车、海外等6个独立事业部,国内外共拥有31个实验室及41个分支机构,员工人数近2000人。

PONY谱尼测试集团是国际RoHS检测标准IEC 62321唯一中方起草单位,可为电子产品提供RoHS/WEEE/PoHS/PAHs/PFOS/卤素/邻苯二甲酸酯/W18等多项专业检测服务。欲了解更多信息请登陆http://www.ponytestsz.com,或拨打集团深圳实验室电话0755-26050909、总部实验室电话010-82618116、上海实验室电话021-64851999、青岛实验室电话0532-88706866或全国服务热线4008-195-688和客服人员联系。

返回列表