找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5372|回复: 7
收起左侧

初学时的密码锁分享出来吧(multisum的原理图+源代码+论文)

[复制链接]
ID:98640 发表于 2015-12-7 10:32 | 显示全部楼层 |阅读模式
初学单片机时候自己做出来的密码锁。供各位 大虾、少虾来参考提供意见吧

连接图

连接图

所有东西.zip (1.08 MB, 下载次数: 66)

评分

参与人数 2黑币 +55 收起 理由
莫子栋 + 5 很给力!
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:98640 发表于 2015-12-7 10:32 | 显示全部楼层
各位做参考吧。代码已经很傻了啊 初学者也看得懂的哦
回复

使用道具 举报

ID:98640 发表于 2015-12-7 10:36 | 显示全部楼层
附件里里面包含了 multisum的原理图(截图),以及源代码。以及外观图(虽然有点丑)。
回复

使用道具 举报

ID:1 发表于 2015-12-7 18:03 | 显示全部楼层
楼主的源码如下:
  1. //*********单片机各I/O的说明****************
  2. //P2和P0口用于12864显示器
  3. //P1口用于矩阵键盘
  4. //P3口的高四位用于步进电机信号的传入电机
  5. //P3^2口用于室内控制门的关
  6. //P3^3口用于室内控制门的开
  7. //P2^7控制蜂鸣器
  8. //A---用于显示家中无人这个提示界面
  9. //B---用于门铃
  10. //C---用于门外关门
  11. //D---无功能
  12. //*---用于密码的重置
  13. //#---用于门外开门---需经过密码验证
  14. #include<reg52.h>
  15. #include<intrins.h>
  16. #define uint unsigned int
  17. #define uchar unsigned char
  18. #define N 3                                          //步进电机中需要用的宏
  19. uchar y=0x00;                                          //input函数中调用
  20. static uchar cs=0,gs=0;
  21. //***********************************************************
  22. static uchar mima[6]={"123456"};                                            //密码数组---可通过密码重置修改
  23. uchar lsmima[6];                                                       //临时密码数组--用于开门时的密码验证
  24. uchar newmima1[6];
  25. uchar newmima2[6];
  26. uchar dizhi1[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
  27. uchar dizhi2[8]={0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
  28. uchar dizhi3[8]={0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F};
  29. uchar dizhi4[8]={0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F};
  30. uchar panduan_zhi=0;
  31. uchar i,enter;                            //在6位密码输入和密码重置时需要使用的变量
  32. uchar control_gn='Z';                                  //在非数字按键的控制函数中使用
  33. uchar newhaoma[11];                                         //重新设定预留号码-------
  34. //****************信息提示语*************************
  35. uchar code mimazq[]={"密码没问题"};                                         //密码正确
  36. uchar code mimacw[]={"密码错误"};                               //密码有误提示
  37. uchar code xiugaicg[]={"修改成功"};                                //密码,号码重置显示
  38. uchar code mimawsts[]={"请输入六位密码"};                //密码位数提示
  39. uchar code shurucw[]={"输入错误"};                              //选择时的提示
  40. uchar code newsr[]={"请重新输入"};                             //选择时的提示
  41. //            *********功能提示**********
  42. uchar code kaimen[]={"马上为您开门"};             //开门提示语
  43. uchar code yuanshimima[]={"请输入原始密码"}; //原始密码
  44. uchar code newmima[]={"请输入新密码"};                //新密码
  45. uchar code ruqints[]={"有不法者试图入侵"};
  46. uchar code ruqinjb[]={"警报已经开启"};
  47. uchar code different[]={"两次输入不一致"};

  48. //***************界面提示语*****************************
  49. uchar code wenhou[]={"您好"};
  50. uchar code wr[]={"主人不在家"};
  51. uchar code lianxi[]={"有事请联系:"};                //界面_mr--->家中无人
  52. uchar code haoma[]={"18700596632"};                        //界面_mr--->家中无人
  53. uchar code yr[]={"主人在家"};                                //界面_yr--->家中有人
  54. uchar code menling[]={"有事请按门铃"};                //界面_yr--->家中有人
  55. uchar code huanying[]={"欢迎您的到访"};                //界面_yr--->家中有人
  56. //**********************函数声明***********************
  57. uchar key_scan();                                               //按键检测函数
  58. void delay_50us(uint u);                                                        //50us延时
  59. void write_zl(uchar cmd);                                                        //12864写指令
  60. void write_sj(uchar dat);                                                        //12864写数据
  61. void inti1();                                                                                //12864初始化                            
  62. void disp_dzf(uchar b,uchar zddz);                                        //12864单字符显示
  63. void delay_50ms(uint u);                                        //1286450ms延时
  64. void delay(uint x);                                                                           //步进电机延时函数
  65. void bjzz();                                                                               //步进电机正转---开门
  66. void bjdz();                                                                               //步进电机反转----关门
  67. void disp_hzi(uchar a[],uchar num,uchar cmd);       //12864字符串显示函数
  68. uchar input() reentrant;                            //按键输入
  69. void baojingsy();                                                                    //报警声音编码函数
  70. void anmenlingsy();                                 //按门铃的门铃声音编码函数                                        
  71. void control();                                     //流程控制函数
  72. void control_A();                                   //家中无人时的界面控制,按键A所对应的的功能
  73. void control_C() ;                                                         //家中无人时的界面控制,按键C所对应的的功能
  74. void panduankg() reentrant;                                                        //#号所对应的功能函数
  75. void tishiyin1();                                    //提示音1
  76. void tishiyin2();                                    //提示音2
  77. uchar open(uchar x);                                                                //open函数
  78. uchar mimashuru_6()        reentrant;                                                //密码重置
  79. void panduancz() reentrant;                                                        //#号所对应的功能函数
  80. uchar bijiao(uchar x) reentrant;                                   //密码重置时的二次比对
  81. void mimashuru1_6()reentrant;                                           //二次输入第一次
  82. void mimashuru2_6()reentrant;                                           //二次输入第一次
  83. void duizhao() reentrant ;
  84. //*********************************************************
  85. sbit RS=P2^2;
  86. sbit RW=P2^1;
  87. sbit E=P2^0;
  88. sbit PSB=P2^3;
  89. sbit RESET=P2^5;
  90. sbit beep=P2^7;
  91. //********************位 定 义**********************************
  92. void jiemian_mr()
  93. {       
  94.     write_zl(0x01);                                            //-----清屏
  95.         disp_hzi(wenhou,4,dizhi1[0]);    //第二行开始显示  您好主人不在家
  96.         disp_hzi(wr,10,dizhi2[2]);
  97.         disp_hzi(lianxi,12,dizhi3[0]);      // 显示  有事请联系:
  98.         disp_hzi(haoma,11,dizhi4[2]);       //显示  18700596632
  99. }
  100. //*********************家里有人时的界面*****************
  101. void jiemian_yr()
  102. {  inti1();
  103.     write_zl(0x01);
  104.         disp_hzi(wenhou,4,dizhi1[0]);                                                    //-----清屏
  105.         disp_hzi(yr,8,dizhi2[2]);                //显示 您好主人在家
  106.         disp_hzi(menling,12,dizhi3[0]);            //显示  有事请按门铃B键
  107.         disp_dzf('B',dizhi3[6]);                  //在有事按门铃之后显示B                                                          
  108.         disp_hzi(huanying,12,dizhi4[1]);          //显示欢迎您的到访
  109. }
  110. //************50us延时***************
  111. void delay_50us(uint u)
  112. {
  113.   uchar j;
  114.   uint i;
  115.   for(i=0;i<u;i++)
  116.           for(j=19;j>0;j--)
  117.         ;
  118. }
  119. //**************50us延时************
  120. void delay_50ms(uint u)
  121. {
  122.   uchar j;
  123.   uint i;
  124.   for(i=0;i<u;i++)
  125.           for(j=6245;j>0;j--)
  126.         ;
  127. }
  128. //********步进电机延时函数**********
  129. void delay(uint x)
  130. {
  131. uchar i;
  132. while(x--)
  133.   for(i=0;i<100;i++);
  134. }
  135. //********步进电机正转********
  136. void bjzz()   
  137. {
  138. uchar x;
  139. for(x=0;x<200;x++)
  140. {                          
  141. P3=0x3f;          
  142. delay(N);          
  143. P3=0x6f;
  144. delay(N);
  145. P3=0xcf;
  146. delay(N);
  147. P3=0x9f;
  148. delay(N);
  149. }
  150. }
  151. //********步进电机倒转********
  152. void bjdz()
  153. {
  154. uchar x;
  155. for(x=0;x<200;x++)
  156. {                          
  157. P3=0x9f;          
  158. delay(N);          
  159. P3=0xcf;
  160. delay(N);
  161. P3=0x6f;
  162. delay(N);
  163. P3=0x3f;
  164. delay(N);
  165. }
  166. }
  167. //**********写指令函数********
  168. void write_zl(uchar cmd)
  169. {
  170. RW=0;
  171. RS=0;
  172. delay_50us(1);
  173. P0=cmd;
  174. E=1;
  175. delay_50us(10);
  176. E=0;
  177. delay_50us(2);
  178. }
  179. //**********写数据函数********
  180. void write_sj(uchar dat)
  181. {
  182. RW=0;
  183. RS=1;
  184. delay_50us(1);
  185. P0=dat;
  186. E=1;
  187. delay_50us(10);
  188. E=0;
  189. delay_50us(2);
  190. }
  191. //**********初始化函数*********
  192. void inti1()
  193. {  
  194. delay_50us(2);
  195. write_zl(0x30);
  196. delay_50us(4);
  197. write_zl(0x30);
  198. delay_50us(4);
  199. write_zl(0x0c);//开显示,关光标……
  200. delay_50us(2);
  201. write_zl(0x01);
  202. delay_50us(240);
  203. write_zl(0x06);
  204. delay_50us(10);
  205. write_zl(0x64);
  206. delay_50us(10);
  207. }
  208. //*******12864单字符显示函数*****
  209. void disp_dzf(uchar b,uchar zddz)
  210. {
  211.   write_zl(zddz);
  212.   delay_50us(1);
  213.   write_sj(b);
  214.   delay_50us(1);
  215. }
  216. //*********12864字符串显示函数******
  217. void disp_hzi(uchar a[],uchar num,uchar cmd)
  218. {
  219. uchar *p=a;
  220. write_zl(cmd);
  221. for(p=a;p<a+num;p++)
  222. {
  223.         write_sj(*p);
  224.         delay_50us(1);
  225. }
  226. }
  227. //*****按键扫描函数返回mz值去显示********
  228. uchar key_scan()
  229. {
  230.   uchar t,key=0x99;//t临时变量
  231.   P1=0x7f;  
  232.   t=P1;          
  233.   t=t&0x07f;
  234.   if(t!=0x7f)
  235.   {
  236.   delay_50us(200);
  237.   t=P1;
  238.   t=t&0x7f;
  239.   if(t!=0x7f)
  240.   {
  241.    t=P1;
  242.    switch(t)
  243.    {
  244.    case 0x77:key='D';break;       
  245.    case 0x7b:key='C';break;       
  246.    case 0x7d:key='B';break;       
  247.    case 0x7e:key='A';break;       
  248.    }
  249.   }
  250.   }
  251. //第一行
  252. P1=0xbf;
  253.   t=P1;
  254.   t=t&0xbf;
  255.   if(t!=0xbf)
  256.   {
  257.   delay_50us(200);
  258.   t=P1;
  259.   t=t&0xbf;
  260.   if(t!=0xbf)
  261.   {
  262.    t=P1;
  263.    switch(t)
  264.    {
  265.    case 0xb7:key='#';break;
  266.    case 0xbb:key='9';break;
  267.    case 0xbd:key='6';break;
  268.    case 0xbe:key='3';break;
  269.    }
  270.   }
  271.   }
  272.   //第二行
  273.   P1=0xdf;
  274.   t=P1;
  275.   t=t&0xdf;
  276.   if(t!=0xdf)
  277.   {
  278.   delay_50us(200);
  279.   t=P1;
  280.   t=t&0xdf;
  281.   if(t!=0xdf)
  282.   {
  283.    t=P1;
  284.    switch(t)
  285.    {
  286.    case 0xd7:key='0';break;
  287.    case 0xdb:key='8';break;
  288.    case 0xdd:key='5';break;
  289.    case 0xde:key='2';break;
  290.    }
  291.   }
  292.   }
  293.   //第三行
  294.   P1=0xef;
  295.   t=P1;
  296.   t=t&0xef;
  297.   if(t!=0xef)
  298.   {
  299.   delay_50us(200);
  300.   t=P1;
  301.   t=t&0xef;
  302.   if(t!=0xef)
  303.   {
  304.    t=P1;
  305.    switch(t)                                                                   
  306.    {
  307.    case 0xe7:key='*';break;
  308.    case 0xeb:key='7';break;       
  309.    case 0xed:key='4';break;       
  310.    case 0xee:key='1';break;         
  311.    }
  312.   }
  313.   }
  314.   return(key);
  315. }
  316. //可重载的利用按键扫描函数的输入函数
  317. uchar input() reentrant//返回按下的按键,没有按键按下的时候等待
  318. {
  319. y=key_scan();
  320. if(y==0x99)//key=0x99代表没有按键按下
  321. input();
  322. else
  323. return (y);
  324. }
  325. //******6密码连续的输入并在屏幕显示*********
  326. //****6位密码显示,与已设进行比对的函数*****
  327. uchar mimashuru_6()reentrant
  328. {
  329.   write_zl(0x01);
  330.   disp_hzi(mimawsts,14,dizhi1[0]);  //input的功能是,当有按键按下的时候才返回这个数值
  331.                                     //6位密码的输入,而且每输入一个数字显示几ms后显示*
  332.   for(i=0;i<6;i++)
  333.   {
  334.         enter=input();
  335.         lsmima[i]=enter;                           //将返回的密码值储存在lsmima数组中
  336.         disp_dzf(enter,dizhi2[i]);     //在第二行显示刚刚输入的字符
  337.         delay_50ms(2000);
  338.         switch(lsmima[i])
  339.         {
  340.         case 'A':write_zl(0x01);mimashuru_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
  341.         }
  342.         disp_dzf('*',dizhi2[i]);          //在第二行用*号掩盖刚刚的输入结果
  343.           delay_50ms(20);
  344.   }
  345. for(i=0;i<6;i++)
  346. {
  347.          if(lsmima[i]!=mima[i])
  348.          {
  349.          write_zl(0x01);
  350.          tishiyin1();
  351.          disp_hzi(mimacw,8,dizhi2[2]);
  352.          delay_50ms(1000);
  353.          break;
  354.          }
  355. }
  356. return(i);
  357. }
  358. //这个函数的作用是输入密码并且进行输入的密码与预置密码进行比对
  359. //如果二者相符返回6.不相符返回非6
  360. //open函数是根据mimashuru_6的返回值是不是6而进行开门和提示密码错误
  361. uchar open(uchar x)
  362. {
  363. if(x==6)
  364. {
  365.     tishiyin2();
  366.         disp_hzi(kaimen,12,dizhi3[0]);
  367.         delay_50ms(10000);
  368.         bjzz();
  369.         delay_50ms(5000);
  370.         return(0);
  371.         }
  372. else
  373. {
  374.         delay_50ms(6000);
  375.         tishiyin1();
  376.         delay_50ms(100);
  377.         write_zl(0x01);                  //进行清屏
  378.         return(1);
  379.         }
  380. }
  381. //********密码输错三次报警程序******
  382. //在报警响之后,经过连续的十次的响报警吓走图谋不轨者,然后重新回到control所控制的界面  
  383. void panduankg() reentrant
  384. {       
  385. delay_50ms(1000);            
  386.   panduan_zhi=open(mimashuru_6());
  387.   if(panduan_zhi==1)  //返回值是1说明输入密码错误
  388.      {
  389.          cs++;
  390.          if(cs==3)
  391.                  baojingsy();
  392.          else
  393.             panduankg();
  394.         }
  395.   else
  396.     cs=0;

  397.   }
  398. void mimashuru1_6()reentrant
  399. {
  400.   write_zl(0x01);
  401.   disp_hzi(newmima,14,dizhi1[0]);  //input的功能是,当有按键按下的时候才返回这个数值
  402.                                     //6位密码的输入,而且每输入一个数字显示几ms后显示*
  403.   for(i=0;i<6;i++)
  404.   {
  405.         enter=input();
  406.         newmima1[i]=enter;                           //将返回的密码值储存在lsmima数组中
  407.         disp_dzf(enter,dizhi2[i]);     //在第二行显示刚刚输入的字符
  408.         delay_50ms(2000);
  409.         switch(newmima1[i])
  410.         {
  411.         case 'A':write_zl(0x01);mimashuru1_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
  412.         }
  413.         disp_dzf('*',dizhi2[i]);          //在第二行用*号掩盖刚刚的输入结果
  414.           delay_50ms(20);
  415.   }
  416. }
  417. void mimashuru2_6()reentrant
  418. {
  419.   write_zl(0x01);
  420.   disp_hzi(newsr,10,dizhi1[0]);  //input的功能是,当有按键按下的时候才返回这个数值
  421.                                     //6位密码的输入,而且每输入一个数字显示几ms后显示*
  422.   for(i=0;i<6;i++)
  423.   {
  424.         enter=input();
  425.         newmima2[i]=enter;                           //将返回的密码值储存在lsmima数组中
  426.         disp_dzf(enter,dizhi2[i]);     //在第二行显示刚刚输入的字符
  427.         delay_50ms(2000);
  428.         switch(newmima2[i])
  429.         {
  430.         case 'A':write_zl(0x01);mimashuru2_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
  431.         }
  432.         disp_dzf('*',dizhi2[i]);          //在第二行用*号掩盖刚刚的输入结果
  433.           delay_50ms(20);
  434.        
  435.   }
  436. }
  437. void panduancz() reentrant
  438. {       
  439. delay_50ms(1000);            
  440.   panduan_zhi=mimashuru_6();
  441.   if(panduan_zhi!=6)  //返回值是1说明输入密码错误
  442.      {
  443.          cs++;
  444.          if(cs==3)
  445.          {
  446.          write_zl(0x01);
  447.                  baojingsy();
  448.          }
  449.          else
  450.             panduancz();
  451.         }
  452.   else
  453.   {
  454.    cs=0;
  455.    duizhao();
  456.   }
  457. }
  458. void duizhao() reentrant
  459. {
  460.    mimashuru1_6();
  461.    delay_50ms(200);
  462.    write_zl(0x01);
  463.    mimashuru2_6();
  464.    for(gs=0;gs<6;gs++)
  465.             {
  466.          if(newmima1[gs]!=newmima2[gs])
  467.          break;
  468.          }
  469.          
  470. if(gs<6)
  471.    {
  472.    write_zl(0x01);
  473.    disp_hzi(different,14,dizhi1[0]);
  474.    disp_hzi(newsr,10,dizhi2[1]);
  475.    delay_50ms(10000);
  476.    duizhao();
  477.    }
  478. else
  479.   {       
  480.         for(gs=0;gs<6;gs++)
  481.         {
  482.         mima[gs]=newmima1[gs];
  483.        
  484.         }
  485.       write_zl(0x01);
  486.       disp_hzi(xiugaicg,8,dizhi1[0]);         
  487.       delay_50ms(10000);  
  488. }
  489. }
  490. //**********报警声音**************
  491. void baojingsy()
  492. {
  493. uint i,j;
  494. disp_hzi(ruqints,16,dizhi1[0]);
  495. disp_hzi(ruqinjb,12,dizhi3[1]);
  496. for(j=0;j<60;j++)
  497. for(i=0;i<10000;i++)
  498. {
  499. beep=0;
  500. delay_50us(1);
  501. beep=1;
  502. delay_50us(1);
  503. }
  504. }
  505. //************门铃声音*************
  506. void anmenlingsy()
  507. {
  508. uint j;
  509. for(j=0;j<500;j++)
  510. {
  511. beep=0;
  512. delay_50us(1);
  513. beep=1;
  514. delay_50ms(10);
  515. }
  516. }
  517. //提示音
  518. void tishiyin1()
  519. {
  520. uint i;
  521. for(i=0;i<100;i++)
  522. {
  523. beep=0;
  524. delay_50us(5);
  525. beep=1;
  526. delay_50us(5);
  527. }
  528. }
  529. //提示音2
  530. void tishiyin2()
  531. {
  532. uint i;
  533. for(i=0;i<1000;i++)
  534. {
  535. beep=0;
  536. delay_50us(1);
  537. beep=1;
  538. delay_50us(1);
  539. }
  540. }
  541. //A函数的作用:当没有按键按下的时候停在这个界面,当有按键按下的时候返回
  542. //control控制的界面
  543. void  control_A()
  544. {

  545.   uchar temp1;
  546. delay_50ms(1000);
  547. write_zl(0x01);
  548. jiemian_mr();
  549. temp1=input();
  550. if(temp1!=0x99)
  551. ;
  552. }
  553. //在control控制界面下C按键所确定的函数
  554. //按下C之后步进电机关门,然后经过短暂延时重新回到control所确定的界面
  555. void  control_C()
  556. {
  557.    bjzz();
  558.    delay_50ms(500);
  559. }
  560. //***************非密码按键的控制函数***************************
  561. //***此函数的作用即判断A,B,D,E,F,*,#这几个按键的按下************
  562. void control()//流程控制函数
  563. {
  564.   control_gn='Z';
  565.   jiemian_yr();                                                                                   //显示家中有人的界面
  566.   control_gn=input();
  567.   if(control_gn!='Z')
  568.   {
  569.   delay_50ms(100);
  570.   switch(control_gn)
  571.   {
  572.   case 'A':{control_A();delay_50ms(100);break;}                  //人离开家的时候按下A使得显示界面换成家中无人的界面                                                                                                                  // 否则默认的都是家中有人
  573.   case 'B':{anmenlingsy();delay_50ms(10);break;}                //B键用于门外按门铃
  574.   case 'C':{control_C();delay_50ms(10);break;}                  //C键的作用是室外的关门,仅用于关门
  575.   case 'D':{control();break;}       
  576.   case '*':{write_zl(0x01);panduancz();delay_50ms(10);break;}   //*键的作用 清除原有界面 后密码重置
  577.   case '#':{write_zl(0x01);delay_50ms(100);panduankg();break;}   //#键的作用是门外经过密码验证后开门                                               
  578.   default: {break;}
  579.   }
  580.   }                                         
  581. }
  582. void mnkai() interrupt 0//门内开
  583. {
  584. delay_50ms(100);
  585. bjzz();
  586. }
  587. void mnguan() interrupt 2//门内关
  588. {
  589. delay_50ms(100);
  590. bjdz();
  591. }
  592. void main()
  593. {         
  594.         EA=1; //打开终端总开关
  595.         EX0=1;//打开外部中断0
  596.         EX1=1;
  597.         IT0=0;//外部中断0是低电平触发
  598.         IT1=0;
  599.         P3=0x0f;//使步进电机的ABCD端的初始化都为低电平
  600.          while(1)
  601.          {
  602.          inti1();
  603.           control();     
  604.          }               
  605. }
复制代码
回复

使用道具 举报

ID:1 发表于 2015-12-7 18:03 | 显示全部楼层
出现的问题:
问题1: 不能新建数组的问题解决
       原来好好的但是只要新建一个数组就会全部显示出错
   
解决方法:   
        只需在新建数组前加上 code即可

问题2:  步进电机发热严重

解决方法:
        步进电机的数据口,初始化都设为低电平

问题3:
       键盘的扫描函数出现问题
解决方法   按部进行排查。自己模拟

问题4:
      蜂鸣器的发声声音小
解决方法, 经过排查发现没有给驱动电路加偏置电压,加偏压后解决
问题5:   单片机不能烧录进去程序
解决方法:
        不能烧录进去程序的原因是,加上了步进电机,使得单片机不能得到足够的电压以写入程序
        去掉步进电机,再次烧录-----ok
问题6:
   在LCD上的显示地址都不能更改了?
解决方法:------


问题7:不能新建数组
解决方法:
由以下,在每个新建数组的前面加上一个code将其放在 ROM里便可
单片机中c语言中的code
        的code:程序存储区
        data: 固定指前0x00--0x7f的128个RAM,可以用ACC直接读写的,速度快,生成的代码也小
        idata: 固定指前面0x00--0xff的256个RAM,其中前128和data的完全一样,只是因为访问方式不同。
        idata类似于c语言中的指针访问方式。汇编中的语言为 MOX ACC(c中的idata做指针式访问效果很好)
        xdata: 外部的RAM,一般指外部的0x0000---0xffff空间,用DPTR访问
        Pdata: 外部扩展RAM的低256字节,地址出现在A0--A7的上时读写,用M0VX ACC,@Rx读写。这个比较特殊。而且c51对此有bug建议不用
问题8:
为什么必须是全局变量gs?
而i,j不行呢?

问题9

为什么 xiugaicg的显示地址不能更改?
回复

使用道具 举报

ID:98640 发表于 2015-12-8 13:33 | 显示全部楼层
admin 发表于 2015-12-7 18:03
出现的问题:
问题1: 不能新建数组的问题解决
       原来好好的但是只要新建一个数组就会全部显示出错
...

也是辛苦你了啊 本想着rar文件里面有就行了,没想到居然给扒了出来。
回复

使用道具 举报

ID:98924 发表于 2015-12-9 01:50 | 显示全部楼层
划过星空 发表于 2015-12-8 13:33
也是辛苦你了啊 本想着rar文件里面有就行了,没想到居然给扒了出来。

哈哈 拔一拔更清楚 谢谢2楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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