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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3006|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)計(jì)算器無法仿真成功 求各位大神指導(dǎo)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:169921 發(fā)表于 2017-3-11 18:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


在lcd1602中顯示不出來,連初始化的0都顯示不出來  不知道是程序有問題還是仿真圖有問題,各位大神幫幫忙看看  困擾好久  沒人指導(dǎo)  很難受  睡不著

  1. #include<reg52.h>

  2. sbit key0_in = P3^4;
  3. sbit key1_in = P3^5;
  4. sbit key2_in = P3^6;
  5. sbit key3_in = P3^7;

  6. sbit key0_out = P3^0;
  7. sbit key1_out = P3^1;
  8. sbit key2_out = P3^2;
  9. sbit key3_out = P3^3;
  10. unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤鍵碼的映射表
  11.     { '1',  '2',  '3', 0x26 }, //數(shù)字鍵1、數(shù)字鍵2、數(shù)字鍵3、向上鍵
  12.     { '4',  '5',  '6', 0x25 }, //數(shù)字鍵4、數(shù)字鍵5、數(shù)字鍵6、向左鍵
  13.     { '7',  '8',  '9', 0x28 }, //數(shù)字鍵7、數(shù)字鍵8、數(shù)字鍵9、向下鍵
  14.     { '0', 0x1B, 0x0D, 0x27 }  //數(shù)字鍵0、ESC鍵、  回車鍵、 向右鍵
  15. };
  16. unsigned char pdata KeySta[4][4] = {  //全部矩陣按鍵的當(dāng)前狀態(tài)
  17.     {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}
  18. };

  19. extern unsigned char zfc_date(unsigned char *zfc,signed long date);
  20. extern void numkeyaction(unsigned char n);
  21. extern void operkeyaction(unsigned char type);
  22. extern void reset();
  23. extern void getresult();
  24. extern void  lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc);



  25. void keyaction(unsigned char keycode)  //加減乘除函數(shù)
  26. {
  27.         if((keycode >= '0') && (keycode <= '9'))
  28.         {
  29.                 numkeyaction(keycode -'0');
  30.         }

  31.         if(keycode == 0x26)
  32.         {
  33.                 operkeyaction(0);
  34.         }
  35.         else if(keycode == 0x28)
  36.         {
  37.                 operkeyaction(1);
  38.         }
  39.         else if(keycode == 0x25)
  40.         {
  41.                 operkeyaction(2);
  42.         }
  43.         else if(keycode == 0x27)
  44.         {
  45.                 operkeyaction(3);
  46.         }
  47.         else if(keycode == 0x0D)
  48.         {
  49.                 getresult();        
  50.         }
  51.         else if(keycode == 0x1B)
  52.         {
  53.                 reset();
  54.                 lcdshowdate(15,1,"0");
  55.         }
  56. }


  57. void keydriver()                           //按鍵掃描
  58. {
  59.         unsigned char i;
  60.         unsigned char j;
  61.         static unsigned char  backup[4][4]=
  62. {
  63.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  64. };

  65.         for(i=0;i<4;i++)
  66.         {
  67.                 for(j=0;j<4;j++)
  68.                 {
  69.                         if(backup[i][j]!= KeySta[i][j])
  70.                         {
  71.                                 if(KeySta[i][j]!= 0)
  72.                                 {
  73.                                         keyaction(KeyCodeMap[i][j]);
  74.                                 }
  75.                                   backup[i][j] = KeySta[i][j];
  76.                         }        
  77.                
  78.                 }
  79.         }

  80. }

  81. void keyscanf()
  82. {
  83.         unsigned char i;
  84.         static unsigned char keyout=0;
  85.         static unsigned char keybuf[4][4]={
  86.         {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}
  87.         };

  88.         keybuf[keyout][0]= (keybuf[keyout][0])<< 1 | key0_in;
  89.         keybuf[keyout][1]= (keybuf[keyout][1])<< 1 | key1_in;
  90.         keybuf[keyout][2]= (keybuf[keyout][2])<< 1 | key2_in;
  91.         keybuf[keyout][3]= (keybuf[keyout][3])<< 1 | key3_in;

  92.         for(i=0;i<4;i++)
  93.         {
  94.                 if((keybuf[keyout][i] & 0x0f )==0x00)
  95.                 {
  96.                         KeySta[keyout][i] = 0;
  97.                 }
  98.                 else if        ((keybuf[keyout][i] & 0x0f) == 0x0f)
  99.                 {
  100.                         KeySta[keyout][i] =        1;
  101.                 }
  102.                                 
  103.         }
  104.         keyout++;
  105.         keyout &= 0x03;
  106.         switch (keyout)
  107.         {
  108.                 case 0:        key3_out =1; key0_out =0; break;
  109.                 case 1:        key0_out =1; key1_out =0; break;
  110.                 case 2:        key1_out =1; key2_out =0; break;
  111.                 case 3:        key2_out =1; key3_out =0; break;
  112.                 default: break;
  113.         }
  114. }
  115. /****************************************************lcd配置*******************************************************//
  116. #include<reg52.h>
  117. #define  lcddb P0
  118. sbit rw=P2^1;
  119. sbit rs=P2^0;
  120. sbit en=P2^2;
  121. void delay(unsigned int z)
  122. {
  123.         unsigned int x,y;
  124.         for(x=z;x>0;x--)
  125.                 for(y=110;y>0;y--);
  126. }
  127. void lcdwriteready()         //檢測(cè)是否忙狀態(tài)
  128. {        
  129.         unsigned char zfc;
  130.         lcddb=0xff;
  131.         rw=1;
  132.         rs=0;
  133.         do
  134.         {
  135.                 en=1;
  136.                 zfc=lcddb;
  137.                 en=0;
  138.         }
  139.         while(zfc & 0x80);
  140. }

  141. void lcdwritecom(unsigned char com)                   //寫指令
  142. {
  143.         lcdwriteready();
  144.         rs=0;
  145.         rw=0;
  146.         lcddb=com;
  147.         delay(10);
  148.         en=1;
  149.         delay(10);
  150.         en=0;
  151.         delay(10);
  152. }  

  153. void lcdwritedate(unsigned char date)           //寫數(shù)據(jù)
  154. {
  155.         lcdwriteready();
  156.         rs=1;
  157.         rw=0;
  158.         lcddb=date;
  159.         delay(10);
  160.         en=1;
  161.         delay(10);
  162.         en=0;
  163.         delay(10);
  164. }

  165. void lcdInit()                                                                //初始化lcd
  166. {
  167.         lcdwritecom(0x01);
  168.         lcdwritecom(0x38);
  169.         lcdwritecom(0x0C);
  170.         lcdwritecom(0x06);
  171. }


  172. void lcd_add(unsigned char x,unsigned char y)         //設(shè)置lcd輸入起始地址
  173. {
  174.         unsigned char add;
  175.         if(y==0)
  176.                 add = 0x00 + x;
  177.         else
  178.                 add = 0x40 + x;
  179.         lcdwritecom(add|0x80);
  180. }

  181. void  lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc)                //將轉(zhuǎn)換的字符指針傳入lcd
  182. {
  183.            lcd_add(x,y);
  184.            while(*zfc != '\0')
  185.            {
  186.                            lcdwritedate(*zfc++);        
  187.            }
  188. }

  189. void lcdareaclear(unsigned char x,unsigned char y,unsigned char changdu)                 //局部清除
  190. {
  191.         lcd_add(x,y);
  192.         while(changdu--)
  193.         {
  194.                 lcdwritedate(' ');        
  195.         }
  196. }

  197. void lcdallclear()                                //全屏清除
  198. {
  199.         lcdwritecom(0x01);

  200. }

  201. /*************************************************main.c函數(shù)***********************************************************/
  202. #include<reg52.h>
  203. unsigned char num1=0;
  204. unsigned char num2=0;
  205. unsigned char step=0;
  206. unsigned char oper = 0;
  207. unsigned char T0RH=0;
  208. unsigned char T0RL=0;
  209. unsigned char result=0;
  210. void ConfigTimer0(unsigned int ms);



  211. extern void lcdInit();

  212. extern void  lcdshowdate(unsigned char x,unsigned char y,unsigned char *zfc);                //將轉(zhuǎn)換的字符指針傳入lcd
  213. extern void lcdareaclear(unsigned char x,unsigned char y,unsigned char changdu);                 //局部清除
  214. extern void lcdallclear();                                //全屏清除
  215. extern void keyaction(unsigned char keycode);
  216. extern void keydriver();
  217. extern void keyscanf();


  218. void main()
  219. {
  220.     EA = 1;           //開總中斷
  221.     ConfigTimer0(1);  //配置T0定時(shí)1ms
  222.         lcdInit();    //初始化液晶
  223.     lcdshowdate(15, 1, "0");  //初始顯示一個(gè)數(shù)字0

  224.     while (1)
  225.     {
  226.         keydriver();  //調(diào)用按鍵驅(qū)動(dòng)
  227.     }
  228. }

  229. unsigned char zfc_date(unsigned char *zfc,signed long date)         //數(shù)字轉(zhuǎn)字符串
  230. {
  231.         signed long i = 0;
  232.         unsigned char changdu = 0;
  233.         unsigned char buf[12];

  234.         if(date < 0)
  235.         {
  236.                 date = -date;
  237.                 *zfc++ = '-';
  238.                 changdu++;
  239.         }
  240.         do
  241.         {
  242.                 buf[i++]= date %10;
  243.                 date /= 10;
  244.         }
  245.         while(date > 0);
  246.         changdu += i;                    
  247.         while(i-- > 0)
  248.         {
  249.                 *zfc++ = buf[i] + '0';

  250.         }
  251.         *zfc = '\0';
  252.          
  253.          return changdu;
  254. }

  255. void showoper(unsigned char y, unsigned char type)        //加減乘除函數(shù)
  256. {
  257.         switch(type)
  258.         {
  259.                 case 0: lcdshowdate( 0 , y , "+");
  260.                 case 1: lcdshowdate( 0 , y , "-");
  261.                 case 2: lcdshowdate( 0 , y , "*");
  262.                 case 3: lcdshowdate( 0 , y , "/");
  263.                 default: break;                 //
  264.         }
  265. }

  266. void reset()         //清除
  267. {
  268.         num1 = 0;
  269.         num2 = 0;
  270.         step = 0;
  271.         lcdallclear();                    
  272. }

  273. void numkeyaction(unsigned char n)           //輸入
  274. {
  275.         unsigned char changdu = 0;
  276.         unsigned char zfc[12];
  277.         if(step > 1)
  278.         {
  279.                 reset();
  280.         }
  281.         if(step == 0)
  282.         {
  283.                 num1 = num1*10 + n;
  284.                 changdu = zfc_date(zfc,num1);         //
  285.                 lcdshowdate(16-changdu,1,zfc);
  286.         }
  287.         else
  288.         {
  289.                 num2 = num2*10 + n;
  290.                 changdu =  zfc_date(zfc,num2);                 //
  291.                 lcdshowdate(16-changdu,1,zfc);
  292.         }
  293. }

  294. void operkeyaction(unsigned char type)                //輸入
  295. {        
  296.         unsigned char changdu;
  297.         unsigned char zfc[12];
  298.         if(step == 0)
  299.         {
  300.                 changdu = zfc_date(zfc,num1);
  301.                 lcdareaclear(0,0,16-changdu);
  302.                 lcdshowdate(16-changdu,0,zfc);
  303.                 showoper(1,type);
  304.                 lcdareaclear(1,1,14);
  305.                 lcdshowdate(15,1,"0");        //
  306.                 oper = type;   //
  307.                 step = 1;
  308.         }
  309. }

  310. void getresult()         //結(jié)果
  311. {
  312.         unsigned char changdu;
  313.         unsigned char zfc[12];
  314.         if(step == 1)
  315.         {
  316.                 step = 2;
  317.                 switch(oper)
  318.                 {
  319.                         case 0: result = num1 + num2; break;
  320.                         case 1: result = num1 - num2; break;
  321.                         case 2: result = num1 * num2; break;
  322.                         case 3: result = num1 / num2; break;
  323.                         default: break;
  324.                 }
  325.                 changdu = zfc_date(zfc,num2);
  326.                 showoper(0,oper);
  327.                 lcdareaclear(1,0,16-changdu-1);
  328.                 lcdshowdate(16-changdu,0,zfc);
  329.                 changdu = zfc_date(zfc,result);
  330.                 lcdshowdate(0,1,"=");
  331.                 lcdareaclear(1,1,16-changdu-1);
  332.                 lcdshowdate(16-changdu,1,zfc);
  333.         }        
  334. }



  335. /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
  336. void ConfigTimer0(unsigned int ms)
  337. {
  338.     unsigned long tmp;  //臨時(shí)變量

  339.     tmp = 11059200 / 12;      //定時(shí)器計(jì)數(shù)頻率
  340.     tmp = (tmp * ms) / 1000;  //計(jì)算所需的計(jì)數(shù)值
  341.     tmp = 65536 - tmp;        //計(jì)算定時(shí)器重載值
  342.     tmp = tmp + 12;           //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
  343.     T0RH = (unsigned char)(tmp>>8);  //定時(shí)器重載值拆分為高低字節(jié)
  344.     T0RL = (unsigned char)tmp;
  345.     TMOD &= 0xF0;   //清零T0的控制位
  346.     TMOD |= 0x01;   //配置T0為模式1
  347.     TH0 = T0RH;     //加載T0重載值
  348.     TL0 = T0RL;
  349.     ET0 = 1;        //使能T0中斷
  350.     TR0 = 1;        //啟動(dòng)T0
  351. }
  352. /* T0中斷服務(wù)函數(shù),執(zhí)行按鍵掃描 */
  353. void InterruptTimer0() interrupt 1
  354. {
  355.     TH0 = T0RH;  //重新加載重載值
  356.     TL0 = T0RL;
  357.     keyscanf();   //按鍵掃描
  358. }


