打印

编程思维挑战!!!

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
21
highgear|  楼主 | 2009-5-12 22:52 | 只看该作者 回帖奖励 |倒序浏览

C51的代码已完成,一个良好的结构是多么重要啊

detectKey 甚至不用改动

struct LEDStatus
{
   int          frequency;
   int             counter;
   char            bitMask;
}
m_LEDStatus[LEDCOUNT];


void BlinkLED()
{
    char i;
    for (i=0; i<LEDCOUNT; i++) {
        if (++m_LEDStatus.counter >= m_LEDStatus.frequency) {
            LEDPORT ^= m_LEDStatus.bitMask;
            m_LEDStatus.counter = 0;
        }
    }

    if (m_KeyStatus.key != NOKEY && m_KeyStatus.keyEventHandled==false) {
        i = (m_KeyStatus.key - 1) >> 1;  // 0: no key; 1 to 16: 16 keys
        m_KeyStatus.keyEventHandled = true;
        if ((m_KeyStatus.key & 1) != 0) {
            if (m_LEDStatus.frequency > MILLISECOND(50) )
                m_LEDStatus.frequency -= MILLISECOND(50);

        }
        else {
            if (m_LEDStatus.frequency < MILLISECOND(5000))
                m_LEDStatus.frequency += MILLISECOND(50);
        }
    }
}

小衲先公布一段LED控制C51代码, 凭冷x, 刘xx一伙的水平根本看不懂.

注:以上“一伙“均指冷x, 刘xx,wjx1952小团伙,不涉及他人。

使用特权

评论回复
22
highgear|  楼主 | 2009-5-13 01:53 | 只看该作者

VB 代码完毕, 真正的思维挑战

转换到VB,才真的是思维挑战,真不容易啊。

Const LEDCOUNT = 7
Dim m_LEDStatus(LEDCOUNT) As CLEDStatus
Dim m_KeyStatus As New CKeyboard

Private Sub Form_Load()
    For i = 0 To LEDCOUNT
        Set m_LEDStatus(i) = New CLEDStatus
        Set m_LEDStatus(i).LED = LED(i)
    Next
End Sub

Private Sub Timer1_Timer()
    BlinkLED
    m_KeyStatus.DetectKey
    ChangeFrequency
End Sub

Private Sub BlinkLED()
    For i = 0 To LEDCOUNT
        Call m_LEDStatus(i).Blink
    Next
End Sub

Private Sub ChangeFrequency()
    If (m_KeyStatus.Key <> 0) And (Not m_KeyStatus.KeyEventHandled) Then
        m_KeyStatus.KeyEventHandled = True
        i = (m_KeyStatus.Key - 1)  2
        If (m_KeyStatus.Key And 1) <> 0 Then
            m_LEDStatus(i).DecreaseFrequnecy
        Else
            m_LEDStatus(i).IncreaseFrequnecy
        End If
    End If
End Sub


*******************************************************************
Public Frequency As Integer, Counter As Integer
Public State As Boolean
Public LED As Label

Const MaxFreq = 10000
Const MinFreq = 100
Const TICK = 20

Private Sub Class_Initialize()
    Frequency = 50
    Counter = 0
End Sub

Public Sub Blink()
    Counter = Counter + 1
    If Counter > Frequency Then
        Counter = 0
        LED.Caption = IIf(State, " ", "*")
        State = Not State
    End If
End Sub

Public Sub IncreaseFrequnecy()
    If Frequency < MaxFreq / TICK Then
        Frequency = Frequency + 100 / TICK
    End If
End Sub


Public Sub DecreaseFrequnecy()
    If Frequency > MinFreq / TICK Then
        Frequency = Frequency - 100 / TICK
    End If
End Sub

使用特权

评论回复
23
songbangyan| | 2009-5-13 16:45 | 只看该作者

楼主似乎不是硬件程序员

使用特权

评论回复
24
inter_zhou| | 2009-5-13 17:13 | 只看该作者

偷偷的打听下

楼主是做什么职位的?在哪个城市?工资多少?

使用特权

