找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3289|回复: 6
打印 上一主题 下一主题
收起左侧

为什么我的程序在普中的开发板上能正常运行,但是在proteus仿真时,不能正常运行...

[复制链接]
跳转到指定楼层
楼主


按K2按钮不会显示,

  1. #include <REGX51.H>
  2. #include <stdio.h>
  3. #define u16 unsigned int
  4. #define u8 unsigned char

  5. #define DbPins P0   // 宏定义将P0口用DbPins表示
  6. sbit E = P2^7;   
  7. sbit RS = P2^6;
  8. sbit RW = P2^5;
  9. sbit K1 = P3^1;                  // 四个独立按键
  10. sbit K2 = P3^0;
  11. sbit K3 = P3^2;
  12. sbit K4 = P3^3;
  13. sbit led1 = P2^0;                //左转向灯
  14. sbit led2 = P2^2;                //右转向灯
  15. u16 sign; // 用于判断有无按键被按下          ,0表示有按键按下,1表示没有按键按下
  16. u8 string1_K4[]="left_light_shan";
  17. u8 string2_K4[]="shan 10 xia";
  18. u8 string1_K3[]="right_light_shan";
  19. u8 string2_K3[]="shan 10 xia";
  20. u8 string3[]="IT class 2 huang yuxing";
  21. u16 Key_value;  //用于接收键值的全局变量

  22. u8 string1[]="IT class 2";           //定义要显示的字符
  23. u8 string2[]="huang yuxing";

  24. void delay(u16 ms)
  25. {        
  26.         u16 a,b;
  27.         for(;ms>0 ; ms--)
  28.         {
  29.                 for(b=199;b>0;b--)
  30.                 {
  31.                         for(a=1;a>0;a--) ;
  32.                 }
  33.         }
  34. }


  35. // 写入命令函数
  36. void LcdWriter(u8 com)
  37. {
  38.         E = 0;  //使能信号,1时读取信息,下降沿时执行指令
  39.         RS = 0;  //低电平表示输入指令,高电平表示输入数据
  40.         RW = 0;  //高电平向lcd读取信息,低电平向lcd输入指令或数据
  41.         DbPins = com; //写入命令
  42.         delay(1);  // 延时 保持数据稳定性
  43.         E = 1;   //写入时序
  44.         delay(5);  //保持时间
  45.         E = 0;          //下降沿执行指令

  46. }

  47. // 输出函数
  48. void LcdPrint(u8 date)
  49. {
  50.         E = 0; // 使能清零
  51.         RS = 1; // 选择写入数据
  52.         RW = 0; //选择写入
  53.         DbPins = date; // 写入数据
  54.         delay(1);          // 延时1ms
  55.         E = 1; // 读取信息
  56.         delay(5); //保持时间
  57.         E = 0; // 下降沿执行指令
  58. }

  59. // 初始化函数
  60. void Lcdinit()
  61. {
  62.         LcdWriter(0x38);  //开显示,数据总线为8位显示两行,每个字符为5*7的点阵,
  63.         LcdWriter(0x0c);  // 开显示,不显示光标
  64.         LcdWriter(0x06);   // 写一个指针加1,向右移动
  65.         LcdWriter(0x01);   // 清屏
  66.         LcdWriter(0x80);   // 设置数据指针起点
  67. }



  68. void out_put1()
  69. {
  70.         
  71.         u16 i,j,len1,len2;
  72.         Lcdinit();
  73.         len1 = sizeof(string1)-1;         // 计算字符串长度
  74.                 len2 = sizeof(string2)-1;
  75.                 for(i=0;i<len1;i++)
  76.                 {
  77.                         LcdPrint(string1[i]);
  78.                 }
  79.                
  80.                 LcdWriter(0x40+0x80);
  81.                 for(i=0;i<len2;i++)
  82.                 {
  83.                         LcdPrint(string2[i]);
  84.                 }
  85.                 LcdWriter(0x07);   // 写一个指针加1,向右移动
  86.                 j=50;
  87.                 while(j--)
  88.                 for(i=0;i<len1;i++)
  89.                 {
  90.                         LcdPrint(string3[i]);
  91.                         delay(250);
  92.                 }
  93. }

  94. void out_put()
  95. {
  96. u16 i,len1,len2;
  97.         Lcdinit();  //初始化
  98.         
  99.         len1 = sizeof(string1)-1;         // 计算字符串长度
  100.         len2 = sizeof(string2)-1;
  101.         for(i=0;i<len1;i++)
  102.         {
  103.                 LcdPrint(string1[i]);
  104.         }
  105.         
  106.         LcdWriter(0x40+0x80);
  107.         for(i=0;i<len2;i++)
  108.         {
  109.                 LcdPrint(string2[i]);
  110.         }
  111.         while(1);
  112.         }


  113. // 输出按下K4输出的
  114. void out_put_K4()
  115. {
  116.         
  117.         u16 i,len1,len2;
  118.         Lcdinit();
  119.         len1 = sizeof(string1_K4)-1;         // 计算字符串长度
  120.                 len2 = sizeof(string2_K4)-1;
  121.                 for(i=0;i<len1;i++)
  122.                 {
  123.                         LcdPrint(string1_K4[i]);
  124.                 }
  125.                
  126.                 LcdWriter(0x40+0x80);
  127.                 for(i=0;i<len2;i++)
  128.                 {
  129.                         LcdPrint(string2_K4[i]);
  130.                 }
  131. }


  132. // 输出按下K3输出的
  133. void out_put_K3()
  134. {
  135.         
  136.         u16 i,len1,len2;
  137.         Lcdinit();
  138.         len1 = sizeof(string1_K3)-1;         // 计算字符串长度
  139.                 len2 = sizeof(string2_K3)-1;
  140.                 for(i=0;i<len1;i++)
  141.                 {
  142.                         LcdPrint(string1_K3[i]);
  143.                 }
  144.                
  145.                 LcdWriter(0x40+0x80);
  146.                 for(i=0;i<len2;i++)
  147.                 {
  148.                         LcdPrint(string2_K3[i]);
  149.                 }
  150. }


  151. // 模拟独立按键按钮按下
  152. void K4_but()
  153. {
  154.         u16 a= 0;
  155.         if (K4==0) //K4按下
  156.         {
  157.                 delay(50);  //消抖
  158.                 if(K4 == 0)
  159.                 {
  160.                         Key_value = 16;               
  161.                 }
  162.                
  163.                 while((a>50) && (K4 != 0))
  164.                                 {
  165.                                         a++;
  166.                                 }
  167.                         sign = 0; // 已有按键被按下
  168.                         out_put_K4();

  169.         }
  170.         a= 0;
  171.         if (K3==0) //K3按下
  172.         {
  173.                 delay(50);  //消抖
  174.                 if(K3 == 0)
  175.                 {
  176.                         Key_value = 17;               
  177.                 }
  178.                
  179.                 while((a>50) && (K3 != 0))
  180.                                 {
  181.                                         a++;
  182.                                 }
  183.                         sign = 0; // 已有按键被按下
  184.                         out_put_K3();

  185.         }
  186.         a = 0;
  187.         if (K2==0) //K2按下
  188.         {
  189.                 delay(50);  //消抖
  190.                 if(K2 == 0)
  191.                 {
  192.                         Key_value = 18;        
  193.                                 
  194.                 }
  195.                
  196.                 while((a>50) && (K2 != 0))
  197.                                 {
  198.                                         a++;
  199.                                 }
  200.                         sign = 0; // 已有按键被按下
  201.                         out_put_K2();
  202.         }
  203.         a = 0;
  204.         if (K1==0) //K1按下
  205.         {
  206.                 delay(50);  //消抖
  207.                 if(K1 == 0)
  208.                 {
  209.                         Key_value = 19;               
  210.                 }
  211.                
  212.                 while((a>50) && (K1 != 0))
  213.                                 {
  214.                                         a++;
  215.                                 }
  216.                         sign = 0; // 已有按键被按下
  217.                         out_put();

  218.         }
  219. }





  220. void main()
  221. {
  222.         u16 i;
  223.         sign = 1;  // 无按键被按下
  224.         Lcdinit();  //初始化
  225.         K1 = 1;
  226.         K2 = 1;
  227.         K3 = 1;
  228.         K4 = 1;
  229. do{
  230.         while(sign)
  231.         {
  232.         K4_but();
  233.         }

  234.          if(Key_value == 16)        // 如果k4 按下D1亮
  235.         {
  236.                 for(i = 0;i < 10;i++)        
  237.                         {led1 = 0;
  238.                         delay(100);
  239.                         led1 = ~led1;
  240.                         delay(100);}
  241.                         sign = 1;// 按一次,输入一个字符
  242.         }
  243.         else if(Key_value == 17)  //如果K3按下D3,亮
  244.         {
  245.                 for(i = 0;i < 10;i++)        
  246.                         {led2 = 0;
  247.                         delay(100);
  248.                         led2 = ~led2;
  249.                         delay(100);}
  250.                         sign = 1;// 按一次,输入一个字符
  251.         }
  252.         else if(Key_value == 18)
  253.         {
  254.                
  255.                 out_put();
  256.             sign = 1;
  257.         }

  258.         else
  259.         {
  260.         out_put1();
  261.         sign = 1;
  262.         }
  263.   }        
  264.         while(1);        
  265. }
