打印

在DSP2812上的"零耗时键盘"演示C++程序

[复制链接]
6322|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-4-25 12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*-----------------------------------------------------
      在DSP2812上的"零耗时键盘"演示C++程序
本演示程序在Study-2812增强版上通过运行测试

菜农HotPower@126.com  2008.4.25  于西安大雁塔菜地
------------------------------------------------------*/
#include "main.h"

class SystemObj System;
class TimerObj Timer;
class LcdObj Lcd;
class KeyboardObj Keyboard;

int main(void)
{
    Lcd.SetDisplayPos(0, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示12");
    Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示34");
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示56");
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示78");

    EALLOW;
//    PieCtrlRegs.PIEACK.all = 0xFFFF;//PIEACK_GROUP1;
    PieCtrlRegs.PIEACK.bit.ACK7 = 1;
    EDIS;
    
    EINT;   // Enable Global interrupt INTM
    ERTM;    // Enable Global realtime interrupt DBGM
    for(;;)
    {
       asm(" nop");
    // Reset the watchdog counter
       KickDog();
    }
}


相关链接:http://blog.**/hotpower/109373/message.aspx#

相关帖子

沙发
hotpower|  楼主 | 2008-4-25 12:32 | 只看该作者

keyboard.cpp

#include "keyboard.h"

KeyboardObj::KeyboardObj(void)
{
    Init();
}

void KeyboardObj::Init(void)
{
    for (int i = 0; i < sizeof(PressCount); i ++)
    {
        PressCount = 0;
    }
    Count = 0;
}

void KeyboardObj::Exec(void)
{
typedef void (KeyboardObj::*FunctionPtr)(void);//函数指针
static const FunctionPtr KeyboardCommandTab[3][KeyboardNumbers] =
{
    {
        &KeyboardObj::Key01,
        &KeyboardObj::Key02,
        &KeyboardObj::Key03,
        &KeyboardObj::Key04,
        &KeyboardObj::Key05,
        &KeyboardObj::Key06,
        &KeyboardObj::Key07,
        &KeyboardObj::Key08
    },//放键表
    {
        &KeyboardObj::Key11,
        &KeyboardObj::Key12,
        &KeyboardObj::Key13,
        &KeyboardObj::Key14,
        &KeyboardObj::Key15,
        &KeyboardObj::Key16,
        &KeyboardObj::Key17,
        &KeyboardObj::Key18
    },//短压表
    {
        &KeyboardObj::Key21,
        &KeyboardObj::Key22,
        &KeyboardObj::Key23,
        &KeyboardObj::Key24,
        &KeyboardObj::Key25,
        &KeyboardObj::Key26,
        &KeyboardObj::Key27,
        &KeyboardObj::Key28
    } //长压表
};
unsigned char KeyCount;
    Count %= KeyboardNumbers;
    KeyCount = PressCount[Count];//取压键次数
    if (Scan() == Count + 1)//有键压下
    {
        KeyCount ++;//压键计数    
        if (KeyCount >= KeyboardPushTimes)
        {
            if (KeyCount == KeyboardPushTimes)//短压键
            {
//                System.BeepOn();
                (::Keyboard.*KeyboardCommandTab[1][Count])();
            }
            if (KeyCount == KeyboardLongPushTimes)//长压键
            {
                (::Keyboard.*KeyboardCommandTab[2][Count])();
                KeyCount = KeyboardPushTimes;    
            }
        }
    }
    else//无键压下
    {
        if (KeyCount > 0)//以前有键压下
        {
            if (KeyCount > KeyboardPushTimes)    
            {
                KeyCount = KeyboardPushTimes;    
            }
            else
            {
                KeyCount --;//放键计数
                if (KeyCount == 0)//键释放
                {
                    System.BeepOff();
                    (::Keyboard.*KeyboardCommandTab[0][Count])();
                }    
            }
        }
        else
        {
            KeyCount = 0;
        }
    }
    PressCount[Count] = KeyCount;
    Count ++;
    Count %= KeyboardNumbers;
}

unsigned char KeyboardObj::Scan(void)
{
volatile unsigned char KeyVal = 0;
    Count %= KeyboardNumbers;
    KeyVal = LedKeyRegs;
    switch (Count)
    {
        case 0:
            if (!(KeyVal & ConstKEY1))
            {
                KeyVal = Count + 1;
            }
            break;
        case 1:
            if (!(KeyVal & ConstKEY2))
            {
                KeyVal = Count + 1;
            }
            break;
        case 2:
            if (!(KeyVal & ConstKEY3))
            {
                KeyVal = Count + 1;
            }
            break;
        case 3:
            if (!(KeyVal & ConstKEY4))
            {
                KeyVal = Count + 1;
            }
            break;
        case 4:
            if (!(KeyVal & ConstKEY5))
            {
                KeyVal = Count + 1;
            }
            break;
        case 5:
            if (!(KeyVal & ConstKEY6))
            {
                KeyVal = Count + 1;
            }
            break;
        case 6:
            if (!(KeyVal & ConstKEY7))
            {
                KeyVal = Count + 1;
            }
            break;
        case 7:
            if (!(KeyVal & ConstKEY8))
            {
                KeyVal = Count + 1;
            }
            break;
    }
    return KeyVal;
}

//KEY1放键事件处理
void KeyboardObj::Key01(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY1键释放事件");
}

//KEY2放键事件处理
void KeyboardObj::Key02(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY2键释放事件");
}

//KEY3放键事件处理
void KeyboardObj::Key03(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY3键释放事件");
}

//KEY4放键事件处理
void KeyboardObj::Key04(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY4键释放事件");
}

//KEY5放键事件处理
void KeyboardObj::Key05(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY5键释放事件");
}

//KEY6放键事件处理
void KeyboardObj::Key06(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY6键释放事件");
}

//KEY7放键事件处理
void KeyboardObj::Key07(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY7键释放事件");
}

//KEY8放键事件处理
void KeyboardObj::Key08(void)
{
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("KEY8键释放事件");
}

//KEY1压键事件处理
void KeyboardObj::Key11(void)
{
//特别注意菜农的组合键用法,可以看出"零耗时键盘"的非典之处
    if (PressCount[7] >= KeyboardPushTimes)//KEY8已先压下
    {
        Key8_Key1();//执行KEY8_KEY1组合键事件
    }
    else
    {
//           System.BeepOn();
        Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
        Lcd.Display("KEY1键单击事件");
    }
}

//KEY2压键事件处理
void KeyboardObj::Key12(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY2键单击事件");
}

//KEY3压键事件处理
void KeyboardObj::Key13(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY3键单击事件");
}

//KEY4压键事件处理
void KeyboardObj::Key14(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY4键单击事件");
}


//KEY5压键事件处理
void KeyboardObj::Key15(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY5键单击事件");
}


//KEY6压键事件处理
void KeyboardObj::Key16(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY6键单击事件");
}


//KEY7压键事件处理
void KeyboardObj::Key17(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY7键单击事件");
}

//KEY8压键事件处理
void KeyboardObj::Key18(void)
{
//特别注意菜农的组合键用法,可以看出"零耗时键盘"的非典之处
    if (PressCount[0] >= KeyboardPushTimes)//KEY1已先压下
    {
        Key1_Key8();//执行KEY1_KEY8组合键事件
    }
    else
    {
//           System.BeepOn();
        Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
        Lcd.Display("KEY8键单击事件");
    }
}

//KEY1长压键事件处理
void KeyboardObj::Key21(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY1键长压事件");
}

//KEY2长压键事件处理
void KeyboardObj::Key22(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY2键长压事件");
}

//KEY3长压键事件处理
void KeyboardObj::Key23(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY3键长压事件");
}

//KEY4长压键事件处理
void KeyboardObj::Key24(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY4键长压事件");
}

//KEY5长压键事件处理
void KeyboardObj::Key25(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY5键长压事件");
}

//KEY6长压键事件处理
void KeyboardObj::Key26(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY6键长压事件");
}

//KEY7长压键事件处理
void KeyboardObj::Key27(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY7键长压事件");
}

//KEY8长压键事件处理
void KeyboardObj::Key28(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY8键长压事件");
}

//KEY1-KEY8组合键事件处理
void KeyboardObj::Key1_Key8(void)
{
    Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端
    Lcd.Display("KEY1KEY8键事件");
}

//KEY8-KEY1组合键事件处理
void KeyboardObj::Key8_Key1(void)
{
    Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端
    Lcd.Display("KEY8KEY1键事件");
}

使用特权

评论回复
板凳
snakeemail| | 2008-4-25 14:58 | 只看该作者

有没有流程图,思路也要看呀

使用特权

评论回复
地板
zealane| | 2008-4-25 15:27 | 只看该作者

哈哈,学习。。。。。

使用特权

评论回复
5
zealane| | 2008-4-25 15:28 | 只看该作者

这么好的帖子也不穿个裤子?

使用特权

评论回复
6
hotpower|  楼主 | 2008-4-25 17:44 | 只看该作者

哈哈~~~山野村夫怎敢穿裤子进城???~~~

使用特权

评论回复
7
涛行九天| | 2008-5-1 18:04 | 只看该作者

大叔又发威了

好久没过来看,支持一下

使用特权

评论回复
8
fengyeu| | 2008-5-1 18:44 | 只看该作者

顶 大叔

顶 大叔

使用特权

评论回复
9
fengyeu| | 2008-5-1 18:46 | 只看该作者

请问大叔以后会倒塌arm不?

请问大叔以后会倒塌arm不?

使用特权

评论回复
10
hotpower|  楼主 | 2008-5-1 21:10 | 只看该作者

哈哈~~对ARM的感冒已过~~~

实际学什么都一样----只要**就会成功~~~

使用特权

评论回复
11
tjsheep| | 2008-5-1 23:35 | 只看该作者

原创发裤子……

使用特权

评论回复
12
hotpower|  楼主 | 2008-5-2 00:57 | 只看该作者

哈哈~~~夏天来了,穿裤子太热~~~

使用特权

评论回复
13
涛行九天| | 2008-5-2 04:35 | 只看该作者

大叔的努力精神让人佩服

使用特权

评论回复
14
zealane| | 2008-5-2 13:50 | 只看该作者

re

大叔又用dsp,又用c++。。。。。。
大叔应该改天出个研究c++,c在dsp上的效率分析。

使用特权

评论回复
15
hotpower|  楼主 | 2008-5-3 13:28 | 只看该作者

我认为只是启动代码可能不如C,运行起来完全一样没什么区别

使用特权

评论回复
16
tjsheep| | 2008-5-3 22:51 | 只看该作者

我倾向于用c,呵呵

如果c++做到c的效率,那就简化成c了,反过来,我也同意c++很适合做系统,可是dsp我觉得不能称之为系统,最多就是dsp模块

使用特权

评论回复
17
hotpower|  楼主 | 2008-5-3 22:53 | 只看该作者

哈哈~~~在AVR/ARM/DSP5402上用习惯了~~~

使用特权

评论回复
18
zealane| | 2008-5-4 08:52 | 只看该作者

我的看法

如果是控制,就没必要用dsp。
如果是信号处理,那就得考虑效率了。c++不知道合适不合适

使用特权

评论回复
19
hotpower|  楼主 | 2008-5-4 23:07 | 只看该作者

DSP做为控制确实没必要~~~信号处理估计C都慢~~~

使用特权

评论回复
20
limit_myl| | 2008-5-7 09:31 | 只看该作者

是啊,我用DSP都用的是汇编,C C++都来不及的...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