夜猫 发表于 2015-7-14 17:26:14

都是实战.........

laokeiwang 发表于 2015-7-29 21:04:52

吴哥,你的帖子真心不错,继续等待更新,有个问题想请教下,第38节中判断数据尾的程序框架中,做了5个数据,其中前两个是数据位,后3个是数据尾,通过串口中断,将数据打入预先设置的数组缓存中,为什么这个数组要设置10个数据,我们需要接受的只有5个数据,这样做有什么好处吗,

arvin_zhang 发表于 2015-8-19 22:29:18

火速留名

lattice2008 发表于 2015-8-23 19:16:26

LZ真是无私奉献,现在这样的人很少了,很少高手会把自己所学拿出来与大家分享,都是各搞各的,{:lol:} {:lol:}{:lol:}

粗人 发表于 2015-8-23 22:26:02

钦佩楼主的奉献精神!

zwhzwh_11 发表于 2015-9-15 23:15:21

谢谢楼主糊提灌顶

xiaoliusheng 发表于 2015-9-15 23:46:49

坚持了一年,真的不容易

Chris_gong 发表于 2015-9-19 21:51:38

支持一下!

1178951695 发表于 2015-11-8 08:52:26

mark,一下

ZJetWay 发表于 2015-11-8 13:31:04

非常好的学习资料,谢谢.

s20120907 发表于 2015-11-8 21:08:55

这么多变量,是不是自己也容易搞混

liyiui 发表于 2015-11-8 21:31:21

确实不错,谢谢楼主!

huangweida 发表于 2015-11-13 14:30:08

吴坚鸿 发表于 2014-3-10 11:27
第一节:吴坚鸿谈初学单片机的误区。

(1)很难记住繁杂的寄存器?寄存器不用死记硬背,我做了那么久单片 ...

我想说,没有指针单片机跑程序速度慢了,没有结构体程序无法做到优化,宏定义可以初始化很多东西,仅此个人意见。

huangweida 发表于 2015-11-13 14:33:21

吴坚鸿 发表于 2014-3-10 11:30
第四节:累计定时中断次数使LED灯闪烁。

开场白:


这个程序,说真的,写的不咋的,还谈框架

吴坚鸿 发表于 2015-11-28 02:01:53

本帖最后由 吴坚鸿 于 2015-11-28 14:35 编辑

第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数控三轴运动卡的项目时,正在考虑ARM单片机和FPGA如何检测步进电机回原点的问题,灵感一来,想到了一种我很满意的行程开关识别思路。为了说明此思路的优越性,我会先列出前面两种常用的思路作对比。并且举一个最简单的工控项目来说明。
      此工控项目要求:上电后,一个普通电机控制一个滑块从左边往右边推,最右边有一个行程开关,滑块碰到行程开关后,电机停止,运动结束。
       转化成单片机编程思路 :用1个IO输出高电平时电机运动,输出低电平时电机停止。另外再用1个IO口作输入,检测行程开关的电平状态,如果发现是高电平说明电机还没碰上行程开关感应器,如果发现是低电平就说明碰上了感应器,此时就可以发出停止电机的命令。
      就是这么简单的过程,其实在识别开关感应器时暗藏玄机,现在一一解剖分析给大家:
      第一种思路:直接判断行程感应器的电平状态,一旦发现低电平,就认为电机已经碰到了行程开关,马上停止电机。
      优点:响应及时。
      缺点:太灵敏了,以至于抗干扰能力非常差,在工控环境里,当电机正在行进的过程中,如果受到电源的波动或者外来的毛刺信号干扰,行程开关的输入信号可能会读取到瞬间的低电平,导致单片机误判断,提前把电机停止了,电机还没碰到行程开关就草率停机。
      源码如下:
#include "REG52.H"


#define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

void motor_run();      //电机往右边移动
void motor_stop();   //电机停止
void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

void T0_time();//定时中断函数


sbit motor_dr=P3^5; //控制电机的启动和停止的输出对应朱兆祺学习板的独立LED灯
sbit right_sr=P0^2; //右边的行程开关检测输入对应朱兆祺学习板的S9键
sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