復(fù)制代碼

51計(jì)算器.rar

61.5 KB, 下載次數(shù): 6

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:169921 發(fā)表于 2017-3-11 18:06 | 只看該作者
無法顯示,連初始化的0都顯示不出來。請(qǐng)大神指導(dǎo)下我 ,困擾好難受!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:149167 發(fā)表于 2017-3-11 21:43 | 只看該作者
先確認(rèn)接線...排除...再看程序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 操操日| 国产在线精品一区二区 | 欧美色视频免费 | 欧美在线a | 在线观看成年视频 | 国产99久久久国产精品 | 欧美成人免费在线视频 | 欧美在线视频网 | 国产精品中文字幕在线 | 97精品久久 | 免费一看一级毛片 | 日本精品视频在线观看 | 久久精品99国产精品 | 欧美韩一区二区 | 欧美在线天堂 | 久久久xx | 久久精品视频在线观看 | www.日日干| 久久精品国产久精国产 | 欧美日韩最新 | 精品久久国产 | 国产精品久久久久久久久久久久久久 | 国产一区| 五月婷婷丁香婷婷 | 久久国产综合 | 精品亚洲91 | 亚洲精品1区 | 伊人伊人伊人 | 男女免费在线观看视频 | 色久伊人 | 91 在线| 久久精品日产第一区二区三区 | 国产免费一级一级 | 黄瓜av | 天天宗合网 | 日本不卡免费新一二三区 | 国产精品一区二区三区久久 | 国产三级 | 亚洲精品在线免费观看视频 | 中文字幕精品一区 | 亚洲第一区久久 |