搜索
bottom↓
回复: 54

基于马潮老师修改的按键状态机(包括矩阵键盘)keilC51

[复制链接]

出0入0汤圆

发表于 2011-10-21 20:24:53 | 显示全部楼层 |阅读模式
我是新手,不要嘲笑我,希望这些例程对正在受“天祥”大叔的按键子程序残害的人有所帮助吧
希望大家都能用上状态机。
谢谢马老师的例程。
==================================================================================
独立按键(简单的状态机,无连_发)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P0^0;
void delay()
{
        uint i,j;
        for(i=100;i>0;i--)
        for(j=118;j>0;j--);
}
uchar readkey()
{
        static keystate=0,keytime=0;
        uchar keypress,keyreturn=0;
        keypress=P1;
        switch(keystate)
        {
                case 0:
                if (keypress!=0xff)
                {
                        keystate=1;
                       
                }
                break;

                case 1:
                if (keypress!=0xff)
                {
                        keystate=2;
                        keytime=0;
                }
                else
                keystate=0;
                break;

                case 2:
                if (keypress==0xff)
                {
                        keystate=0;
                        keyreturn=1;
                }
                else if (++keytime>=20000)
                {
                        keystate=3;
                        keytime=0;
                        keyreturn=2;
                }
                break;

                case 3:
                if (keypress==0xff)
                {
                        keystate=0;
                }
                else
                {
                        if (++keytime>=10000)
                        {
                                keytime=0;
                                keyreturn=2;
                        }
                }
                break;
        }
        return keyreturn;
}

void main()
{
        uchar k;
        while(1)
        {
                switch(readkey())
                {
                        case 1:
                        led=!led;
                        break;

                        case 2:
                        P0=0xfe;
                        for(k=0;k<8;k++)
                        {
                                delay();
                                P0=P0<<1|0X01;       
                        }
                        break;
                       
                }
        }
}

注:该子程序最好在中断设置标志位,10ms进入检测一次即可。本例程没有,为了方便。

=================================================================================================
矩阵键盘状态机(4×4,无连_发)
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define nokey 255
#define keymask 0x0f
sbit cs1=P1^0;
sbit cs2=P1^1;
sbit clk=P1^2;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar num,timecount=0;
bit timeok;
void delay_us(uint us)
{
        while(--us);
}
//==============================延时子程序==================================
void delay_ms(uint ms)
{
        uint i,j;
        for(i=ms;i>0;i--)
        for(j=118;j>0;j--);
}
//==============================显示子程序=================================
void display(void)
{
        P2=tab[num];
        cs1=0;
        clk=0;clk=1;
        cs1=1;

        P2=0xfe;
        cs2=0;
        clk=0;clk=1;
        cs2=1;
        delay_ms(1);
}
//============================矩阵键盘按键状态机========================
uchar readkeyboard()
{
        static uchar keystate=0,keyvalue,keyline;
        uchar keyreturn=nokey,i;
        switch(keystate)
        {
                case 0:
                keyline=0x10;
                for (i=1;i<=4;i++)
                {
                        P0=~keyline;
                        P0=~keyline;
                        keyvalue=keymask&P0;
                        if (keyvalue==keymask)
                        {
                                keyline<<=1;
                        }
                        else
                        {
                                keystate++;
                                break;
                        }
                }
                break;

                case 1:
                if (keyvalue==(keymask&P0))
                {
                        switch(keyline|keyvalue)
                        {
                                case 0x87:keyreturn=0;break;
                                case 0x8b:keyreturn=1;break;
                                case 0x8d:keyreturn=2;break;
                                case 0x8e:keyreturn=3;break;

                                case 0x47:keyreturn=4;break;
                                case 0x4b:keyreturn=5;break;
                                case 0x4d:keyreturn=6;break;
                                case 0x4e:keyreturn=7;break;

                                case 0x27:keyreturn=8;break;
                                case 0x2b:keyreturn=9;break;
                                case 0x2d:keyreturn=10;break;
                                case 0x2e:keyreturn=11;break;

                                case 0x17:keyreturn=12;break;
                                case 0x1b:keyreturn=13;break;
                                case 0x1d:keyreturn=14;break;
                                case 0x1e:keyreturn=15;break;
                        }
                        keystate++;
                }

                else
                keystate--;
                break;

                case 2:
                P0=0x0f;
                P0=0x0f;
                if ((keymask&P0)==keymask)
                {
                        keystate=0;
                }
                break;
        }
        return keyreturn;
}
//==============================主程序==========================
void main()
{
        uchar keytemp;
        TMOD=0x01;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {
                if (timeok)
                {        keytemp=readkeyboard();
                        if (keytemp!=nokey)
                        {
                                num=keytemp;
                        }
                }
        }
}
//=================================中断服务子程序====================
void timer0() interrupt 1
{
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        display();
        if (++timecount>=5)
        {
                timecount=0;
                timeok=1;       
        }       
}