评论回复
25
jiyiche| | 2009-5-13 17:45 | 只看该作者

搞单片机的会C++的多不多?

使用特权

评论回复
26
yewuyi| | 2009-5-13 17:56 | 只看该作者

江湖恩仇录续集开拍

使用特权

评论回复
27
ljm810010| | 2009-5-13 18:11 | 只看该作者

我是来打酱油的....

使用特权

评论回复
28
hq_y| | 2009-5-13 18:25 | 只看该作者

路过。。。

使用特权

评论回复
29
badbird1234| | 2009-5-13 18:57 | 只看该作者

虽然题目有点弱

但感觉写的还行
等待刘前辈中
学习中
也鼓励一下LZ

使用特权

评论回复
30
highgear|  楼主 | 2009-5-13 20:39 | 只看该作者

谢谢各位朋友的捧场。

我与wxjxxxx, 冷x, 刘xx并无江湖恩仇,只不过它们几乎把这里热心的前辈们谩骂诬蔑了个遍,仅仅是因为不明底细解答了它们“拿手“问题,或是指出了他们的错误,无知。

inter_zhou: 我愧为人和地(R&D)堂首座,工资不便透露,还算满意。不过真得要说赚钱,不能纯做技术,要抬头看路。

jiyiche:就技术而言,mcu 的“钱“途很窄,因为门槛太低,技术含金量不高,尽量往高端走,这不可避免的要学习c++. c++ 不仅仅是一门语言,更重要的是会完全改变你的软件设计方式,一旦精通(不仅仅是掌握),任何高级语言都不在话下了。

songbangyan:硬件程序员?很有趣的称呼,不过现在的我有时还得设计电路,只是再也不想画PCB了,那真不是凡人能做的工作。

badbird1234:可冷x, 刘xx硬说是思维挑战,我不过来证明这是小儿科而已。一叶知秋,它们不可能做的比这更简洁,水平更高。这里高手如云,我相信众人的眼光。几百个数码管的显示屏都做过,还能被几个LED 灯难住?

使用特权

评论回复
31
highgear|  楼主 | 2009-5-13 21:26 | 只看该作者

c#代码完毕。

公布主程序。把8个Label放入一个groupbox里,这样程序可以很简单 :-)


namespace LEDTest
{
    public partial class Form1 : Form
    {
        CLEDStatus[] m_LEDs;
        CKEYStatus m_KeyStatus;

        const int LEDCOUNT = 8;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            m_KeyStatus = new CKEYStatus();
            m_LEDs = new CLEDStatus[LEDCOUNT];
            for (int i = 0; i < m_LEDs.Length; i++) {
                m_LEDs = new CLEDStatus();
                m_LEDs.LED = groupLED.Controls;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Blink();
            ChangeFrequency();
        }

        private void Blink()
        {
            for (int i = 0; i < m_LEDs.Length; i++) {
                m_LEDs.Blink();
            }
        }

        private void ChangeFrequency()
        {
            m_KeyStatus.DetectKey();
            if (m_KeyStatus.Key != CKEYStatus.NOKEY && !m_KeyStatus.KeyEventHandled) {
                m_KeyStatus.KeyEventHandled = true;
                int i = (m_KeyStatus.Key - 1) >> 1;
                if ((m_KeyStatus.Key & 1) != 0)
                    m_LEDs.DecreaseFrequency();
                else
                    m_LEDs.IncreaseFrequency();
            }
        }

    }
}

这次闪烁使用了背景色:
LED.BackColor = State ? Color.Green : SystemColors.Control;

使用特权

评论回复
32
冷漠| | 2009-5-13 22:11 | 只看该作者

有些论坛事件了解了就释然了:

2008年以前,论坛上有2个“超级大国”,——HOTPOWER和农民讲习所长。2人今年都50出头,修炼几十年,水平之高可以想象。

