我们的17岁+十几年了,从画电路板开始。

[复制链接]
8308|38
 楼主| keer_zu 发表于 2017-9-20 17:51 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2017-9-27 07:21 编辑

06年初,之前做过维修,做电子设计还是刚入行,只会protel基本操作,c语言很生硬。
当时还没做过电路板。。。。
同事介绍了21ic,就这样注册之,开始了菜鸟之旅。


在这里,我分享了我第一块电路板,得到了不少坛友的指点和夸赞。
(这个帖子二姨做调整的时候找不到了,别的地方还有:第一块板子
(被别的站盗用了。还留下了水印)
在这里我分享了我写的第一段C代码,得到了大家的鼓励。
  1. 第一段C代码,51单片机:


  2. 这个 void text(void)可是我的处女作啊
  3. //////////////////////////////////////////////////////////////////////////////////////////////////////
  4. void text(void)
  5. {

  6.    bit Flag_add;                                  /*加一标志*/
  7.    bit Flag_sub;                                  /*减一标志*/   
  8.    unsigned char max_value;                       /*各时间单位的最大值*/
  9.    unsigned char min_value;                       /*各时间单位的最小值*/
  10.          /*if(FUN==1)
  11.            {   */                                   /*定义标志位*/
  12.               if(switch_work==0)                 /*移位键*/
  13.                   {               
  14.                       if(Shift_on==0)
  15.                         {
  16.                                 Shift_on=1;
  17.                                 buzzer();
  18.                             clk_number++;
  19.                             if(clk_number>6)clk_number=1;                             
  20.                              }
  21.                         }
  22.               else
  23.                    Shift_on=0;
  24.               if(switch_up==0)                   /*加一键*/
  25.                   {
  26.                             if(Add_on==0)
  27.                               {
  28.                                       Add_on=1;
  29.                                         buzzer();
  30.                             Flag_add=1;
  31.                                    }
  32.                          }
  33.               else
  34.                         Add_on=0;
  35.               if(switch_down==0)                   /*减一键*/
  36.                   {
  37.                             if(Sub_on==0)
  38.                               {
  39.                                       Sub_on=1;
  40.                                               buzzer();
  41.                                       Flag_sub=1;
  42.                                    }
  43.                    }
  44.                else
  45.                    Sub_on=0;
  46.               switch(clk_number)
  47.                    {
  48.                              case 1: max_value=99;min_value=0;break;
  49.                              case 2: max_value=12;min_value=1;break;
  50.                              case 3:     if(clk_data[1]==1||
  51.                                                   clk_data[1]==3||
  52.                                                   clk_data[1]==5||
  53.                                                   clk_data[1]==7||
  54.                                                   clk_data[1]==8||
  55.                                                   clk_data[1]==10||
  56.                                                   clk_data[1]==12)
  57.                                                   max_value=31;       /*1,3,5,7,8,10,12*/
  58.                                                else if(
  59.                                                   clk_data[1]==4||
  60.                                                   clk_data[1]==6||
  61.                                                   clk_data[1]==9||
  62.                                                   clk_data[1]==11)
  63.                                                   max_value=30;                   /*4,6,9,11*/
  64.                                                else if((clk_data[0]%4==0)||clk_data[0]==0)                          
  65.                                                   max_value=29;                   /*闰年*/
  66.                                                else
  67.                                                   max_value=28;
  68.                                                min_value=1;
  69.                                                break;
  70.                              case 4: max_value=23;min_value=0;break;
  71.                              case 5: max_value=59;min_value=0;break;
  72.                              case 6: max_value=7;min_value=1;break;
  73.                            }
  74.               if(Flag_add==1)
  75.                  {
  76.                            clk_data[clk_number-1]++;         
  77.                            Flag_add=0;
  78.                            if(clk_data[clk_number-1]>max_value)
  79.                          clk_data[clk_number-1]=min_value;                     
  80.                        }
  81.               else if(Flag_sub==1)
  82.                  {
  83.                           clk_data[clk_number-1]--;        
  84.                      Flag_sub=0;
  85.                      if(clk_data[clk_number-1]<min_value||clk_data[clk_number-1]==0xff)
  86.                         clk_data[clk_number-1]=max_value;  
  87.                   }
  88.              if(switch_function==0)
  89.             {
  90.                   if(function_on==0)
  91.                   {
  92.                             function_on=1;
  93.                             FUN=0;
  94.                             buzzer();
  95.                             function_state=1;
  96.                             fun0_flag=1;
  97.                              set_time[0]=(clk_data[4]/10)*0x10+(clk_data[4]%10);
  98.                           set_time[1]=(clk_data[3]/10)*0x10+(clk_data[3]%10);
  99.                           set_time[2]=(clk_data[2]/10)*0x10+(clk_data[2]%10);
  100.                           set_time[3]=(clk_data[1]/10)*0x10+(clk_data[1]%10);
  101.                           set_time[4]=(clk_data[5]/10)*0x10+(clk_data[5]%10);
  102.                           set_time[5]=(clk_data[0]/10)*0x10+(clk_data[0]%10);
  103.                            
  104.                                           
  105.                          }
  106.                      }
  107.                      else
  108.                      {
  109.                              function_on=0;
  110.                          }                        
  111.                   
  112. }
  113. 注:上面这个函数是我在51里面跑过的第一段代码,很有收藏价值,哈哈




再后来主要是写单片机代码,设计过modbus协议代码,做过菜单什么的。
也参照过坛友 @xwj 的代码,现在还保留着:
  1. xwj优化的通用菜单程序
  2. //呵呵,都在讨论菜单啊?那我也来优化一个!                                  //
  3. //大家多提意见哦:-)                                                         //
  4. //                                                                          //
  5. //--------------------------------------------------------------------------//
  6. //                                                                          //
  7. //                    (c) Copyright 2007-2008 xuwenjun                     //
  8. //                            All Rights Reserved                           //
  9. //                                    V1.00                                 //
  10. //--------------------------------------------------------------------------//
  11. //标 题: xwj优化的通用菜单程序                                             //
  12. //文件名: xwj_menu.c                                                        //
  13. //版 本: V1.00                                                             //
  14. //修改人: xwj                            E-mail:xuwenjun[url=home.php?mod=space&uid=329077]@21cn.com[/url]           //
  15. //日 期: 07-10-25                                                          //
  16. //描 述: xwj优化的通用菜单程序                                             //
  17. //声 明:                                                                   //
  18. //        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
  19. //        如用于商业用途请与作者联系.    E-mail:xuwenjun[url=home.php?mod=space&uid=329077]@21cn.com[/url]           //
  20. //        有问题请mailto xuwenjun[url=home.php?mod=space&uid=329077]@21cn.com[/url]   欢迎与我交流!                  //
  21. //--------------------------------------------------------------------------//
  22. //老版本: 无                             老版本文件名:                      //
  23. //创建人: xwj                            E-mail:xuwenjun[url=home.php?mod=space&uid=329077]@21cn.com[/url]           //
  24. //日 期: 03-11-06                                                          //
  25. //--------------------------------------------------------------------------//
  26. //描 述:                                                                   //
  27. // xwj优化的通用菜单程序                                                    //
  28. // MCU 型号: 任意                                                           //
  29. // 开发环境: ANSI C任意平台                                                 //
  30. // 开发日期: 2007.10.25                                                     //
  31. // 程序编写: XWJ                                                            //
  32. //--------------------------------------------------------------------------//
  33. // 程序特点:                                                                //
  34. //1、程序和数据的分离,菜单可任意定义,甚至放在RAM里                        //
  35. //2、定义好链表和菜单条目后,即可自动显示菜单、自动循环、跳转、执行,       //
  36. //   自动控制程序流向,不需任何额外的判断和switch                           //
  37. //3、保留菜单路径,可原路返回(当然,也可直接跳回去啦:-)  )                //
  38. //4、可任意定义菜单层数,每层菜单可以任意组织,多一层菜单仅需增加1字节RAM   //
  39. //5、节省内存,仅需2字节+菜单层数个RAM                                     //
  40. //--------------------------------------------------------------------------//


  41. #include <stdio.h>
  42. #include “my_displays.h”                    //my_displays.c中包含char putchar (char)的实体
  43.                                             //和 液晶显示模块(点、线、填充...)
  44.                                             //以及printat(x,y,char*),有此足以实现任何界面显示


  45. #define MENU_MAX_LAYER          16          //菜单链最大层数,示例只用到4层
  46. #define MENU_NUM_OF_PAGE        4           //每页可以显示菜单数目

  47. unsigned char Menu_tree[MENU_MAX_LAYER];    //菜单按键树,类似堆栈
  48. unsigned char Menu_tree_ptr;                //当前菜单按键树所在层数
  49. unsigned char Menu_item_ptr;                //当前菜单项在本层中位置

  50. typedef struct
  51. {
  52.     unsigned char code *Menu_NextTab;       //本级菜单菜单链表
  53.     char code *Menu_Name;                   //当前菜单名称
  54.     void    (*CurrentOperate)();            //当前状态应该执行的功能操作
  55. }Menustruct;

  56. void    (*KeyFuncPtr)();                    //按键功能指针

  57. void    refur_Menu(void);                   //刷新菜单层,就是依次打印总标题、各个条目,
  58. void    refur_Menu_item(void);              //刷新本层菜单项,就是恢复原来项颜色,反显当前项
  59.                                             //则两个函数和界面布局有关,自己写吧
  60.                                             
  61. extern void ScanKey(void);                  //键盘扫描

  62. void    Menu_Key_Func(unsigned char NowKey); //菜单按键功能
  63. {
  64.     switch(NowKey)
  65.     {
  66.         case    KEY_UP:
  67.                if(*(KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab))         //Menu_NextTab[0]不为0,是菜单
  68. //              也可以判断函数指针是否是NULL,写成下面这样:
  69. //             if(KeyTab[Menu_tree][Menu_tree_ptr]].CurrentOperate == NULL)) //Menu_NextTab[0]不为0,是菜单
  70.                 {
  71.                     Menu_item_ptr--;        //菜单项上移
  72.                    if(Menu_tree_ptr== -1)  //菜单项上移到顶翻转了,修正到最后一项
  73.                         Menu_item_ptr=sizeof(*(KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab))-1;  //菜单循环
  74.                        refur_Menu_item();                   //刷新本层菜单项
  75.                 }
  76.                 else
  77.                     Error_Beep();           //否则不是菜单,上下移无效,蜂鸣警告
  78.             break;
  79.         case    KEY_doWN:
  80.                if(*(KeyTab[Menu_tree][Menu_tree_ptr].Menu_NextTab))     //Menu_NextTab[0]不为0,是菜单
  81.                 {
  82.                     Menu_item_ptr++;        //菜单项下移
  83.                    if(Menu_item_ptr==sizeof(*(KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab))-1) //菜单项下移到底
  84.                         Menu_item_ptr=0;    //菜单项下移到底,循环上去
  85.                        refur_Menu_item();                   //刷新本层菜单项
  86.                 }
  87.                 else
  88.                     Error_Beep();           //否则不是菜单,上下移无效,蜂鸣警告
  89.                 break;
  90.         case    KEY_OK://KEY_OK,    KEY_UP,    KEY_ESC,
  91.                if(*(KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab))    //Menu_NextTab[0]不为0,是菜单
  92.                 {
  93.                     Menu_tree[Menu_tree_ptr+1]=KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab[Menu_item_ptr]);
  94.                                             //下一级菜单压进菜单树,能看懂吗?
  95.                     Menu_tree_ptr++;        //菜单又多了一级
  96.                        refur_Menu();          //刷新菜单层,当前菜单当然是在Menu_tree[Menu_tree_ptr]中啦
  97.                 }
  98.                 else                        //不是菜单,执行当前菜单项的操作
  99.                 {
  100.                     KeyFuncPtr=KeyTab[Menu_tree][Menu_tree_ptr]].CurrentOperate;
  101.                     (*KeyFuncPtr)();        //执行当前菜单项的操作
  102.                 }
  103.                 break;
  104.         case    KEY_ESC:
  105.                 //
  106.                if(Menu_tree_ptr)               //当前菜单位置不是顶层(主界面)
  107.                 {
  108.                     Menu_tree_ptr--;            //则返回上一层
  109.                        refur_Menu();          //刷新菜单层,当前菜单当然是在Menu_tree[Menu_tree_ptr]中啦
  110.                 }
  111.                 else
  112.                     Error_Beep();               //否则蜂鸣警告
  113.                 break;
  114.                 //
  115.        //case   Other:
  116.        //....
  117.        }         //
  118. }



  119. //************************************************************************
  120. //Menu struct:                              //菜单示例,共4层19项
  121. //************************************************************************
  122. // First Bmp--------------------->(MenuID_0)
  123. // ---+               
  124. //    |View--------------------->(MenuID_1)
  125. //    +---+            
  126. //    |   |About Recorde-------->(MenuID_2)
  127. //    |   +--------------
  128. //    |   |HandSet Clock-------->(MenuID_3)
  129. //    |   +--------------
  130. //    |Operation---------------->(MenuID_4)
  131. //    +---+            
  132. //        |Set Position--------->(MenuID_5)
  133. //        +---+            
  134. //        |   |Rd Zj To Flash------->(MenuID_6)
  135. //        |   +--------------
  136. //        |   |Rd Zl To Ram--------->(MenuID_7)
  137. //        |   +--------------
  138. //        |   |Del Given Zl--------->(MenuID_8)
  139. //        |   +--------------
  140. //        |   |Del All Zl----------->(MenuID_9)
  141. //        |   +--------------
  142. //        |Test--------------------->(MenuID_10)
  143. //        +---+            
  144. //        |   |Ram Test------------->(MenuID_11)
  145. //        |   +--------------
  146. //        |   |Flash Test----------->(MenuID_12)
  147. //        |   +--------------
  148. //        |System Set--------------->(MenuID_13)
  149. //        +---+            
  150. //        |Debug---------------->(MenuID_14)
  151. //        +---+        
  152. //        |   |PassWord--------->(MenuID_15)
  153. //        |   +--------------
  154. //        |   |See Picture------>(MenuID_16)
  155. //        |   +--------------
  156. //        |Set Hand Clk--------->(MenuID_17)
  157. //        +--------------
  158. //************************************************************************

  159. //菜单链表,每项菜单一条,共19项
  160. unsigned char code Tab_First_Bmp[]=
  161. {1,4,0x00
  162. };
  163. unsigned char code Tab_View[]=
  164. {2,3,0x00
  165. };
  166. unsigned char code Tab_About_Recorde[]=
  167. {0x00
  168. };
  169. unsigned char code Tab_HandSet[]=
  170. {0x00
  171. };
  172. unsigned char code Tab_Operation[]=
  173. {5,10,13,14,17,0x00
  174. };
  175. unsigned char code Tab_Set_Position[]=
  176. {6,7,8,9,0x00
  177. };
  178. unsigned char code Tab_Rd_Zj_To_Flash[]=
  179. {0x00
  180. };
  181. //...
  182.                                 //每项菜单一条,共19项


  183. //菜单结构,每项菜单一条,,共19项
  184. KeyTabstruct code KeyTab[]=
  185. {
  186. //Menu_NextTab,     Menu_Name,    CurrentOperate
  187. //本级菜单菜单链表, 当前菜单名称, 当前状态应该执行的功能操作
  188. {Tab_First_Bmp,"First_Bmp",*First_Bmp},    //实际上菜单功能可以为NULL,由refur_Menu()统一操作;
  189.     {Tab_View,"View",*View},               //不是菜单则用实际功能函数
  190.     {Tab_About_Recorde,"About Recorde",*About_Recorde},   //非菜单
  191.     {Tab_HandSet Clock,"HandSet Clock",*HandSet_Clock},   //非菜单
  192.     {Tab_Operation,"Operation",*NULL},                     //菜单
  193.     {Tab_Set_Position,"Set Position",*NULL},               //菜单
  194.     {Tab_Rd_Zj_To_Flash,"Rd Zj To Flash",*Rd_Zj_To_Flash}, //非菜单
  195. //...
  196.                                 //每项菜单一条,共19项
  197. };

  198. //使用方法:      
  199. //1、定义好链表和菜单条目,写好每个功能函数
  200. //2、主循环中不停的读按键,然后Menu_Key_Func();即可自动显示菜单、自动循环、跳转、执行
  201. //比如:

  202. void main(void)
  203. {
  204.     Menu_tree_ptr=0;                //当前菜单按键树所在层数
  205.     Menu_item_ptr=0;                //当前菜单项在本层中位置
  206.     refur_Menu();                   //刷新顶层菜单
  207.     refur_Menu_item();              //刷新本层菜单项
  208.    
  209.    
  210.     while(1)
  211.     {
  212.         ScanKey();              //键盘扫描
  213.        if(KeyOk)
  214.             Menu_Key_Func();    //有按键则执行按键功能
  215.     }
  216. }