================================================================================
以上都是自己写的程序,希望不要喷我,我就是想让初学者的朋友们使用上状态机~

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2011-10-21 20:28:36 | 显示全部楼层
其中矩阵键盘的键码希望朋友们自己去写


我的硬件是这样接的
      P0.3 P0.2 P0.1 P0.0

P0.7---|----|----|----|----
P0.6---|----|----|----|----
P0.5---|----|----|----|----
P0.4---|----|----|----|----

出0入0汤圆

发表于 2011-10-21 20:49:18 | 显示全部楼层
回复【楼主位】zhaoxukiller 搁浅的夜
-----------------------------------------------------------------------
“希望这些例程对正在受“天祥”大叔的按键子程序残害的人有所帮助吧”
你这是在鄙视郭天祥啊 他的教程是面对初学者的,人家怎么也是大师级别的人物 怎么能这样说人家呢 你不会自己变通说别人残害你
在说了反转法本质上也是扫描法的一种 你先知道扫描了 就很容易理解反转法了

就像你开始学LED  不还是先这样写
          while(1)  //大循环
        {
                led1=1;     //点亮小灯
                delay(500); //延时500毫秒
                led1 =0;        //熄灭小灯
                delay(500); //延时500毫秒
        }
然后才
      while(1) //大循环
        {
                led1=~led1;  //led状态取反               
                delay(500); //延时500毫秒
        }
再到中断
     void T0_time() interrupt 1         
     {
             unsigned char num;
             TH0=(65536-50000)/256;
             TL0=(65536-50000)%256;
             num++;
             if(num>=10)    //500ms
             {
                  num=0;
                  led1=~led1;  //led状态取反
             }  
      }

出0入0汤圆

发表于 2011-10-21 20:58:05 | 显示全部楼层
回复【1楼】zhaoxukiller 搁浅的夜
-----------------------------------------------------------------------

回复【楼主位】zhaoxukiller 搁浅的夜
-----------------------------------------------------------------------

扫描法 如果按键不多 用它也慢不了多少 你如果要求很高 那么你上面写的显示函数一样不行 里面带有delay 你要放中断写
void t0()interrupt 1 using 1  /*中断程序负责显示b的值 */
{
     unsigned char a1=0,a2=0,a3=0,a4=0;        //临时变量
     static int k=0;
    /*数码管扫描显示*/
      a1=b/1000;/*取b的千位*/
      a2=b%1000/100;/*取b的百位*/
      a3=b%100/10;/*取b的十位*/
      a4=b%10;/*取b的个位*/
    //p0与数码管的段连接,每中断一次点亮一位数码管,4位数码管分别被循环轮流点亮
      if     (k==0){shu1=1;shu2=0;shu3=0;shu4=0;P0=yima[a1];}
      else if(k==1){shu1=0;shu2=1;shu3=0;shu4=0;P0=yima[a2];}
      else if(k==2){shu1=0;shu2=0;shu3=1;shu4=0;P0=yima[a3];}
      else if(k==3){shu1=0;shu2=0;shu3=0;shu4=1;P0=yima[a4];}
      k++;
      if(k>3)k=0;

      TH0=240;//扫描速度
}