unsigned char u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
unsigned char u8MotorFlagBackup=0;//用来记录上一次的电机状态,用于判断电机的状态是否发生了改变。

unsigned char u8TimeFlag=0; //计时器的开关
unsigned intu16TimeCnt=0; //计时器的计时变量

unsigned char u8RunStep;//运动控制的步骤变量

void main()
{
   key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平
   TMOD=0x01;//设置定时器0为工作方式1

   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
   TL0=0x2f;

   EA=1;   //开总中断
   ET0=1;    //允许定时中断
   TR0=1;    //启动定时中断

   u8RunStep=1;//一上电,电机就开始从第1步开始启动
   while(1)   
   {
       switch(u8RunStep)
       {
          case 1:   
               motor_run();   //电机往右边移动
               u8RunStep=2;//切换到下一个步骤
               break;

         case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
               if(0==right_sr)//右边的行程感应器被触发
               {
                              motor_stop();   //电机停止
                  u8RunStep=3;       //马上切换到电机停止的步骤
               }
               break;

         case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
                break;
       }
   }

}



void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
{
TF0=0;//清除中断标志
TR0=0; //关中断


TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
TL0=0x2f;
TR0=1;//开中断
}



void motor_run()      //电机往右边移动
{
    motor_dr=1;
    u8MotorFlag=1;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_stop()   //电机停止
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}




      第二种思路:在判断行程感应器的电平状态时,加入了软件的抗干扰处理,一旦发现低电平,一个计时器开始计时,在计时的期间,如果发现出现高电平就马上把计时器清零,如果一直是低电平,并且期间没有出现高电平,就认为是稳定的低电平,此时判定是碰到了行程开关。
      优点:增加了抗干扰处理,几乎能百分百保证电机碰到了行程开关才停机,几乎不会误判了。
      缺点:在软件抗干扰环节增加了一小段延时,而这一小段的延时,会导致电机碰到行程开关后没有马上停止,滑块继续往右边运动了一段时间才停止,时间长了容易把右边的限位机械结构压坏挤坏,因为有应力存在。
      源码如下:
#include "REG52.H"


#define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

void motor_run();      //电机往右边移动
void motor_stop();   //电机停止
void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

void T0_time();//定时中断函数


sbit motor_dr=P3^5; //控制电机的启动和停止的输出对应朱兆祺学习板的单个LED灯
sbit right_sr=P0^2; //右边的行程开关检测输入   对应朱兆祺学习板的S9键
sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

unsigned char u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
unsigned char u8MotorFlagBackup=0;//用来记录上一次的电机状态,用于判断电机的状态是否发生了改变。

unsigned char u8TimeFlag=0; //计时器的开关
unsigned intu16TimeCnt=0; //计时器的计时变量

unsigned char u8RunStep;//运动控制的步骤变量

void main()
{
   key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

   TMOD=0x01;//设置定时器0为工作方式1

   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
   TL0=0x2f;

   EA=1;   //开总中断
   ET0=1;    //允许定时中断
   TR0=1;    //启动定时中断

   u8RunStep=1;//一上电,电机就开始从第1步开始启动
   while(1)   
   {
       switch(u8RunStep)
       {
          case 1:   
               motor_run();   //电机往右边移动

               u8TimeFlag=0; //计时器关
               u16TimeCnt=0; //计时器的计时变量清零

               u8RunStep=2;//切换到下一个步骤
               break;

         case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
               if(0==right_sr)//右边的行程感应器被触发
               {
                  u8TimeFlag=1; //计时器开
                  if(u16TimeCnt>=CONT_TIME_20MS)//连续20ms内都是低电平,则认为是低电平
                  {
                     u8TimeFlag=0; //计时器关
                     u16TimeCnt=0; //计时器的计时变量及时清零

                                 motor_stop();   //电机停止
                     u8RunStep=3;       //马上切换到电机停止的步骤
                  }
               }
               else//如果是高电平
               {
                  u8TimeFlag=0; //计时器关
                  u16TimeCnt=0; //计时器的计时变量及时清零
               }
               break;

         case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
                break;
       }
   }

}



