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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1679|回復: 1
打印 上一主題 下一主題
收起左側

求助,幫忙完善程序 缺少使用矩陣鍵盤控制單價,然后計算物品金額并累加

[復制鏈接]
跳轉到指定樓層
樓主
ID:386561 發表于 2018-8-22 17:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為剛才有亂碼,所以我重發一下,還是剛才的問題,缺少一個通過矩陣鍵盤控制單價,以及計算物品金額并實現金額累加并顯示......

  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <intrins.h>


  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define DataPort P0
  8. #define KeyPort P1
  9. unsigned char KeyScan(void);//鍵盤掃描
  10. unsigned char KeyPro(void);

  11.   sbit ADDO = P3^6;
  12.   sbit ADSK = P3^7;
  13.   sbit rest = P3^5;

  14. unsigned int num;
  15. unsigned int poi;
  16.   unsigned int dnf;
  17.   unsigned int i;
  18. //////////////////////////


  19. /*-----------------------------------------------
  20.   LCD12864引腳接口
  21. ------------------------------------------------*/
  22. sbit RS = P2^4;
  23. sbit RW = P2^5;
  24. sbit E  = P2^6;
  25. sbit RES = P2^3;
  26. sbit PSB = P2^1;
  27. sbit PAUSE = P3^0;
  28. #define KeyPort P1

  29. unsigned char temp[16];
  30. unsigned char lol[16];

  31. void DelayUs2x(unsigned char t)
  32. {   
  33. while(--t);
  34. }
  35. void DelayMs(unsigned char t)
  36. {
  37.      
  38. while(t--)
  39. {
  40.      //大致延時1mS
  41.      DelayUs2x(245);
  42.          DelayUs2x(245);
  43. }
  44. }
  45. /*------------------------------------------------
  46.                     檢測忙位
  47. ------------------------------------------------*/
  48. void Check_Busy()
  49. {  
  50.     RS=0;
  51.     RW=1;
  52.     E=1;
  53.     DataPort=0xff;
  54.     while((DataPort&0x80)==0x80);//忙則等待
  55.     E=0;
  56. }
  57. /*------------------------------------------------
  58.                    寫命令
  59. ------------------------------------------------*/
  60. void Write_Cmd(unsigned char Cmd)
  61. {
  62.         Check_Busy();
  63.         RS=0;
  64.         RW=0;
  65.         E=1;
  66.         DataPort=Cmd;
  67.         DelayUs2x(5);
  68.         E=0;
  69.         DelayUs2x(5);
  70. }
  71. /*------------------------------------------------
  72.                     寫數據
  73. ------------------------------------------------*/
  74. void Write_Data(unsigned char Data)
  75. {
  76.         Check_Busy();
  77.         RS=1;
  78.         RW=0;
  79.         E=1;
  80.         DataPort=Data;
  81.         DelayUs2x(5);
  82.         E=0;
  83.         DelayUs2x(5);
  84. }
  85. /*------------------------------------------------
  86.                    液晶屏初始化
  87. ------------------------------------------------*/
  88. void Init_ST7920()
  89. {  
  90.    DelayMs(40);           //大于40MS的延時程序
  91.    PSB=1;                 //設置為8BIT并口工作模式
  92.    DelayMs(1);            //延時
  93.    RES=0;                 //復位
  94.    DelayMs(1);            //延時
  95.    RES=1;                 //復位置高
  96.    DelayMs(10);
  97.    Write_Cmd(0x30);       //選擇基本指令集
  98.    DelayUs2x(50);         //延時大于100us
  99.    Write_Cmd(0x30);       //選擇8bit數據流
  100.    DelayUs2x(20);         //延時大于37us
  101.    Write_Cmd(0x0c);       //開顯示(無游標、不反白)
  102.    DelayUs2x(50);         //延時大于100us
  103.    Write_Cmd(0x01);       //清除顯示,并且設定地址指針為00H
  104.    DelayMs(15);           //延時大于10ms
  105.    Write_Cmd(0x06);       //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
  106.    DelayUs2x(50);         //延時大于100us
  107. }

  108.       
  109. /*------------------------------------------------
  110.                    顯示字符串
  111. x:橫坐標值,范圍0~8
  112. y:縱坐標值,范圍1~4
  113. ------------------------------------------------*/
  114. void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s)
  115. {
  116. switch(y)
  117.      {
  118.           case 1: Write_Cmd(0x80+x);break;
  119.           case 2: Write_Cmd(0x90+x);break;
  120.           case 3: Write_Cmd(0x88+x);break;
  121.           case 4: Write_Cmd(0x98+x);break;
  122.       default:break;
  123.          }
  124. while(*s>0)
  125.    {
  126.       Write_Data(*s);
  127.       s++;
  128.       DelayUs2x(50);
  129.    }
  130. }
  131. /*------------------------------------------------
  132.                       清屏
  133. ------------------------------------------------*/
  134. void ClrScreen()
  135. {
  136.    Write_Cmd(0x01);
  137.    DelayMs(15);
  138. }
  139. /*------------------------------------------------
  140.                    延時函數
  141. ------------------------------------------------*/
  142. void delay(uchar z)
  143. {
  144.         uchar x;
  145.         for(;z>0;z--)
  146.                 for(x=22;x>0;x--);
  147. }
  148.                   
  149. unsigned long ReadCount(void)
  150. {
  151. unsigned long Count; unsigned char i;
  152. ADSK=0;        //使能AD(PD_SCK 置低)
  153. Count=0;
  154. while(ADDO);        //AD轉換未結束則等待,否則開始讀取
  155. for (i=0;i<24;i++)
  156. {
  157. ADSK=1;        //PD_SCK 置 高 ( 發 送 脈 沖 )
  158. Count=Count<<1; //下降沿來時變量Count左移一位,右側補零
  159. ADSK=0;        //PD_SCK 置低
  160. if(ADDO) Count++;
  161. }
  162. ADSK=1;
  163. Count=Count^0x800000;//第25個脈沖下降沿來時,轉換數據
  164. ADSK=0;
  165. return(Count);
  166. }
  167. ///////////////////////////////////////////////////////////////// //////////////////////
  168. //jjjjjjjjj
  169. unsigned char KeyScan(void)  //鍵盤掃描函數,使用行列反轉掃描法
  170. {
  171. unsigned char cord_h,cord_l;//行列值中間變量
  172. KeyPort=0x0f;            //行線輸出全為0
  173. cord_h=KeyPort&0x0f;     //讀入列線值
  174. if(cord_h!=0x0f)    //先檢測有無按鍵按下
  175. {
  176.   DelayMs(10);        //去抖
  177.   if((KeyPort&0x0f)!=0x0f)
  178.   {
  179.     cord_h=KeyPort&0x0f;  //讀入列線值
  180.     KeyPort=cord_h|0xf0;  //輸出當前列線值
  181.     cord_l=KeyPort&0xf0;  //讀入行線值

  182.     while((KeyPort&0xf0)!=0xf0);//等待松開并輸出

  183.     return(cord_h+cord_l);//鍵盤最后組合碼值
  184.    }
  185.   }return(0xff);     //返回該值
  186. }

  187. /*------------------------------------------------
  188.               按鍵值處理函數,返回掃鍵值
  189. ------------------------------------------------*/
  190. unsigned char KeyPro(void)
  191. {
  192. switch(KeyScan())
  193. {
  194.   case 0x7e:return 0;break;//0 按下相應的鍵顯示相對應的碼值
  195.   case 0x7d:return 1;break;//1
  196.   case 0x7b:return 2;break;//2
  197.   case 0x77:return 3;break;//3
  198.   case 0xbe:return 4;break;//4
  199.   case 0xbd:return 5;break;//5
  200.   case 0xbb:return 6;break;//6
  201.   case 0xb7:return 7;break;//7
  202.   case 0xde:return 8;break;//8
  203.   case 0xdd:return 9;break;//9
  204.   case 0xdb:return 10;break;//a
  205.   case 0xd7:return 11;break;//b
  206.   case 0xee:return 12;break;//c
  207.   case 0xed:return 13;break;//d
  208.   case 0xeb:return 14;break;//e
  209.   case 0xe7:return 15;break;//f
  210.   default:return 0xff;break;
  211. }
  212. }

  213. /*------------------------------------------------
  214.               主程序
  215. ------------------------------------------------*/
  216. main()
  217. {


  218.   char v=0;
  219. unsigned long   weight   ;
  220. unsigned long   heavy  ;
  221. float                     heavy1 ;
  222. int d1,d2;
  223.         ClrScreen();
  224.     Init_ST7920();   //初始化
  225. heavy= ReadCount();        DelayMs(100);
  226. heavy= ReadCount();        DelayMs(100);
  227. heavy= ReadCount();        DelayMs(100);
  228. while (1)
  229. {

  230. for( v=0;v<2;v++)
  231.   {        weight += ReadCount();     }         
  232.   weight =weight/3;
  233. heavy1= weight-heavy  ;
  234. heavy1= (float)heavy1/2286.3;
  235.         DelayMs(150);        DelayMs(150);
  236. if(heavy1>10000)heavy1=0;
  237. d1 = weight / 1000;        d2 = weight % 1000;


  238. //int num=KeyPro();        

  239. dnf=heavy1;
  240. num=1;
  241. poi=num*dnf;
  242. i=poi;










  243.                 sprintf(temp,"重量:%5.2f g       " ,heavy1 );
  244.                 LCD_PutString(0,1, temp);
  245.                 sprintf(temp,"單價:%4d 元/g ",num);
  246.                 LCD_PutString(0,2, temp);
  247.                 sprintf(lol,"總價:%4d 元/g",poi);
  248.                 LCD_PutString(0,3, lol);
  249.                 sprintf(temp," %4d%-d          ",d1,d2);
  250.             LCD_PutString(0,4, temp);
  251.                 DelayMs(200);        
  252.         
  253.         



  254.              if(!rest)
  255.            {DelayMs(10);
  256.            if(!rest)        
  257.                  while(!rest);
  258.                  {  heavy= ReadCount();} }


  259. }
  260. }