出0入0汤圆

发表于 2011-10-21 20:58:10 | 显示全部楼层
楼主,能加注释吗?有些地方对初学者来说有点高深,希望你能帮助更多的论坛网友们。

出0入0汤圆

发表于 2011-10-21 21:03:03 | 显示全部楼层
有些语句不是很明白,例如:

1:
static keystate=0,keytime=0;中的static是什么意思?能简单的说明一下吗?
能否用uint keystate=0,keytime=0;代替?

2:bit timeok;中的bit是什么意思?可否用uchar代替?

3:static uchar keystate=0,keyvalue,keyline; 中的static uchar又代表什么意思呢?

出0入0汤圆

 楼主| 发表于 2011-10-21 21:21:36 | 显示全部楼层
static 静态局部变量定义
简单的说就是跳出该子程序后变量值不变,类似于全局变量。因为是按键状态的识别,所以不希望跳出子程序后变量的值清零。

bit 是位定义  简单的说该定义后的变量只有两种状态:“0”“1”

uchar是#define uchar unsigned char 的意思

出0入0汤圆

发表于 2011-10-21 21:37:25 | 显示全部楼层
回复【6楼】zhaoxukiller 搁浅的夜
static 静态局部变量定义
简单的说就是跳出该子程序后变量值不变,类似于全局变量。因为是按键状态的识别,所以不希望跳出子程序后变量的值清零。
bit 是位定义  简单的说该定义后的变量只有两种状态:“0”“1”
uchar是#define uchar unsigned char 的意思
-----------------------------------------------------------------------

1:
bit 明白了,也就是说它的值是两种状态0和1,如果把100这个数据赋给它,它的值也只会是1,是这样理解吗?呵呵

2:
static ...类似于全局变量...,我似乎明白了一半,那为什么不直接在程序最前面直接定义为全局变量啊,全局变量跳出子程序后变量值也不变啊!

呵呵,希望楼主再指教一二!

出0入0汤圆

发表于 2011-10-21 21:39:53 | 显示全部楼层
楼主说一下,独立按键的编程的思路嘛,毕竟都是没有注释的代码,初学者看起来有点乱乱找不到头绪的感觉。呵呵

出0入0汤圆

发表于 2011-10-21 21:59:30 | 显示全部楼层
马甲

出0入0汤圆

发表于 2011-10-21 22:01:28 | 显示全部楼层
回复【楼主位】zhaoxukiller  搁浅的夜
-----------------------------------------------------------------------

请问一下。dat = (bit)(0x80 & 0x90); 结果是不是等于1呀。如果用到bit是不是非0为1呀。

出0入0汤圆