void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
{
TF0=0;//清除中断标志
TR0=0; //关中断

if(1==u8TimeFlag)
{
   u16TimeCnt++;
}


TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
TL0=0x2f;
TR0=1;//开中断
}



void motor_run()      //电机往右边移动
{
    motor_dr=1;
    u8MotorFlag=1;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_stop()   //电机停止
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}





       第三种思路:本思路是结合了前面两种的优点,在判断行程感应器的电平状态时,当发现是低电平时(哪怕是干扰时出现的瞬间低电平),电机马上暂停(暂停和停止的概念不一样,虽然电机都是没有转),当发现是高电平时,电机继续运行,什么时候才认为碰到行程开关?当低电平像第二种思路那样连续持续低电平的时间超过某个值时,才认为碰到了行程开关。巧妙的是,在此判断低电平的小延时期间,电机是处于暂停的状态(没有转),所以不会过冲挤压右边的行程限位机构。
      优点:既能及时响应,又增加了行程开关检测的抗干扰处理,又不会让电机过冲挤压右边的行程开关。
      缺点:暂时还没想出来。
      源码如下:
#include "REG52.H"


#define CONT_TIME_20MS   10   //大概10次中断相当于20毫秒

void motor_run();      //电机往右边移动
void motor_stop();   //电机停止
void motor_pause();    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样

void T0_time();//定时中断函数


sbit motor_dr=P3^5; //控制电机的启动和停止的输出,对应朱兆祺学习板的单个LED灯
sbit right_sr=P0^2; //右边的行程开关检测输入,对应朱兆祺学习板的S9键

sbit key_gnd_dr=P0^4; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

unsigned char u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动

unsigned char u8RightSrFlagBackup=0;//用来记录上一次的行程开关电平状态,用来判断行程开关是否发生过电平变化

unsigned char u8TimeFlag=0; //计时器的开关
unsigned intu16TimeCnt=0; //计时器的计时变量

unsigned char u8RunStep;//运动控制的步骤变量

void main()
{
   key_gnd_dr=0; //矩阵键盘模拟独立按键的地GND,因此必须一直输出低电平

   TMOD=0x01;//设置定时器0为工作方式1

   TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
   TL0=0x2f;

   EA=1;   //开总中断
   ET0=1;    //允许定时中断
   TR0=1;    //启动定时中断

   u8RunStep=1;//一上电,电机就开始从第1步开始启动
   while(1)   
   {
       switch(u8RunStep)
       {
          case 1:   
               motor_run();   //电机往右边移动
               u8RightSrFlagBackup=1;//用来判断行程开关是否发生过电平变化

               u8TimeFlag=0; //计时器关
               u16TimeCnt=0; //计时器的计时变量清零

               u8RunStep=2;//切换到下一个步骤
               break;

         case 2:    //等待滑块移动到最右边,直到触发了最右边的行程开关感应器。
               if(0==right_sr)//右边的行程感应器被触发
               {
                              if(u8RightSrFlagBackup!=0) //行程开关的电平发生过变化
                                        {
                                           u8RightSrFlagBackup=0; //及时更新,避免一直触发电机的命令操作
                                           motor_pause();    //电机及时暂停
                                        }

                  u8TimeFlag=1; //计时器开
                  if(u16TimeCnt>=CONT_TIME_20MS)//连续20ms内都是低电平,则认为是低电平
                  {
                     u8TimeFlag=0; //计时器关
                     u16TimeCnt=0; //计时器的计时变量及时清零

                                 motor_stop();   //电机停止
                     u8RunStep=3;       //马上切换到电机停止的步骤
                  }
               }
               else//如果是高电平
               {

                              if(u8RightSrFlagBackup!=1) //行程开关的电平发生过变化
                                        {
                                           u8RightSrFlagBackup=1; //及时更新,避免一直触发电机的命令操作
                     motor_run();      //电机继续往右边移动
                                        }
                  u8TimeFlag=0; //计时器关
                  u16TimeCnt=0; //计时器的计时变量及时清零
               }
               break;

         case 3:    //电机处于停止的步骤,除非重新断电重启,否则就一直处于此步骤状态
                break;
       }
   }

}