研究和使用过一段时间ucosII.
感谢 @ayb_ice 的耐心指教。



再后来又涉及一些电路的问题,有一段时间来得少,那段时间主要做嵌入式linux下的应用和驱动。
后来我又经常来了,而且还参与了版块的管理。

又认识了很多新朋友,包括 @yyy71cj 等。

21ic伴随了我职业的成长,给我很多帮助,我也非常乐意和大家分享。实在是不可或缺的精神家园。
感谢21ic,感谢各位坛友。
   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| keer_zu 发表于 2017-9-21 08:01 | 显示全部楼层
yyy71cj 发表于 2017-9-20 22:55
一路的光华……

十一去哪里玩啊?
 楼主| keer_zu 发表于 2017-9-21 09:41 | 显示全部楼层
yyy71cj 发表于 2017-9-21 09:28
基本玩不成,手上有两台自动化机床要赶制出来

小说啥时候更新?我还等着看呢。
 楼主| keer_zu 发表于 2017-9-21 09:48 | 显示全部楼层
yyy71cj 发表于 2017-9-21 09:44
今天更新。昨天有事。

有出版计划吗?真的很不错。
我虽然不懂文学,但是读过后感觉很好。
 楼主| keer_zu 发表于 2017-9-21 13:47 | 显示全部楼层