发表于 2011-10-21 22:23:10 | 显示全部楼层
回复【楼主位】zhaoxukiller 搁浅的夜
-----------------------------------------------------------------------
扫描法怎么了 不就多10几个毫秒吗 一样用
//////////////////////////////////////////////////////////////////////////////////
//扫描法:逐行扫描查询 一般用在按键比较少的场合
int keyscan()
{
       unsigned char k k_temp;
       P1=0xf0;      //低位置0,准备查询按键
       k=P1;         //取得当前P1口状态
       if(k!=0xf0)   //如果有变化则表示有按键按下
       {
              delay(10);    //延迟 消抖
              k_temp=p1;
              if(k==k_temp)  //确实有键按下
              {
                     k=0xfe;
                     do         //循环扫描每一行
                     {
                            p1=k;
                            if(k!=p1)
                            {
                                  switch(P1)  //判断按键 并返回键值
                                  {
                                     //第1行
                                     case 0x7e:{return 0; break;}
                                     case 0xbe:{return 1; break;}
                                     case 0xde:{return 2; break;}
                                     case 0xee:{return 3; break;}
                                     //第2行
                                     case 0x7d:{return 4; break;}
                                     case 0xbd:{return 5; break;}
                                     case 0xdd:{return 6; break;}
                                     case 0xed:{return 7; break;}
                                     //第3行
                                     case 0x7b:{return 8; break;}
                                     case 0xbb:{return 9; break;}
                                     case 0xdb:{return 10;break;}
                                     case 0xeb:{return 11;break;}
                                     //第4行
                                     case 0x77:{return 12;break;}
                                     case 0xb7:{return 13;break;}
                                     case 0xd7:{return 14;break;}
                                     case 0xe7:{return 15;break;}
                                  }                                                                                 
                            }  
                            k=_crol_(k,1);   //移位 进入下一行扫描               
                     }
                     while(k!=0xef); //超过列范围 退出扫描                        
              }           
       }
}
////////////////////////////////////////////////////////////////////////////////
//线反转法 :只需2步便可获得按键位置
unsigned int  keyboar()/*线反转法 */
{
      static unsigned int a=0;
      unsigned char a1=0,b1=0;
    /*行线为输入线,列线为输出线 */
      v1=v2=v3=v4=0;
      h1=h2=h3=h4=1;
      if(P2<0xf0)/*检查行是否有按键按下 */
      {
             delayms(10);
             if(P2<0xf0)
             {
                  /*行线为输入线,列线为输出线 */
                  v1=v2=v3=v4=0;
                  h1=h2=h3=h4=1;
                  a1=P2;
                  /*行线为输出线,列线为输入线 */
                  h1=h2=h3=h4=0;
                  v1=v2=v3=v4=1;
                  b1=P2;
         
                  a=a1|b1;
             }   
       }     
       if     (a==0xe7){return 7; }
       else if(a==0xeb){return 8; }
       else if(a==0xed){return 9; }
       else if(a==0xee){return 13;}               
      
       else if(a==0xd7){return 4; }
       else if(a==0xdb){return 5; }
       else if(a==0xdd){return 6; }
       else if(a==0xde){return 12;}   
      
       else if(a==0xb7){return 1; }
       else if(a==0xbb){return 2; }
       else if(a==0xbd){return 3; }
       else if(a==0xbe){return 11;}  
      
       else if(a==0x77){return 0; }
       else if(a==0x7b){return 15;}
       else if(a==0x7d){return 16;}
       else if(a==0x7e){return 10;}   
      
       else return 17;
                  
}

///////////////////////////////////////////////////////////////////////////////
中断法:只有按键按下才发出中断 扫描函数写在中断里  用在复杂的系统 或者对实时性要求比较高的场合
void t0()interrupt 0
{
      key=keyscan();
}

出0入0汤圆

发表于 2011-10-21 22:24:47 | 显示全部楼层
我了个个去 回复了那么多还是审核状态。。。。

出0入0汤圆

发表于 2011-10-21 22:27:38 | 显示全部楼层
还有LZ你贴上来的程序 没有层次感 你就不能写好再贴上来吗 或者现在编辑一下也行啊 现在程序很难看懂的 知道吗

出0入0汤圆

发表于 2011-10-22 04:54:40 | 显示全部楼层
回复【9楼】edaworld 笨笨小熊
-----------------------------------------------------------------------

我的审核还没有通过

出0入0汤圆

发表于 2011-10-22 08:46:39 | 显示全部楼层
回复【楼主位】zhaoxukiller 搁浅的夜
-----------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
看这2句 就知道你也是郭天祥的弟子 竟然这么骂老师
你真以为人家不会你这种写法啊 人家写给初学者看才那么写的

你写的这程序是给初学者看的 没有层次感没有注释 很多初学者看不懂你知道吗?你看上面有几楼在问你问题了
你如果不骂人 我是不会喷你的