复制代码


按按钮k1也不会进入我想要的界面

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2021-12-3 09:33 来自触屏版 | 只看该作者
就问问楼主是同一个程序么?
回复

使用道具 举报

板凳
ID:213173 发表于 2021-12-3 11:30 | 只看该作者
楼主的程序在普中的开发板上能正常运行???有没有搞错?这程序放在任何地方都不可能正常运行,甚至不能通过编译。
回复

使用道具 举报

地板
ID:584814 发表于 2021-12-3 14:47 | 只看该作者
因为你的仿真软件不是普中公司开发的
回复

使用道具 举报

5#
ID:908826 发表于 2021-12-3 17:23 | 只看该作者
既然实物都能跑了,还搞仿真干嘛,本来仿真就是辅助实物的。
回复

使用道具 举报

6#
ID:987176 发表于 2021-12-3 19:38 | 只看该作者
wulin 发表于 2021-12-3 11:30
楼主的程序在普中的开发板上能正常运行???有没有搞错?这程序放在任何地方都不可能正常运行,甚至不能通 ...

能在普中的开发板上运行,编译我是调了memory model调成了compact如何解决

普中.jpg (177.48 KB, 下载次数: 39)

普中.jpg

屏幕截图 2021-12-03 193729.png (23.2 KB, 下载次数: 36)

