久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2803|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美精品一区二区三区 | 亚洲综合久久网 | 国产不卡在线播放 | 久久久久国产精品 | 成人精品区| 久久天堂 | 亚洲综合婷婷 | 91精品在线播放 | 欧美电影免费网站 | 国产精品欧美精品日韩精品 | 91社区在线观看播放 | 久久成人精品一区二区三区 | 三区四区在线观看 | 九九九久久国产免费 | 免费看一级毛片 | 精品视频在线免费观看 | 国产一区视频在线 | 国产国语精品 | av在线影院 | 久久久久国产一区二区三区 | 99在线视频观看 | 81精品国产乱码久久久久久 | 色婷婷一区二区三区四区 | 在线成人免费视频 | 中文字幕1区2区 | 成人免费网站视频 | 国产成人叼嘿视频在线观看 | 亚洲综合伊人 | 国产欧美一区二区三区日本久久久 | 第四色影音先锋 | 日韩av网址在线观看 | 91看片视频| 天堂一区在线观看 | 成人免费视屏 | 国产日韩欧美激情 | 成人精品鲁一区一区二区 | 欧美日韩精品区 | 亚洲欧美国产精品久久 | 91精品国产91久久综合桃花 | 欧美午夜久久 | 久久免费大片 |