void T0_time() interrupt 1   //定时中断,大概每2ms就中断一次
{
TF0=0;//清除中断标志
TR0=0; //关中断

if(1==u8TimeFlag)
{
   u16TimeCnt++;
}


TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f   大概每2ms产生一次中断,我没有详细计算。
TL0=0x2f;
TR0=1;//开中断
}



void motor_run()      //电机往右边移动
{
    motor_dr=1;
    u8MotorFlag=1;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_stop()   //电机停止
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}
void motor_pause()    //电机暂停,虽然暂停里面的代码跟停止的代码一致,但是概念不一样
{
    motor_dr=0;
    u8MotorFlag=0;//电机的实时运动状态映射在此变量里,此变量的0和1代表了电机的停止和运动
}




         最后再提醒一下:凡是有行程限位开关的地方,速度都不宜太快,要控制好速度,因为高速会由于比较大的惯性产生碰击现象。如果需要高速的场合,最好能在到达终点前多增加一个感应器,在到达终点前做一些减速操作。如果是步进电机,也可以利用实时坐标信息来识别快到行程开关终点时做一些减速处理。
       (本连载仅为初稿,我计划在2017年从头开始重写一次此连载,融入我最新的技术理解,在原来的基础上进一步提炼和补充)

polly 发表于 2015-11-28 16:57:23

吴坚鸿 发表于 2015-11-28 02:01
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数 ...

学习中,支持一下!

nuncle 发表于 2015-12-1 22:42:53

膜拜下。

yanghaoxiu 发表于 2015-12-2 09:11:33

太棒了,支持一下

kuailechengyang 发表于 2015-12-6 20:32:36

不错的资料

WM_CH 发表于 2015-12-13 22:50:47

吴老师发帖了,得顶上来啊!

ddg_int 发表于 2015-12-13 22:53:22

好东西阿。楼主无私贡献。虽然现在不做单片机开发了,还是要顶。

冲上云霄 发表于 2015-12-14 09:25:21

谢谢分享~~~~~~~~

lipen2008 发表于 2015-12-15 21:06:22

吴坚鸿 发表于 2015-11-28 02:01
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。
         我今天在做数 ...

注解非常详细,内容循序渐进很丰富,能坚持把自已的所学无私奉献,值得让人敬佩。

吴坚鸿 发表于 2015-12-20 01:37:30

本帖最后由 吴坚鸿 于 2015-12-20 01:39 编辑

ddg_int 发表于 2015-12-13 22:53
好东西阿。楼主无私贡献。虽然现在不做单片机开发了,还是要顶。

我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。

nuncle 发表于 2015-12-25 15:52:01

吴坚鸿 发表于 2015-12-20 01:37
我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。 ...

楼主什么时候出书?按键模块一直都在用楼主的了后来, 好用 哈哈

yanzhiwei 发表于 2015-12-25 15:52:36

谢谢分享   

MagicYang 发表于 2015-12-25 16:22:13

学习一下楼主的框架~!

lylm123 发表于 2015-12-25 22:01:38

按键模块确实好用,产品中已实应用,谢谢楼主.

guet@11308 发表于 2016-1-17 20:58:19

niubility的分享,能把51玩的飞起来的男人非吴老师莫属了

cvi670 发表于 2016-1-17 21:03:12

老师傅的东西不错谢谢分享   我们这个国家就缺乏在实践第一线 写出自己的经验与总结这个对于后人来说那是财富

cvi670 发表于 2016-1-17 21:04:56

一直在关注你哦

vivi_cq1982 发表于 2016-2-2 11:35:11

很详细,值得收藏的好贴

novelcrab 发表于 2016-2-5 08:54:49

mark!!!!!!!!!!!!!!!!

ggaaoo 发表于 2016-2-17 20:35:09