yyy71cj 发表于 2017-9-21 12:31
一下午的郁闷加不安,总算挨到了放学。我想我的那几个狐朋狗友应该会陪我吧?可是在王老师的威视下 ...

发错地方了吧,另外一个帖子再发一份吧。
皈依 发表于 2017-9-21 14:14 | 显示全部楼层
要得大奖~嘿嘿
 楼主| keer_zu 发表于 2017-9-21 14:18 | 显示全部楼层

我只要T恤
xiaomiking 发表于 2017-9-21 14:52 | 显示全部楼层
皈依 发表于 2017-9-21 16:56 | 显示全部楼层

妥妥的 T恤拿走
feelhyq 发表于 2017-9-21 17:13 | 显示全部楼层
山东电子小菜鸟 发表于 2017-9-21 18:02 | 显示全部楼层
zhangmangui 发表于 2017-9-21 22:13 | 显示全部楼层
 楼主| keer_zu 发表于 2017-9-22 09:51 | 显示全部楼层
yyy71cj 发表于 2017-9-21 22:55
奇怪,竟然串页,……

修一明 发表于 2017-9-22 10:00 | 显示全部楼层
666 写得真不错
景阳电子 发表于 2017-9-22 10:08 | 显示全部楼层
一看到红蓝色线路熟悉像每天必须吃饭一样,和楼主一样,2000年的第一份工作就是从PCB开始的到现在还是PCB,这一生都献给了PCB事业...
 楼主| keer_zu 发表于 2017-9-22 10:17 | 显示全部楼层