附郭天祥介绍:
       郭天祥(1983.10- ),老家新疆伊宁,原哈尔滨工程大学学生,后接触单片机,现在已经成为单片机领域的一个企业家,名下有天祥电子网站,其最大成就之一是开设了十天学会单片机系列课程并录制出来,现在网络上广泛流传,有《十天学会51单片机视频教程》、《十天学会PIC单片机视频教程》、《十天学会AVR单片机视频教程》,可以说这三种单片机类型几乎涵盖了市面上近90%的单片机产品,这些视频教程为广大单片机爱好者提供了最好的学习材料,另外还有关于ARM、嵌入式系统的视频教程,因其名誉广传,被广大学生敬称为郭天祥老师。

出0入0汤圆

发表于 2011-10-22 09:45:38 | 显示全部楼层
回复【7楼】Ilove51andAVR
-----------------------------------------------------------------------
1)bit位变量 就是标志位
“按键什么时候按下了?你不知道 所以做个标志bit=1, 只要bit=1 就代表按键按下了 bit=0就是没有按下”
  其他地方一样用 比如闹钟定时到100响 你可以开始定义bit=0 当时间走到100时,令bit=1 代表闹钟时间到了 你只要判断bit的状态就行了  if(bit==1) {闹钟时间到了,执行这里}
LZ的程序是 如果10ms时间到了 bit=1;代表如果bit=1说明10ms到了


2)static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
    1. 静态局部变量
    它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它函数使用, 当再次进入该函数时, 将保存上次的
结果。其它与局部变量一样。
    2. 静态全程变量
    静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。
    它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。

   3.静态变量只是在第一次使用的时候初始化,如果是全局变量,则加static与否结果相同。如果是局部变量,则其他模块访问不到。

   4.静态函数只有在本编译文件中才能被调用。其他c文件则不能调用。因此在其他文件中可以申明同名函数,而不互相影响。

   5.全局变量使用方便,但副作用的隐患巨大。如果你定义一个全局变量,我就可以在任何地方修改。OS一般是写成库函数提供的,
就是自己用编成.LIB也比在项目中添一堆源文件要方便。问题是,你怎么告诉用户你用了那些全局变量,让他们别改动呢?或你自己
要怎样才能记住那么多用过的全局变量,绞尽脑汁起个不同的名字呢?设为静态全局变量,就是告诉编译器,这个变量是全局的但只
在此文件中有效,如果我在文件外定义同名变量不会影响文件内的全局变量。这样,一旦作成库后,用户和自己就可以随便使用,没有任何限制了。

出0入0汤圆

发表于 2011-10-22 10:38:36 | 显示全部楼层
是啊,楼主加个注释啊,没有仔细看得完,就是那个矩阵的按键中keyline = 0x10,直接右移...菜鸟看着很是吃力,呵呵

出0入0汤圆

发表于 2011-10-22 10:46:54 | 显示全部楼层
关于static 举个例子:
//int k=0; //在函数外部定义 int k=0 中断程序一样可以正常显示

void t0()interrupt 1 using 1  /*中断程序负责显示b的值 */
{
      unsigned char a1=0,a2=0,a3=0,a4=0;        //临时变量
      static int k=0;
     // int k=0;    //不能这里这里定义成int,否则只显示K=0一位;无法进入K=1。可以在函数外部定义 int k=0;
     //静态变量与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它函数使用, 当再次进入该函数时, 将保存上 次的
     //结果。其它与局部变量一样。
     // static int k=0 : 开始k=0, 运行if(k==0){} k++;退出中断时k=1保存 变量不消失 再次进入从else if(k==1)开始
     // int k=0 : 开始k=0,运行if(k==0){} k++;  退出中断时k=1;变量丢失 再次进入中断又重新开始int k=0; 所以始终执行if(k==0)语句
      
      a1=b/1000;/*取b的千位*/
      a2=b%1000/100;/*取b的百位*/
      a3=b%100/10;/*取b的十位*/
      a4=b%10;/*取b的个位*/
                
      if     (k==0){shu1=1;shu2=0;shu3=0;shu4=0;P0=yima[a4];}
      else if(k==1){shu1=0;shu2=1;shu3=0;shu4=0;P0=yima[a3];}
      else if(k==2){shu1=0;shu2=0;shu3=1;shu4=0;P0=yima[a2];}
      else if(k==3){shu1=0;shu2=0;shu3=0;shu4=1;P0=yima[a1];}
      k++;
      if(k>3)k=0;

      TH0=240;//扫描速度
}