屏幕截图 2021-12-03 193729.png
回复

使用道具 举报

7#
ID:213173 发表于 2021-12-4 10:41 | 只看该作者
坏柠 发表于 2021-12-3 19:38
能在普中的开发板上运行,编译我是调了memory model调成了compact如何解决

不要把函数写得很复杂,若出现错误很难查找。能简化尽量简化。下图是按下K2后字符移动显示。
简化的代码,要添加功能直接加在按键服务函数里即可。
  1. #include <REG51.H>
  2. //#include <stdio.h>
  3. #define u16 unsigned int
  4. #define u8 unsigned char
  5. #define DbPins P0   // 宏定义将P0口用DbPins表示
  6. sbit E  = P2^7;   
  7. sbit RS = P2^6;
  8. sbit RW = P2^5;
  9. sbit K1 = P3^1;                  // 四个独立按键
  10. sbit K2 = P3^0;
  11. sbit K3 = P3^2;
  12. sbit K4 = P3^3;
  13. sbit led1 = P2^0;                //左转向灯
  14. sbit led2 = P2^2;                //右转向灯
  15. //u16 sign; // 用于判断有无按键被按下,0表示有按键按下,1表示没有按键按下
  16. u8 code string0[]="Welcome!";
  17. u8 code string1[]="IT class 2";           //定义要显示的字符
  18. u8 code string2[]="huang yuxing";
  19. u8 code string3[]="    IT class 2 huang yuxing                 ";
  20. u8 code string1_K3[]="right_light_shan";
  21. u8 code string2_K3[]="shan 10 xia     ";
  22. u8 code string1_K4[]="left_light_shan ";
  23. u8 code string2_K4[]="shan 10 xia     ";

  24. u8 Key_value;  //用于接收键值的全局变量

  25. void delay(u16 ms)
  26. {        
  27.         u16 a,b;
  28.         for(a=ms;a>0;a--)
  29.                 for(b=110;b>0;b--);
  30. }
  31. // 写入命令函数
  32. void LcdWriter(u8 com)
  33. {
  34.         E = 0;  //使能信号,1时读取信息,下降沿时执行指令
  35.         RS = 0;  //低电平表示输入指令,高电平表示输入数据
  36.         RW = 0;  //高电平向lcd读取信息,低电平向lcd输入指令或数据
  37.         DbPins = com; //写入命令
  38.         delay(1);  // 延时 保持数据稳定性
  39.         E = 1;   //写入时序
  40.         delay(1);  //保持时间
  41.         E = 0;          //下降沿执行指令
  42. }

  43. // 输出函数
  44. void LcdPrint(u8 date)
  45. {
  46.         E = 0; // 使能清零
  47.         RS = 1; // 选择写入数据
  48.         RW = 0; //选择写入
  49.         DbPins = date; // 写入数据
  50.         delay(1);          // 延时1ms
  51.         E = 1; // 读取信息
  52.         delay(1); //保持时间
  53.         E = 0; // 下降沿执行指令
  54. }

  55. // 初始化函数
  56. void Lcdinit()
  57. {
  58.         LcdWriter(0x38);  //开显示,数据总线为8位显示两行,每个字符为5*7的点阵,
  59.         LcdWriter(0x0c);  // 开显示,不显示光标
  60.         LcdWriter(0x06);   // 写一个指针加1,向右移动
  61.         LcdWriter(0x01);   // 清屏
  62. }

  63. void key_scan()//按键扫描
  64. {
  65.         static u8 count=0;
  66.         static bit sign=0;
  67.         if(!K1||!K2||!K3||!K4)
  68.         {
  69.                 if(++count>=250 && sign==0)
  70.                 {
  71.                         sign=1;
  72.                         if(!K1)Key_value=1;
  73.                         if(!K2)Key_value=2;
  74.                         if(!K3)Key_value=3;
  75.                         if(!K4)Key_value=4;
  76.                 }
  77.         }
  78.         else
  79.         {
  80.                 count=0;
  81.                 sign=0;
  82.         }
  83. }

  84. void key_service()//按键服务函数
  85. {
  86.         u16 i,j,k;
  87.         static bit flag=0;

  88.         switch(Key_value)
  89.         {
  90.                 case 1:
  91.                         LcdWriter(0x01);
  92.                         LcdWriter(0x80);
  93.                         for(i=0;i<16;i++)
  94.                                 LcdPrint(string1[i]);
  95.                         LcdWriter(0xc0);
  96.                         for(i=0;i<16;i++)
  97.                                 LcdPrint(string2[i]);
  98.                         Key_value=0;
  99.                 break;
  100.                 case 2:
  101.                         if(!flag)
  102.                         {
  103.                                 LcdWriter(0x01);
  104.                                 LcdWriter(0x80);
  105.                                 for(i=0;i<16;i++)
  106.                                         LcdPrint(string3[i]);
  107.                                 flag=1;
  108.                         }
  109.                         else
  110.                         {
  111.                                 if(++j>=5000)
  112.                                 {
  113.                                         j=0;
  114.                                         k=++k%28;
  115.                                         LcdWriter(0x01);
  116.                                         LcdWriter(0x80);
  117.                                         for(i=0;i<16;i++)
  118.                                                 LcdPrint(string3[i+k]);
  119.                                 }
  120.                         }
  121. //                        Key_value=0;
  122.                 break;
  123.                 case 3:
  124.                         LcdWriter(0x80);
  125.                         for(i=0;i<16;i++)
  126.                                 LcdPrint(string1_K3[i]);
  127.                         LcdWriter(0xc0);
  128.                         for(i=0;i<16;i++)
  129.                                 LcdPrint(string2_K3[i]);
  130.                         Key_value=0;
  131.                 break;
  132.                 case 4:
  133.                         LcdWriter(0x80);
  134.                         for(i=0;i<16;i++)
  135.                                 LcdPrint(string1_K4[i]);
  136.                         LcdWriter(0xc0);
  137.                         for(i=0;i<16;i++)
  138.                                 LcdPrint(string2_K4[i]);
  139.                         Key_value=0;
  140.                 break;
  141.         }
  142.         if(Key_value!=2)flag=0;
  143. }

  144. void main()
  145. {
  146.         u8 i;
  147.         Lcdinit();
  148.         LcdWriter(0x84);
  149.         for(i=0;i<8;i++)
  150.                 LcdPrint(string0[i]);       
  151.         while(1)
  152.         {
  153.                 key_scan();
  154.                 key_service();
  155.         }
  156. }
复制代码







回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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