mark,学习一下。

l宝宝奥斯卡 发表于 2016-2-17 21:35:11

mark               

奔跑的蜗牛 发表于 2016-2-20 11:44:27

学习了,收藏!

creep 发表于 2016-2-20 16:19:41

太犀利了,佩服

jesse2012 发表于 2016-2-24 09:05:31

原先说的今年出书,已经是猴年,难道要马月才出书?,等了半年了{:funk:}

第几个我了 发表于 2016-3-15 12:49:04

学习了,谢谢老师

龙生初九 发表于 2016-3-19 11:20:18

谢谢分享

xupeibin 发表于 2016-3-23 14:26:09

不错,学习下。

60飘过 发表于 2016-3-23 16:04:35

只恨看到太晚

ymyhd 发表于 2016-3-24 15:33:44

多谢大师的帮助入门

liubiao6832170 发表于 2016-5-1 22:04:25

支持 学到很多东西

usergxj 发表于 2016-6-4 10:48:16

谢谢楼主这么好的文章,静下心来学习

shange144k8 发表于 2016-6-6 15:08:30

很好的资料,现在看正是适合

crazylata 发表于 2016-6-8 21:16:49

吴坚鸿 发表于 2015-12-20 01:37
我现在还一直在做单片机开发,最近在做stm32F407和FPGA的开发,在做数控机器人系统,运动卡这类的项目。 ...

国内的运动控制卡好像是固高的比较好,杰美康的次之。

dulingwu 发表于 2016-6-16 09:28:56

mark                           

dulingwu 发表于 2016-6-16 09:29:16

mark                     

jiang739707231 发表于 2016-6-21 11:54:43

赞一个----收藏了

Smartmay 发表于 2016-6-21 17:28:13

楼主看来也是技术达人,热心分享,感谢感谢!

xiaoergao 发表于 2016-8-2 15:20:32

看了几个例子,有一些方法还是比较巧妙的

oaixuw 发表于 2016-8-5 23:51:55

楼主好人,学习了

一匹狼 发表于 2016-8-6 16:56:25

支持一下!很用心的教程啊!

warrenyan7251 发表于 2016-8-10 08:37:10

谢谢分享,谢谢

Happy猪小翔 发表于 2016-8-11 14:07:58

Mark一下!{:lol:}

shiruquaan23 发表于 2016-8-17 21:02:29

高手 值得学习

beer 发表于 2016-8-24 11:51:15

做个记号,拜读!

hefen-cai 发表于 2016-8-25 19:29:45

真是很棒的教程

wandycg 发表于 2016-8-27 13:12:08

支持,对于新人还是有点深奥了。

ammcu 发表于 2016-8-27 16:16:15

楼主出书吧,这样的好东西应该得到回报,我们也看得方便些。

eliterxzgxu 发表于 2016-8-27 19:14:24

感谢楼主分享

马拉河尚 发表于 2016-8-30 15:47:08

受教了,想要打赏,没有莫元……

jesse2012 发表于 2016-9-1 21:09:21

其实已经等LZ的书等了1年多了

mjhjmh630 发表于 2016-9-6 16:18:00

吴坚鸿 发表于 2014-3-10 20:29
第三十三节:能设置速度档位的数码管倒计时程序。

开场白:


最近从新来阿莫论坛,偶遇你的这篇文章,给我的帮助很大,我正在一节一节的看你的文章!受益匪浅!谢谢!

wuminglx 发表于 2016-9-17 13:13:44

支持一个

闪耀的空白 发表于 2016-11-11 21:11:43

吴坚鸿 发表于 2014-3-10 11:30
第四节:累计定时中断次数使LED灯闪烁。

开场白:


你好,吴老师,我照着第四节,抄写了一遍程序,但是proteus仿真功能不行哦,不知道哪里出错了。

zhuozz 发表于 2016-12-5 17:23:19

一定要坚持一下,谢谢分享 佩服!

kingbo 发表于 2016-12-25 20:53:20

我怎么当时学会了,也理解了,可是过段时间就又会忘记了,还要重头理解,你们呢?