復制代碼

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

使用道具 舉報

沙發
ID:386561 發表于 2018-8-22 18:31 | 只看該作者
想到一個解決方案,我設置兩個按鍵,然后一個負責記錄當前總價,一個負責輸出共計金額,然后這樣的程序應該怎么寫呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本亚洲一区 | 青青久在线视频 | 久久久久久看片 | 免费国产一区二区视频 | 亚洲理论在线观看电影 | 在线播放国产一区二区三区 | 精品国产一区二区三区久久久久久 | 黄色一级毛片免费看 | 午夜免费看视频 | 国产精品欧美大片 | 久久精品91久久久久久再现 | 国产在线一区观看 | 色综合天天天天做夜夜夜夜做 | 成人国内精品久久久久一区 | 午夜成人免费电影 | 国产精品网页 | 国产精品久久国产精品 | 成人在线国产 | 久草视频在线播放 | 日韩精品久久一区二区三区 | 99精品欧美一区二区三区 | 欧美一级片在线观看 | 999精品在线观看 | 久久99蜜桃综合影院免费观看 | 一区二区三区国产 | 午夜精品一区二区三区在线观看 | 手机看片1| 免费久 | 久久久久一区二区三区四区 | 美女视频黄的免费 | 国精产品一区一区三区免费完 | 国产成人jvid在线播放 | 欧美日韩在线一区二区 | 日日摸夜夜添夜夜添精品视频 | 免费观看黄a一级视频 | 精品久久久久香蕉网 | 成人免费三级电影 | 成人福利影院 | 成人特级毛片 | 国产日韩视频在线 | 亚洲一区二区免费电影 |