景阳电子 发表于 2017-9-22 10:08
一看到红蓝色线路熟悉像每天必须吃饭一样,和楼主一样,2000年的第一份工作就是从PCB开始的到现在还是PCB, ...

我画过第一块pcb后同时就开始了单片机,从51到AVR,再到stm32。
随后是linux下的应用程序,主要是网络通信什么的,自己open一个ip:port,得到一个socket,然后是拼命read和write什么的,然后去处理一大堆问题。当时也没想着libevent之类的框架。

再后来又玩了一段时间硬件,完全不是我的菜,就再也不玩硬件了。
后来嵌入式开发,还是linux下的编程:应用和驱动,还有vxworks之类系统。

再后来做服务器后端,现在前端都有所涉及了:android,web什么的。
这中间语言用了个遍:C++、JAVA、Golang、javascript。连python都有所涉足。。。。

最近android和微信小程序。
白胡子 发表于 2017-9-23 08:07 | 显示全部楼层
楼主从硬件转到软件,都是自学的吗
lihui567 发表于 2017-9-23 08:17 | 显示全部楼层
不错,楼主那个菜单代码是在屏上做的菜单吗
 楼主| keer_zu 发表于 2017-9-23 08:38 | 显示全部楼层
白胡子 发表于 2017-9-23 08:07
楼主从硬件转到软件,都是自学的吗

全部是自学的,没有上过培训班,也没有公司交过。
 楼主| keer_zu 发表于 2017-9-23 08:39 | 显示全部楼层
lihui567 发表于 2017-9-23 08:17
不错,楼主那个菜单代码是在屏上做的菜单吗

是的,是单色led的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1488

主题

12945

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部