CSP123 发表于 2017-1-7 08:58:05

不错顶一下

luckylone2009 发表于 2017-2-6 11:49:09

多向你学习

glkj 发表于 2017-3-28 19:35:53

写的很好,值得学习!

sctwp 发表于 2017-7-17 07:02:50

对初学者建立一个良好的编程思想的作用太大了

sctwp 发表于 2017-7-18 07:42:34

本帖最后由 sctwp 于 2017-7-18 11:27 编辑

删除的理由是自己理解错误

joesonzzy 发表于 2017-7-18 15:14:55

楼主擅于总结,也乐于分享,值的我们学习,我做单片机也做了十几年,看了前几篇,思路很像

oaixuw 发表于 2017-10-9 15:15:26

好东西,谢谢楼主呕心沥血

yaonen 发表于 2017-10-11 20:54:40


写的很好,值得学习!

tangly2017 发表于 2017-11-4 09:28:26

好资料,顶个,谢谢楼主

见入佳境 发表于 2017-11-4 11:03:20

程序框架

儿时心愿 发表于 2017-12-23 23:46:14

留个位,有时间来座。

纯忆之年 发表于 2018-5-16 10:51:58

学习了第83节-85节的内容,很好的解决了问题,感谢楼主分享这么好的东西

bmagui 发表于 2018-5-16 11:46:50

支持一下!

ljgchina 发表于 2018-5-17 13:19:03

谢谢分享!{:smile:}

69879 发表于 2018-5-21 14:48:10

不错!支持一下!

sidu320 发表于 2018-5-23 19:59:53

想问下一般字模生成软件都是生成16*16形式的字模数组,24*24形式或是32*32形式是怎么生成的?

wahaha 发表于 2018-5-23 20:59:59

标记一下,有时间好好拜读一下

sidu320 发表于 2018-5-26 15:00:50

sidu320 发表于 2018-5-23 19:59
想问下一般字模生成软件都是生成16*16形式的字模数组,24*24形式或是32*32形式是怎么生成的? ...

已经找到方法了,用字模Ⅲ-增强版 修改字体就可以了达到不同点阵的字模了,软件从简单使用到摸索着使用,真的要感谢作者,提供了便利。

261854681 发表于 2018-5-26 15:12:26

很久没有更新文章了啊。

let8011 发表于 2018-5-27 14:42:01

好东西先收藏,谢谢楼主分享

岁月快快快 发表于 2018-8-20 09:42:19

好东西,从里面学到了不少知识,感谢楼主{:handshake:}

林凡jeery 发表于 2018-8-23 12:14:43

可以来学习下了,很不错的

skype 发表于 2018-8-23 13:30:27

之前学单片机的时候买过楼主的书,好像书中没有提到过状态机轮询等相关概念,只有中断概念,后要看马潮老师的书才知道了状态机,看时间触发系统才明白了轮询是什么,从此眼界大开。

sidu320 发表于 2018-8-28 20:43:23

不得不说有些程序真的很好用,谢谢。

gowin31581191 发表于 2018-9-12 05:49:56

感謝你的付出,讓大家學習{:smile:}

joystring 发表于 2018-9-18 14:56:33

支持一下,有时间看看,肯定能学到不少东西。

tangly2017 发表于 2018-9-28 17:01:24

好东西,谢谢楼主的分享!!!!!!!!!!!!!!!!!!!!!!!

tangly2017 发表于 2018-9-29 17:02:44

很精彩的学习资料,谢谢楼主的分享

changshs 发表于 2018-10-1 00:45:13

楼主好人,心得分享,值得称赞!

sidu320 发表于 2018-12-9 20:50:37

影响最深的是:年轻时也不愿意把自己积累的经验跟外人说。到了一定时候觉得还是要授之以人。谢谢。

a515509429 发表于 2019-1-4 17:31:00

有潜力成为下一个郭天祥
页: 4 5 6 7 8 9 10 11 12 13 [14] 15
查看完整版本: 从业将近十年!手把手教你单片机程序框架(连载)