找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 3291 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-12-2 13:14

正文摘要:

按K2按钮不会显示, #include <REGX51.H> #include <stdio.h> #define u16 unsigned int #define u8 unsigned char #define DbPins P0   // 宏定义将P0口用DbPins表示 sbit E = P2^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. }
复制代码







ID:908826 发表于 2021-12-3 17:23
既然实物都能跑了,还搞仿真干嘛,本来仿真就是辅助实物的。
ID:584814 发表于 2021-12-3 14:47
因为你的仿真软件不是普中公司开发的
ID:213173 发表于 2021-12-3 11:30
楼主的程序在普中的开发板上能正常运行???有没有搞错?这程序放在任何地方都不可能正常运行,甚至不能通过编译。
ID:96682 发表于 2021-12-3 09:33
就问问楼主是同一个程序么?

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

Powered by 单片机教程网

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