2人性格迥然不同:HOT心胸大气一点,所长心胸小一点。表现在:HOT一贯低调,从不招惹评价所长,所长却正相反:只要HOT出现,所长必然发帖取笑之:笑HOT“匠气十足”,“不过是技巧胜于他人。”等等等等,其实明眼人都看得出,所长言外之意是在以贬低HOT来抬高自己。所长是从事PC纯软件的,HOT是真正嵌入式单片机专家,软硬通吃。当然PC专业软件比所长弱。于是所长言论:
“在国外只有软件才吃得开,搞硬件的人饭碗都难找。”
“论坛上只有俺才是登堂入室的专家。”

由于所长在软件方面确实还是有所建树,所以谁也没资格取笑什么。我们至少和所长差得远。

2008年发生了几件事,让所长失了脸面,HOT却挣足了面子。所长是自尊心敏感的人,自觉无脸面和HOT继续同在21IC相容,出于尊严,退出论坛了。
于是,2个超级大国的冷战结束了。农民讲习所解体了。

这几件事的始作俑者,与学长1952直接关系。

最明显的一件事就是学长3,000元酬金发起的那道书上抄来的“脑残题”——“一道题终结OS非OS之争”。历经2个月,最终结果是,HOTPOWER拔得头筹:除获得1,000元题目酬金外,还获得其他4,000元我公司赞助(奖励)。其他还有3人各获得500元酬金。1952标称HOTPOWER获得1,0000元高额奖金。大做**,其实谁听了最不舒服?

在这件个人出资有偿求助的事例中,最急于表现、最后又丢了脸面的就是讲习所长:所长不知道嵌入式系统OS的节拍是可以配置的!从10ms到1S无所谓,只要程序员认为合理。他以为是PC机OS,节拍不允许用户配置。于是为此羞辱1952“小儿科”“1秒钟节拍早崩溃了”。——“顶级高手”不懂装懂啦。最后让网友修正概念,无言以对,这真是多年来第一次让学生教训老师。1952确实曾对所长反唇相讥,事后检讨自己“别人做了十分,我才回敬他一分。”

   比较起来,HOT并没有完全写出程序,只是把概念讲清了。HOT从来不在自己弱势的地方装腔作势充高手。这就是2人的差别。HOT当之无愧获得头奖。
   这是所长第一次自寻其辱......

(待续)

使用特权

评论回复
33
highgear|  楼主 | 2009-5-13 22:56 | 只看该作者

冷漠还唧唧歪歪干什么?做个程序对你真的是思维挑战么?

1)你们能还是不能做这个 “8 个LED,16个key“的程序,这是你们自己提出来挑战的,我不过加大了一点难度而已。我已经都做完了, 从C51, VC++, VB到C#.

2)我不关心你们与所长的恩怨,所长的气量也不是你们可以比拟的,不要用下流无耻的谎言去诬蔑中伤值得尊敬的热心前辈们。你们就算拿出1个亿,宣布火星人做出来,那道题还是脑残题. 不服气,你们可以发主贴再次声明“无一人做出“,有没有这个胆量?

3)我一直说,技术这东西,懂就是懂,不懂就是不懂。(char) i = (char) j 你冷漠自以为得计,洋洋洒洒一通胡说,什么“进化“,什么“c# 我保证“ 之类,呵呵,结果呢?

总之,不要使用你们的胡搅蛮缠,转移视线的无耻伎俩。
别废话了,把代码拿出来!!!!!
能还是不能?????

使用特权

评论回复
34
badbird1234| | 2009-5-14 07:18 | 只看该作者

我刚来不久

to冷漠 
不知道以前很多事情
那道题我看过可我没有发现HOTPOWER的解答代码呀
我也思考了有一阵时间
不知道能否开贴给大家讲讲原理呀
并发问题我真的想知道解呀(我想的解是双核处理(共享时钟节拍)可是我的想法是狗屁不通)

使用特权

评论回复
35
badbird1234| | 2009-5-14 08:05 | 只看该作者

还有highgear程序别老在抽象中飘着呀

还有highgear程序别老在抽象中飘着呀
既然是用51搞
就的给出具体底层硬件驱动呀(把算法固化呀)
让我这样的菜鸟学一下呀

使用特权

