找回密码
 立即注册

QQ登录

只需一步,快速开始

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

差动桥智能电子秤的单片机源程序与原理图 1602矩阵键盘+ADC0832

[复制链接]
跳转到指定楼层
楼主
ID:349802 发表于 2018-7-5 18:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个关于电子秤的毕业设计程序 1602矩阵键盘+ADC0832。大家可以参考
附件里面有原理图

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint   unsigned int
  5. #define BUSY  0x80          //常量定义
  6. #define DATAPORT P0

  7. #define ADCOFFSET 12
  8. #define GAIN 17.857

  9. //ADC0832的引脚
  10. sbit ADCS =P2^4;  //ADC0832 chip seclect
  11. sbit ADDI =P2^0;  //ADC0832 k in
  12. sbit ADDO =P2^1;  //ADC0832 k out
  13. sbit ADCLK =P2^2;  //ADC0832 clock signal

  14. sbit LCM_RS=P2^7;
  15. sbit LCM_RW=P2^6;
  16. sbit LCM_EN=P2^5;

  17. sbit KEY_IN_1 = P1^7;
  18. sbit KEY_IN_2 = P1^6;
  19. sbit KEY_IN_3 = P1^5;
  20. sbit KEY_IN_4 = P1^4;
  21. sbit KEY_OUT_1 = P1^0;
  22. sbit KEY_OUT_2 = P1^1;
  23. sbit KEY_OUT_3 = P1^2;
  24. sbit KEY_OUT_4 = P1^3;


  25. char TestModeFlag = 0;   //实验模式选项,单臂 半桥 全桥 0 1 2
  26. char WeigherModeflag = 0;
  27. char TestOrWeigher = 0;
  28. char IsExistPoint = 0;
  29. char IsInput = 0;
  30. char InputIndex = 0;
  31. char ShowWigherFlag = 0;
  32. unsigned char PriceArray[5] = {'0','0','0','0','0'};
  33. float voltage = 0;
  34. float weight = 123.4;
  35. float UnitPrice = 0;
  36. float TotalPrice = 0;
  37. float Shelling = 0;
  38. float K_D = 0.1764;
  39. float K_B = 0.3805;
  40. float K_Q = 0.7541;

  41. float B_D = 0.3636;
  42. float B_B = -0.4091;
  43. float B_Q = -0.1364;

  44. long ad_data;
  45. unsigned long AD_Sum = 0;

  46. unsigned long TimerCnt  =0;

  47. sbit Beep =P3^2;                         //超过重量表量程最大值红色led报警定义
  48. unsigned char AlarmFlag = 0;
  49. //adc采样值存储单元


  50. unsigned char KeySta[4][4] = {
  51.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  52.         };

  53. unsigned char code KeyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表
  54.     { 0x01, 0x02, 0x03, 'U' }, //数字键1、数字键2、数字键3、向上键
  55.     { 0x04, 0x05, 0x06, 'D' }, //数字键4、数字键5、数字键6、向下键
  56.     { 0x07, 0x08, 0x09, 'E' }, //数字键7、数字键8、数字键9、向下键
  57.     { 0x00, '.',  'L',  'R' }  //数字键0、ESC键、  回车键、 向右键
  58.         };

  59. void  KeyDriver();
  60. void Showfolat_1(uchar X,uchar Y,float num);
  61. void Showfolat_2(uchar X,uchar Y,float num);
  62. void delay(uint);
  63. void lcd_wait(void);
  64. void delay_LCM(uint);                                                 //LCD延时子程序
  65. void initLCM( void);                                                       //LCD初始化子程序
  66. void lcd_wait(void);                                                      //LCD检测忙子程序
  67. void WriteCommandLCM(uchar WCLCM,uchar BusyC);      //写指令到ICM子函数
  68. void WriteDataLCM(uchar WDLCM);                     //写数据到LCM子函数
  69. void DisplayOneChar(uchar X,uchar Y,uchar DData);        //显示指定坐标的一个字符子函数
  70. void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数

  71. void WeigherModeDisplay();
  72. void TestModeDisplay();
  73.                                                      //系统显示子函数
  74. uchar Adc0832(unsigned char channel);                                                                                                                       

  75. void alarm(void);

  76. /**********main funcation************/

  77. void main(void)
  78. {
  79.         int i = 0;
  80.                 Beep = 0;
  81.           EA = 1;       //使能总中断
  82.     TMOD = 0x11;  //设置T0为模式1
  83.     TH0  = 0xF8;  //为T0赋初值0xFC67,定时2ms
  84.     TL0  = 0x2F;
  85.     ET0  = 1;     //使能T0中断
  86.     TR0  = 1;     //启动T0
  87.                
  88.                 TH1  = 0x27;  //为T1赋初值0xFC67,定时50ms
  89.     TL1  = 0x10;
  90.     ET1  = 1;     //使能T1中断
  91.     TR1  = 1;     //启动T1
  92.                 Beep = 0;
  93.     delay(500);                      //系统延时500ms启动
  94.           ad_data=0;                       //采样值存储单元初始化为0
  95.            initLCM( );
  96.     Beep = 0;   
  97.            WriteCommandLCM(0x01,1);                    //清显示屏
  98.     //DisplayListChar(0,0,str0);
  99.                 WriteCommandLCM(0x01,0);
  100.            //DisplayListChar(0,1,str2);
  101.                 Beep = 0;
  102.         while(1)
  103.     {
  104.                                 ad_data = 0;
  105.                                 for(i=0;i<400;i++)
  106.               ad_data += Adc0832(0);           //采样值存储单元初始化为0
  107.                                 ad_data/=400;
  108.                                 voltage = ad_data;
  109.                                 //voltage = 1000*ad_data*5.0/255.0/GAIN;
  110.                                
  111.                         //voltage = (ad_data*5.0/255.0)*1000.0/GAIN;
  112.                         if(TestOrWeigher==0)
  113.                         {
  114.                                         TestModeDisplay();
  115.                                         delay(1);
  116.                                         Beep = 0;
  117.                                         DisplayOneChar(14,1,' ');
  118.                                         DisplayOneChar(15,1,' ');
  119.                                        
  120.                         }else if(TestOrWeigher==1)
  121.                         {
  122.                                         WeigherModeDisplay();
  123.                                         alarm();
  124.                                         delay(1);
  125.                         }                       
  126.                          //KeyDriver();
  127.                        
  128. //                         DisplayOneChar(0,0,ad_data/100+'0');
  129. //                   DisplayOneChar(1,0,ad_data/10%10+'0');
  130. //                         DisplayOneChar(2,0,ad_data%10+'0');
  131. //                         delay(500);
  132.          }

  133. }
  134. /*********延时K*1ms,12.000Mhz**********/

  135. void delay(uint k)
  136. {
  137.     uint i,j;
  138.     for(i=0;i<k;i++)
  139.      for(j=0;j<60;j++);
  140.       
  141. }   
  142. /**********写指令到ICM子函数************/

  143. void WriteCommandLCM(uchar WCLCM,uchar BusyC)
  144. {
  145.     if(BusyC)
  146.         lcd_wait();
  147.         DATAPORT=WCLCM;
  148.     LCM_RS=0;                   // 选中指令寄存器
  149.     LCM_RW=0;                       // 写模式       
  150.     LCM_EN=1;   
  151.           _nop_();   
  152.           _nop_();
  153.           _nop_();
  154.     LCM_EN=0;
  155.    
  156. }

  157. /**********写数据到LCM子函数************/

  158. void WriteDataLCM(uchar WDLCM)
  159. {
  160.     lcd_wait( );             //检测忙信号   
  161.         DATAPORT=WDLCM;
  162.     LCM_RS=1;                // 选中数据寄存器
  163.     LCM_RW=0;                    // 写模式
  164.     LCM_EN=1;
  165.     _nop_();
  166.           _nop_();
  167.           _nop_();
  168.     LCM_EN=0;
  169. }

  170. /***********lcm内部等待函数*************/

  171. void lcd_wait(void)
  172. {
  173.     DATAPORT=0xff;             //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
  174.           LCM_EN=1;
  175.     LCM_RS=0;   
  176.     LCM_RW=1;   
  177.     _nop_();
  178.     _nop_();
  179.           _nop_();
  180.     while(DATAPORT&BUSY)  
  181.         {  LCM_EN=0;
  182.            _nop_();
  183.            _nop_();
  184.            LCM_EN=1;
  185.            _nop_();
  186.            _nop_();
  187.            }         
  188.            LCM_EN=0;       
  189.        
  190. }

  191. /**********LCM初始化子函数***********/

  192. void initLCM( )
  193. {   
  194.         DATAPORT=0;       
  195.         delay(15);
  196.         WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
  197.     delay(5);
  198.     WriteCommandLCM(0x38,0);
  199.     delay(5);
  200.     WriteCommandLCM(0x38,0);
  201.     delay(5);

  202.     WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
  203.     WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
  204.     WriteCommandLCM(0x01,1);    //清屏,检测忙信号
  205.     WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
  206.     WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
  207. }

  208. /****显示指定坐标的一个字符子函数****/

  209. void DisplayOneChar(uchar X,uchar Y,uchar DData)

  210. {
  211.     Y&=0x01;
  212.     X&=0x0f;
  213.     if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
  214.     X|=0x80;                    //指令码为地址码+0X80
  215.     WriteCommandLCM(X,1);
  216.     WriteDataLCM(DData);
  217. }

  218. void Showfolat_1(uchar X,uchar Y,float num)
  219. {
  220.         int i = 0;
  221.         unsigned char temp[5]={0};
  222.         int number;
  223.   number = (int)(num*10);
  224.   //int number = 12345;
  225.         temp[4] = number%10;
  226.         temp[3] = '.';
  227.         temp[2] = number/10%10;
  228.         temp[1] = number/100%10;
  229.         temp[0] = number/1000%10;
  230. DisplayOneChar(X+4,Y,temp[4]+'0');
  231. DisplayOneChar(X+3,Y,temp[3]);
  232. DisplayOneChar(X+2,Y,temp[2]+'0');
  233. DisplayOneChar(X+1,Y,temp[1]+'0');
  234. DisplayOneChar(X+0,Y,temp[0]+'0');
  235.         if(temp[i]==0)
  236.         {
  237.                 for(i = 0;i<2;i++)
  238.                 {
  239.                         if(temp[i]!=0)break;
  240.                         if(temp[i]==0)DisplayOneChar(X+i,Y,' ');
  241.                 }
  242.         }

  243. }

  244. void Showfolat_2(uchar X,uchar Y,float num)
  245. {
  246.         int i = 0;
  247.         int j = 1;
  248.         int temp[7]={0};
  249.         long number;
  250.   number = (long)(num*100);
  251.   //int number = 12345;
  252.         temp[6] = number%10;
  253.         temp[5] = number/10%10;
  254.         temp[4] = '.';
  255.         temp[3] = number/100%10;
  256.         temp[2] = number/1000%10;
  257.         temp[1] = number/10000%10;
  258.         temp[0] = number/100000%10;
  259. DisplayOneChar(X+6,Y,temp[6]+'0');
  260. DisplayOneChar(X+5,Y,temp[5]+'0');
  261. DisplayOneChar(X+4,Y,temp[4]);
  262. DisplayOneChar(X+3,Y,temp[3]+'0');
  263. DisplayOneChar(X+2,Y,temp[2]+'0');
  264. DisplayOneChar(X+1,Y,temp[1]+'0');
  265. DisplayOneChar(X+0,Y,temp[0]+'0');

  266.         if(temp[i]==0)
  267.         {
  268.                 for(i = 0;i<3;i++)
  269.                 {
  270.                         if(temp[i]!=0)break;
  271.                         if(temp[i]==0)DisplayOneChar(X+i,Y,' ');
  272.                 }
  273.         }

  274. //         for(i = 0;i<7;i++)
  275. //         if(temp[i]==0)DisplayOneChar(X+i,Y,0);
  276. }
  277. void Showfolat_3(uchar X,uchar Y,float num)
  278. {
  279.         int i = 0;
  280.        
  281.         int j = 1;
  282.         int temp[7]={0};
  283.         long number;
  284.   number = (long)(num*1000);
  285.   //int number = 12345;
  286.         temp[6] = number%10;
  287.         temp[5] = number/10%10;
  288.         temp[4] = number/100%10;
  289.         temp[3] = '.';
  290.         temp[2] = number/1000%10;
  291.         temp[1] = number/10000%10;
  292.         temp[0] = number/100000%10;
  293. DisplayOneChar(X+6,Y,temp[6]+'0');
  294. DisplayOneChar(X+5,Y,temp[5]+'0');
  295. DisplayOneChar(X+3,Y,temp[3]);
  296. DisplayOneChar(X+4,Y,temp[4]+'0');
  297. DisplayOneChar(X+2,Y,temp[2]+'0');
  298. DisplayOneChar(X+1,Y,temp[1]+'0');
  299. DisplayOneChar(X+0,Y,temp[0]+'0');
  300.         if(temp[i]==0)
  301.         {
  302.                 for(i = 0;i<2;i++)
  303.                 {
  304.                         if(temp[i]!=0)break;
  305.                         if(temp[i]==0)DisplayOneChar(X+i,Y,' ');
  306.                 }
  307.         }
  308.        
  309. }

  310. void TestModeDisplay()
  311. {
  312. //        
  313. //         float voltage = 0;
  314. // float weight = 0;
  315. // float sensitivity = 0;
  316.         DisplayOneChar(2,0,'U');
  317.         DisplayOneChar(3,0,':');

  318.         if(ShowWigherFlag==1)
  319.         DisplayOneChar(9,0,'W');
  320.         else DisplayOneChar(9,0,' ');
  321.         if(ShowWigherFlag==1)
  322.         DisplayOneChar(10,0,':');
  323.         else DisplayOneChar(10,0,' ');
  324.         if(ShowWigherFlag==1)
  325.         DisplayOneChar(0,1,'S');
  326.         else DisplayOneChar(0,1,' ');
  327.         if(ShowWigherFlag==1)
  328.         DisplayOneChar(1,1,':');
  329.         else DisplayOneChar(1,1,' ');
  330.        
  331.         if(TestModeFlag==0)
  332.         {
  333.                 DisplayOneChar(0,0,'D');
  334.                 if(ShowWigherFlag==1)
  335.                 Showfolat_3(2,1,K_D);
  336.                 else{
  337.                         DisplayOneChar(2,1,' ');
  338.                         DisplayOneChar(3,1,' ');
  339.                         DisplayOneChar(4,1,' ');
  340.                         DisplayOneChar(5,1,' ');
  341.                         DisplayOneChar(6,1,' ');
  342.                         DisplayOneChar(7,1,' ');
  343.                         DisplayOneChar(8,1,' ');
  344.                   DisplayOneChar(9,1,' ');
  345.                         DisplayOneChar(10,1,' ');
  346.                 }
  347.                
  348.                 weight = (voltage - B_D)/K_D;
  349.                 if(voltage==0)weight = 0;
  350.                
  351.                
  352.         }else if(TestModeFlag==1)
  353.         {
  354.                 DisplayOneChar(0,0,'B');
  355.                 if(ShowWigherFlag==1)
  356.                 Showfolat_3(2,1,K_B);
  357.                 else{
  358.                         DisplayOneChar(2,1,' ');
  359.                         DisplayOneChar(3,1,' ');
  360.                         DisplayOneChar(4,1,' ');
  361.                         DisplayOneChar(5,1,' ');
  362.                         DisplayOneChar(6,1,' ');
  363.                         DisplayOneChar(7,1,' ');
  364.                         DisplayOneChar(8,1,' ');
  365.                         DisplayOneChar(9,1,' ');
  366.                         DisplayOneChar(10,1,' ');
  367.                 }
  368.                 weight = (voltage - B_B)/K_B;
  369.                 if(voltage==0)weight = 0;

  370.         }else if(TestModeFlag==2)
  371.         {
  372.                 DisplayOneChar(0,0,'Q');
  373.                 if(ShowWigherFlag==1)
  374.                 Showfolat_3(2,1,K_Q);
  375.                 else{
  376.                         DisplayOneChar(2,1,' ');
  377.                         DisplayOneChar(3,1,' ');
  378.                         DisplayOneChar(4,1,' ');
  379.                         DisplayOneChar(5,1,' ');
  380.                         DisplayOneChar(6,1,' ');
  381.                         DisplayOneChar(7,1,' ');
  382.                         DisplayOneChar(8,1,' ');
  383.                         DisplayOneChar(9,1,' ');
  384.                         DisplayOneChar(10,1,' ');
  385.                 }
  386.                 weight = (voltage - B_Q)/K_Q;
  387.                 if(voltage==0)weight = 0;
  388.         }
  389.        
  390.        
  391.                 Showfolat_1(4,0,voltage);
  392.                 if(ShowWigherFlag==1)
  393.                 {
  394.                         Showfolat_1(11,0,weight);
  395.                 }
  396.                 else
  397.                 {
  398.                         DisplayOneChar(15,0,' ');
  399.                         DisplayOneChar(14,0,' ');
  400.                         DisplayOneChar(13,0,' ');
  401.                         DisplayOneChar(12,0,' ');
  402.                         DisplayOneChar(11,0,' ');
  403.                 }
  404.                
  405. }

  406. void WeigherModeDisplay()
  407. {

  408.         DisplayOneChar(0,0,'W');
  409.         DisplayOneChar(1,0,':');

  410.         if(IsInput == 0)
  411.         {
  412.                 DisplayOneChar(8,0,'U');
  413.                 DisplayOneChar(9,0,'P');
  414.         }
  415.         DisplayOneChar(10,0,':');
  416.        
  417.         DisplayOneChar(0,1,'T');
  418.         DisplayOneChar(1,1,'P');
  419.         DisplayOneChar(2,1,':');

  420.         weight = (voltage-Shelling)*2.0;
  421.         TotalPrice = UnitPrice*weight;
  422.        
  423.                 Showfolat_1(2,0,weight);

  424.                 Showfolat_2(3,1,TotalPrice);
  425.                
  426. }

  427. void KeyAction(unsigned char keycode)
  428. {
  429.         int i = 0;
  430.         int j = 1;
  431.         float k = 0.1;

  432.         //IsExistPoint
  433.        
  434.         if(TestOrWeigher==0)//试验模式
  435.         {
  436.                   if((keycode >= 0x00) &&(keycode <= 0x09))
  437.                         {
  438.                                

  439.                         }else if(keycode == '.')
  440.                         {
  441.                                
  442.                         }else if(keycode == 'E')
  443.                         {
  444.                                 TestOrWeigher = 1;
  445.                                 //Showfolat_2(11,0,12.34);
  446.                         }else if(keycode == 'U')
  447.                         {
  448.                                 TestModeFlag--;
  449.                         }        else if(keycode == 'D')
  450.                         {
  451.                                 TestModeFlag++;
  452.                         }else if(keycode == 'L')
  453.                         {
  454.                                 ShowWigherFlag = 0;
  455.                                 WriteCommandLCM(0x01,1);                    //清显示屏
  456.                                 WriteCommandLCM(0x01,0);                    //清显示屏
  457.                                
  458.                         }else if(keycode == 'R')
  459.                         {
  460.                                 ShowWigherFlag = 1;
  461.                                 WriteCommandLCM(0x01,1);                    //清显示屏
  462.                                 WriteCommandLCM(0x01,0);                    //清显示屏
  463.                         }
  464.                        
  465.                         if(TestModeFlag<=0)TestModeFlag = 0;
  466.                         if(TestModeFlag>=2)TestModeFlag = 2;
  467.                        
  468.         }else if(TestOrWeigher==1)
  469.         {
  470.                         if((keycode >= 0x00) &&(keycode <= 0x09))
  471.                         {
  472.                                 if(IsInput)
  473.                                 {
  474.                                         //DisplayOneChar(13,1,InputIndex+'0');
  475.                                         switch(InputIndex)
  476.                                         {
  477.                                                 case 0:
  478.                                                 PriceArray[4] = keycode+'0';
  479.                                                                        
  480.                                                 break;
  481.                                                 case 1:
  482.                                                 PriceArray[3] = PriceArray[4];
  483.                                                 PriceArray[4] = keycode+'0';       
  484.                                                 break;
  485.                                                 case 2:
  486.                                                 PriceArray[2] = PriceArray[3];
  487.                                                 PriceArray[3] = PriceArray[4];
  488.                                                 PriceArray[4] = keycode+'0';       
  489.                                                 break;
  490.                                                 case 3:
  491.                                                 PriceArray[1] = PriceArray[2];
  492.                                                 PriceArray[2] = PriceArray[3];
  493.                                                 PriceArray[3] = PriceArray[4];
  494.                                                 PriceArray[4] = keycode+'0';               
  495.                                                 break;
  496.                                                 case 4:
  497.                                                 PriceArray[0] = PriceArray[1];       
  498.                               PriceArray[1] = PriceArray[2];
  499.                                                 PriceArray[2] = PriceArray[3];
  500.                                                 PriceArray[3] = PriceArray[4];
  501.                                                 PriceArray[4] = keycode+'0';       
  502.                                                 break;
  503.                                                 default:break;
  504.                                         }
  505.                                 }
  506.                                 InputIndex++;
  507.                                 if(InputIndex>4)InputIndex=5;
  508.                                
  509.                                
  510.                                
  511.                                 //DisplayOneChar(0,1,keycode+'0');

  512.                         }else if(keycode == '.')
  513.                         {
  514.                                 if(IsInput)
  515.                                 {
  516.                                         switch(InputIndex)
  517.                                         {
  518.                                                 case 0:
  519.                                                 PriceArray[4] = '.';
  520.                                                 break;
  521.                                                 case 1:
  522.                                                 PriceArray[3] = PriceArray[4];
  523.                                                 PriceArray[4] = '.';
  524.                                                 break;
  525.                                                 case 2:
  526.                                                 PriceArray[2] = PriceArray[3];
  527.                                                 PriceArray[3] = PriceArray[4];
  528.                                                 PriceArray[4] = '.';       
  529.                                                 break;
  530.                                                 case 3:
  531.                                                 PriceArray[1] = PriceArray[2];
  532.                                                 PriceArray[2] = PriceArray[3];
  533.                                                 PriceArray[3] = PriceArray[4];
  534.                                                 PriceArray[4] = '.';               
  535.                                                 break;
  536.                                                 case 4:
  537.                                                 PriceArray[0] = PriceArray[1];       
  538.                               PriceArray[1] = PriceArray[2];
  539.                                                 PriceArray[2] = PriceArray[3];
  540.                                                 PriceArray[3] = PriceArray[4];
  541.                                                 PriceArray[4] = '.';
  542.                                                 break;
  543.                                                 default:break;
  544.                                         }
  545.                                 }
  546.                                 IsExistPoint = InputIndex;
  547.                                 InputIndex++;
  548.                         }else if(keycode == 'E')
  549.                         {
  550.                                 TestOrWeigher = 0;
  551.                         }else if(keycode == 'U')
  552.                         {
  553.                                 IsInput = 1;
  554.                                 InputIndex = 0;
  555.                                 for(i = 0;i<5;i++)
  556.                                 PriceArray[i] = 0+'0';
  557.                                 UnitPrice = 0;
  558.                                
  559.                         }        else if(keycode == 'D')
  560.                         {
  561.                                 IsExistPoint = 5;
  562.                                 for(i = 0;i<5;i++)
  563.                                 {
  564.                                         if(PriceArray[i]=='.')
  565.                                         {
  566.                                                         IsExistPoint = i;
  567.                                                                 break;
  568.                                         }
  569.                                        
  570.                                 }
  571.                                 for(i=IsExistPoint-1;i>=0;i--)
  572.                                 {
  573.                                                 UnitPrice += j*(PriceArray[i]-'0');
  574.                                                 j*=10;
  575.                                 }
  576.                                 for(i=IsExistPoint+1;i<5;i++)
  577.                                 {
  578.                                                 UnitPrice += k*(PriceArray[i]-'0');
  579.                                                 k*=0.1;
  580.                                 }
  581.        
  582.                                 //Showfolat_2(3,1,UnitPrice);
  583.                                  IsInput = 0;
  584.                         }else if(keycode == 'L')
  585.                         {
  586.                                 //DisplayOneChar(0,1,keycode);
  587.                                 Shelling = voltage;
  588.                         }else if(keycode == 'R')
  589.                         {
  590.                                 //DisplayOneChar(0,1,keycode);
  591.                                 Shelling = 0;
  592.                         }
  593.         }
  594.                

  595.                                 for(i = 0;i<5;i++)
  596.                                 {
  597. //                                         if(PriceArray[i]=='0')
  598. //                                         DisplayOneChar(11+i,0,0);
  599. //                                         else
  600.                                         DisplayOneChar(11+i,0,PriceArray[i]);
  601.                                 }
  602.                                
  603. //                                         if(PriceArray[0]==0)
  604. //                                         {
  605. //                                                 for(i = 0;i<3;i++)
  606. //                                                 {
  607. //                                                         if(PriceArray[i]!=0)break;
  608. //                                                         if(PriceArray[i]==0)DisplayOneChar(11+i,0,' ');
  609. //                                                 }
  610. //                                         }

  611. }
  612. void  KeyDriver()
  613. {
  614.         unsigned char i, j;
  615.         static        unsigned char backup [4][4] = {
  616.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  617.         };

  618.         for(i=0; i<4; i++)
  619.                 {
  620.                         for(j=0; j<4; j++)
  621.                         {
  622.                                 if(backup[i][j] != KeySta[i][j])
  623.                                 {
  624.                                         if(backup[i][j] == 0)
  625.                                         {
  626.                                                 KeyAction(KeyCodeMap[i][j]);
  627.                                         }
  628.                                         backup[i][j] = KeySta[i][j];
  629.                                 }
  630.                         }       
  631.                 }

  632.        
  633. }

  634. /* 按键扫描函数,需在定时中断中调用,推荐调用间隔1ms */
  635. void KeyScan()
  636. {
  637.     unsigned char i;
  638.     static unsigned char keyout = 0;   //矩阵按键扫描输出索引
  639.     static unsigned char keybuf[4][4] = {  //矩阵按键扫描缓冲区
  640.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
  641.         {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
  642.     };

  643.     //将一行的4个按键值移入缓冲区
  644.     keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1;
  645.     keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2;
  646.     keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3;
  647.     keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4;
  648.     //消抖后更新按键状态
  649.     for (i=0; i<4; i++)  //每行4个按键,所以循环4次
  650.     {
  651.         if ((keybuf[keyout][i] & 0x0F) == 0x00)
  652.         {   //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下
  653.             KeySta[keyout][i] = 0;
  654.         }
  655.         else if ((keybuf[keyout][i] & 0x0F) == 0x0F)
  656.         {   //连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起
  657.             KeySta[keyout][i] = 1;
  658.         }
  659.     }
  660.     //执行下一次的扫描输出
  661.     keyout++;                //输出索引递增
  662.     keyout = keyout & 0x03;  //索引值加到4即归零
  663.     switch (keyout)          //根据索引,释放当前输出引脚,拉低下次的输出引脚
  664.     {
  665.         case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
  666.         case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
  667.         case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
  668.         case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
  669.         default: break;
  670.     }
  671. }

  672. /************
  673. 读ADC0832函数
  674. ************/

  675. //采集并返回
  676. uchar Adc0832(unsigned char channel)     //AD转换,返回结果
  677. {
  678.     uchar i=0;
  679.     uchar j;
  680.     uint dat=0;
  681.     uchar ndat=0;

  682.     if(channel==0)channel=2;
  683.     if(channel==1)channel=3;
  684.     ADDI=1;
  685.     _nop_();
  686.     _nop_();
  687.     ADCS=0;//拉低CS端
  688.     _nop_();
  689.     _nop_();
  690.     ADCLK=1;//拉高CLK端
  691.     _nop_();
  692.     _nop_();
  693.     ADCLK=0;//拉低CLK端,形成下降沿1
  694.     _nop_();
  695.     _nop_();
  696.     ADCLK=1;//拉高CLK端
  697.     ADDI=channel&0x1;
  698.     _nop_();
  699.     _nop_();
  700.     ADCLK=0;//拉低CLK端,形成下降沿2
  701.     _nop_();
  702.     _nop_();
  703.     ADCLK=1;//拉高CLK端
  704.     ADDI=(channel>>1)&0x1;
  705.     _nop_();
  706.     _nop_();
  707.     ADCLK=0;//拉低CLK端,形成下降沿3
  708.     ADDI=1;//控制命令结束
  709.     _nop_();
  710.     _nop_();
  711.     dat=0;
  712.     for(i=0;i<8;i++)
  713.     {
  714.         dat|=ADDO;//收数据
  715.         ADCLK=1;
  716.         _nop_();
  717.         _nop_();
  718.         ADCLK=0;//形成一次时钟脉冲
  719.         _nop_();
  720.         _nop_();
  721.         dat<<=1;
  722.         if(i==7)dat|=ADDO;
  723.     }  
  724.     for(i=0;i<8;i++)
  725.     {
  726.         j=0;
  727.         j=j|ADDO;//收数据
  728.         ADCLK=1;
  729.         _nop_();
  730.         _nop_();
  731.         ADCLK=0;//形成一次时钟脉冲
  732.         _nop_();
  733.         _nop_();
  734.         j=j<<7;
  735.         ndat=ndat|j;
  736.         if(i<7)ndat>>=1;
  737.     }
  738.     ADCS=1;//拉低CS端
  739.     ADCLK=0;//拉低CLK端
  740. ……………………

  741. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
差动桥智能电子秤毕设.zip (125.6 KB, 下载次数: 38)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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