出0入0汤圆

发表于 2011-10-22 10:50:34 | 显示全部楼层
我了了个去 回复这么多 还是审核状态 没人看见啊。。。。

出0入0汤圆

发表于 2011-10-22 12:36:00 | 显示全部楼层
在说下中断法(这么审核还没通过呢 俺回复那么多技术的帖子了 积分都40了)
//中断法:
//中断法是将键盘扫描程序放在单片机中断服务程序的方法
//对于扫描法和线反转法 其都是利用扫描查询的方式来获得按键信息,这样CPU 总是要不断的扫描键盘,
//占用很多CPU处理时间;而中断法则是只有当按键按下的时候才触发中断,进而扫描键值;
//因此,采用中断法进行键盘扫描设计可以提高CPU工作效率,特别适合于复杂的系统 或者对实时性要求比较高的场合

//硬件接法:键盘4根行线分别引出连接到一个具有4输入的与门, 输出端连接单片机的外部中断脚#INT0(P3.2)
//系统初始化时,将键盘的输出端口全部置低电平0;当有按键按下的时候,#INT0将变为低电平,向CPU发出中断请求,
//CPU 响应中断并进入中断服务程序;在中断服务程序按照查询方法来获得按键位置
#include<reg51.h>
#include<intrins.h>

int keyscan();  //键盘扫描函数
int key;

void main()
{            
      IT0=1;   //下降沿触发
      EX0=1;   // 开外部中断0
      EA=1;    //开总中断
      P1=0XFF;
      while(1)  //用户程序段
      {
         
      }
}

void t0() interrupt 0   //外部中断程序 有键按下进入
{
      key=keyscan(); //获取键值
}

出0入0汤圆

发表于 2011-10-22 12:47:57 | 显示全部楼层
可恶的延时函数!天祥的弊端

出0入0汤圆

发表于 2011-10-22 14:19:19 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-22 22:29:05 | 显示全部楼层
回复【19楼】yao1
关于static 举个例子:
-----------------------------------------------------------------------

终于明白了static 的用法了,原来在退出函数体时,其值可以保留,第二次进入该函数体时,其值可以再次被利用,太好了!
非常感谢yao1网友,谢谢!呵呵

原来还可以这样子用的,以后我的程序可就方便多了,不必老是全局定义变量。OK!

出0入0汤圆

发表于 2011-10-22 23:38:07 | 显示全部楼层
呵呵 MARK!
其实郭天祥讲的是很不错的,像我大一寒假刚学的时候完全没有任何基础,全靠他的视频我才给弄明白的,
人家讲的只有过是给初学者的,
那时刚开始候我们连编程语言都还没学,哪来的什么编程思想,哪来的什么状态机呀

出0入0汤圆

发表于 2011-10-23 01:45:30 | 显示全部楼层
楼主有没有想过,如果程序长了,你的程序数码管显示可能会出现亮度不均匀的情况?
咱再变通一下吧,数码管显示也用定时器用状态机?

出0入0汤圆

发表于 2011-10-23 17:54:35 | 显示全部楼层
郭天翔的入门我觉得不错!

出0入0汤圆

发表于 2011-11-7 15:04:24 | 显示全部楼层
楼主能不能把完整的仿真贴上来,关于那个矩阵按键的接法我无法理解,按理P0口是不能直接这样接的,除非有上拉。另外这个程序用到了数码管吧,数码管好像也不是直接接在IO上的吧,是通过573的吧

出0入0汤圆

发表于 2011-11-7 15:12:51 | 显示全部楼层
学习了,重新学习单片机。。。。

出0入0汤圆