评论回复
36
冷漠| | 2009-5-14 08:33 | 只看该作者

highgear,算了吧。至今还欠我1,000元一年了装蒜不知道了。

你以为学长出国了,1,000元钱就可以不还了?!美得你。16个灯,4X4这种小儿科的题目也拿出来跟人赌?

  大堂主也不知道羞愧,想父子联手,甚至调动整个讲习所的人一起,欺负刘前辈这样一个学机械的初学者。

  好!这道题,咱陪你玩定了。我拍3,000元。你什么R&D大堂主敢拍多少?曾经那么红火的农民讲习所如今这么贫穷潦倒。50岁老所长带领一帮门徒跟我一个人玩?

    俺说的还真没错,一到工作日,highgear果然是神气来了,狐假虎威,父子联手,在所长的“罩笼”下,拍了那么多年马,终于混上大堂主啦。

  怎么上周末那么蔫,唉,这一向威风的大堂主竟然输给了刘前辈这样学机械的半路初学者。

   这几天突然又这么高产,C++,C#,VC,BC一块上了。
   写得再多有什么用啊? 写得再多也是给刘前辈当老二。前辈的话“损”的妙极了:

       “高手还真是后发制人耶。”

哈哈!别人先创新思想,highgear跟在后面盗版做老二,“思维挑战”都变成自己的创新啦。

大堂主如今还在画板子?手下一个人也没有?光杆堂主啊。画了那么多年板子,自己竟然手里没有一块51工作板?没有就买一块吧,不过80元而已,半天的工资都不要,就这一毛不拔的吝啬鬼,80元捂在钱袋子里不放?穷疯了。

   指望你拍3,000元跟前辈赌?骗谁玩呢。

    先把欠我的钱还清再说吧。否则,你这种信用度为负数的人,谁敢和你玩?谁爱和你玩!



使用特权

评论回复
37
有风| | 2009-5-14 08:44 | 只看该作者

。。。

这年头,
1000文还耿耿于怀?

现在的情势,
人家分分钟几十万出入了.

使用特权

评论回复
38
冷漠| | 2009-5-14 08:47 | 只看该作者

35楼,敬佩。我答应你。

HOT当时几句话我就知道他是内行。其实当时并不情愿让他参与的。他拿走这5,000元真是太容易了。最近才知道,OS设计方法他都想了28年了。我真是白送给他钱么。我当时是事先有答案的。

    highgear、所长想了多少年?HOTPOWER脑残?全世界的人听了这话都笑了。

给我一个信箱,我把答案给你。我还就留着取笑那些不懂装懂的“高手”。要是highgear这类人都能看懂题目,都能做出个方案来,学长恐怕要准备30万酬金啦。

CMY19831@126.com

使用特权

评论回复
39
badbird1234| | 2009-5-14 10:17 | 只看该作者

感激涕零

感激涕零
linss1018@163.com
我的邮箱
感谢分享

使用特权

评论回复
40
ljm810010| | 2009-5-14 11:27 | 只看该作者

我是菜鸟,我什么也不懂,对21楼程序一些疑问。

要求0.2Hz到20Hz,应该取反时间为2500ms到25ms,21楼程序中的MILLISECOND(50),MILLISECOND(5000)是否导至0.1Hz到10Hz?

下面这一段
 for (i=0; i<LEDCOUNT; i++) {
        if (++m_LEDStatus.counter >= m_LEDStatus.frequency) {
            LEDPORT ^= m_LEDStatus.bitMask;
            m_LEDStatus.counter = 0;
        }
    }
由于8个LED有可能存在8个同时切换,也可能只有一个切换,存在参差。在闪烁频率高时,可能导致频率抖动较大,特别是MCU主频不高时更明显。当然仅作批示没什么影响,如果是电机驱动或其它,可能有意想不到的效果。

m_LEDStatus.bitMask就没必要了吧,占用了8个内存,可以只定义一个临时变量在循环内移位即可,毕竟是针对51,内存不丰裕。

以上纯属菜鸟之见,如有不当请指正。

使用特权

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

本版积分规则