发表于 2011-11-8 22:08:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-8 23:32:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-9 10:17:33 | 显示全部楼层
谢谢各位大侠,学习了。也感谢阿莫论坛。

出0入0汤圆

发表于 2011-11-22 11:31:35 | 显示全部楼层
好多高手哦,学习了,谢谢各位

出0入0汤圆

发表于 2011-11-22 20:44:22 | 显示全部楼层
学习!

出0入0汤圆

发表于 2011-11-30 16:53:03 | 显示全部楼层
回复【35楼】lixupeng
-----------------------------------------------------------------------

学习

出0入0汤圆

发表于 2012-3-6 17:15:01 | 显示全部楼层
matk it

出0入0汤圆

发表于 2012-3-6 17:19:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-6 17:41:49 | 显示全部楼层
多做,多学,多交流讨论..少批论,啥方法自己最合用,就是好方法,熟了再求优化,也许将来回头看自己写的根本是狗屁,那恭喜代表你进步了....

出0入0汤圆

发表于 2012-3-25 20:24:53 | 显示全部楼层
状态机,mark

出0入0汤圆

发表于 2012-3-25 21:27:50 | 显示全部楼层
不错,mark。

出0入0汤圆

发表于 2012-6-26 10:35:56 | 显示全部楼层
还是状态机好点~要不用DELAY会让整个系统的实时性变的很差

出0入0汤圆

发表于 2012-7-20 23:27:25 | 显示全部楼层
Ilove51andAVR 发表于 2011-10-21 21:39
楼主说一下,独立按键的编程的思路嘛,毕竟都是没有注释的代码,初学者看起来有点乱乱找不到头绪的感觉。呵 ...

   我也是初学者,给你一份资料,同样是讲的按键状态机,并有程序流程图!很好的!

出0入0汤圆

发表于 2012-7-20 23:31:48 | 显示全部楼层
yao1 发表于 2011-10-22 12:36
在说下中断法(这么审核还没通过呢 俺回复那么多技术的帖子了 积分都40了)
//中断法:
//中断法是将键盘扫 ...

  您应该直接发一个该方面主题的贴

出0入0汤圆

发表于 2012-10-10 20:33:32 | 显示全部楼层
beijinggood2008 发表于 2012-7-20 23:27
我也是初学者,给你一份资料,同样是讲的按键状态机,并有程序流程图!很好的! ...

Can  you  give  me this a material?  very very thank you   

出0入0汤圆

发表于 2012-10-11 18:45:09 | 显示全部楼层
zhenglingo 发表于 2012-10-10 20:33
Can  you  give  me this a material?  very very thank you

http://www.amobbs.com/thread-3985870-1-1.html   看看这个贴!认真看后一定会有收获的!

出0入0汤圆

发表于 2012-10-11 20:27:27 | 显示全部楼层
难怪中国的学术氛围那么烂, 对老师和前辈都不懂得尊重, 一点皮毛就鄙视启蒙的老师伯们, 这样的国家值得尊敬和惧怕吗?!

出0入0汤圆

发表于 2012-10-11 23:50:53 | 显示全部楼层
记号…………

出0入0汤圆

发表于 2013-8-4 01:21:36 | 显示全部楼层
mark                        

出0入0汤圆

发表于 2013-8-4 08:05:45 来自手机 | 显示全部楼层
郭 那本书确实没有说到这种方法
我在其他书上就看到过这种,但其实同样有延时,感觉快不了多少

出0入0汤圆

发表于 2014-1-21 10:04:16 | 显示全部楼层
好东西 mark一下

出0入0汤圆

发表于 2014-1-21 14:39:06 | 显示全部楼层
学习         

出0入0汤圆

发表于 2014-3-12 11:01:35 | 显示全部楼层
zhaoxukiller 发表于 2011-10-21 20:28
其中矩阵键盘的键码希望朋友们自己去写

你P0没有上拉?

出0入0汤圆

发表于 2014-3-12 12:08:01 | 显示全部楼层
好东西感谢分享,顶楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表