找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助各位大侠,我的程序那里有问题啊?

[复制链接]
跳转到指定楼层
楼主
ID:38720 发表于 2012-4-18 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <reg51.h>
#include <intrins.h> 
#define uchar unsigned char
#define uint  unsigned int
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P2^0;            //液晶读/写控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P2^1;            //串/并方式控制
sbit wela    =  P2^7;
sbit dula    =  P2^6;            //关闭LED灯
sbit wr=P3^6;
sbit rd=P3^7;
sbit fm=P2^3;
uint temp;
uchar p=3,q=1,jianzhi;
uint a1,a2,a3,date,q1;
uchar code dis1[] = {"毕业设计电子秤"};
uchar code dis2[] = {"单价:"};
uchar code dis3[] = {"重量:"};
uchar code dis4[] = {"总价:"};
uchar code table[]="0123456789";
uchar code table1[]="Kg";
uchar code table2[]={"元"};
uchar code dis5[] = {"2012毕业设计电子秤"};
uchar code dis6[] = {"姓名:钱志伟"};
uchar code dis7[] = {"学号:5901108126"};
uchar code dis8[] = {"欢迎老师批评指正"};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};//宏定义延时4个CPU
uchar IRDIS[2];
uchar IRCOM[4];
void delay0(uchar x);  //x*0.14MS
void beep();
void  dataconv();
void lcd_pos(uchar X,uchar Y);  //确定显示位置
     uint AD_read();
     key_read ();
void disp_ad();
void disp_dy();
void disp_kj();
void disp_jianpan(uchar jian);
void  disp_zongjia(uint qian);

void delay(int ms)
{
    while(ms--)
 {
      uchar i;
   for(i=0;i<250;i++) 
    {
     _nop_();     
  _nop_();
  _nop_();
  _nop_();
    }
 }
}  
bit lcd_busy()
 {                         
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
 }
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                         
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                         
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
void lcd_init()
{

    LCD_PSB = 1;         //并口方式
   
    lcd_wcmd(0x34);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0F);      //显示开,开光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}
  main()
 {
    uchar w;
   
    uchar jiage[3];
   
    while(1)
    {
    
    delay(10);                 //延时
    wela=0;
    dula=0;
    lcd_init();                //初始化LCD            
    disp_kj();//开机界面的显示
    delay(500);
     disp_dy();//显示价格重量等固定的文字
       disp_ad();//AD转换值的显示
     while(q)//判断标志位q是否为0,为0表示键盘按了确定键
     { uchar n=2;
       w=key_read ();//调出键值
       disp_jianpan(w);//将键值显示
       jiage[n]=jianzhi;//将键值存入数组中
       p++;
       n--;
     }
     q=1;
      p=3;
     q1=jiage[2]*100+jiage[1]*10+jiage[0];//得到按键数
     disp_zongjia(q1);//总价的计算和显示
   }
}

 

void delay0(uchar x)    //x*0.14MS
{
  uchar i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}
void lcd_pos(uchar X,uchar Y)
{                         
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ; 
   lcd_wcmd(pos);     //显示地址
}
/*AD转换函数*/
uint AD_read()
{
  wela=1;
  P0=0;
  _nop_();
  wr=0;
   _nop_();
  wr=1;
  P0=0xff;
  delay(10);
 
  P0=0;
  rd=0;
  _nop_();
  P1=0xff;
  temp=P1;
  return temp;

}


/*键盘扫描程序*/


   key_read ()
 {
  unsigned char key,key1;
   while(1)
   {
      P3=0xfe;//给P3.0一个低电平
      key1=P3;
      key1=key1&0xf0;
      if(key1!=0xf0)
      {
       delay(10);//取抖
         if(key1!=0xf0)
         {
             
            key1=P3;
            switch(key1)
            {
               case 0xee://选中0号键
                 key=0;
                 break;

               case 0xde://选中1号键
                 key=1;
                 break;

               case 0xbe://选中2号键
                 key=2;
                 break;

               case 0x7e://选中3号键
                 key=3;
                 break;
             }
            }
          }

      P3=0xfd;//给P3.1一个低电平
      key1=P3;
      key1=key1&0xf0;
      if(key1!=0xf0)
      {
       delay(10);//取抖
         if(key1!=0xf0)
         {
             
            key1=P3;
            switch(key1)
            {
               case 0xed://选中4号键
                 key=4;
                 break;

               case 0xdd://选中5号键
                 key=5;
                 break;

               case 0xbd://选中6号键
                 key=6;
                 break;

               case 0x7d://选中7号键
                 key=7;
                 break;
             }
            }
           }

      P3=0xfb;//给P3.2一个低电平
      key1=P3;
      key1=key1&0xf0;
      if(key1!=0xf0)
      {
       delay(10);//取抖
         if(key1!=0xf0)
         {
             
            key1=P3;
            switch(key1)
            {
               case 0xeb://选中8号键
                 key=8;
                 break;

               case 0xdb://选中9号键
                 key=9;
                 break;

               case 0xbb://选中10号键
                 key=10;
                 break;

               case 0x7b://选中11号键
                 key=11;
                 break;
             }
            }
           }

      P3=0xf7;//给P3.3一个低电平
      key1=P3;
      key1=key1&0xf0;
      if(key1!=0xf0)
      {
       delay(10);//取抖
         if(key1!=0xf0)
         {
             
            key1=P3;
            switch(key1)
            {
               case 0xe7://选中12号键
                 key=12;
                 break;

               case 0xd7://选中13号键
                 key=13;
                 break;

               case 0xb7://选中14号键
                 key=14;
                 break;

               case 0x77://选中15号键
                 key=15;
                 break;
             }
            }
           }
      return key;
   }
 }
/*  AD转换数值显示函数*/
void disp_ad()
{
  uint ad_read;
     ad_read=AD_read();//将AD转换函数的返回值调出
    date=(float)ad_read*50.0/256.0;
    a1=date;
    a2=a1/10;
    a3=a1%10;
    lcd_pos(2,3);
      lcd_wdat(table[a2]);
      lcd_pos(2,4);
      lcd_wdat('.');
      lcd_pos(2,5);
      lcd_wdat(table[a3]);
      lcd_pos(2,6);
      lcd_wdat(table1[0]);
     lcd_pos(2,7);
      lcd_wdat(table1[1]);
}
void disp_dy()
{
   uchar i;
   lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
     i = 0;
    while(dis1 != '\0')
     {                         //显示字符
       lcd_wdat(dis1);
       i++;
     }
    lcd_pos(1,0);             //设置显示位置为第二行的第1个字符
     i = 0;
    while(dis2 != '\0')
     {
       lcd_wdat(dis2);      //显示字符
       i++;
     }
   lcd_pos(2,0);             //设置显示位置为第三行的第1个字符
     i = 0;
    while(dis3 != '\0')
     {
       lcd_wdat(dis3);      //显示字符
       i++;
     }
  lcd_pos(3,0);             //设置显示位置为第四行的第1个字符
     i = 0;
    while(dis4 != '\0')
     {
       lcd_wdat(dis4);      //显示字符
       i++;
     }
}

void disp_kj()
{
   uchar i;
   lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
     i = 0;
    while(dis5 != '\0')
     {                         //显示字符
       lcd_wdat(dis1);
       i++;
     }
    lcd_pos(1,0);             //设置显示位置为第二行的第1个字符
     i = 0;
    while(dis6 != '\0')
     {
       lcd_wdat(dis2);      //显示字符
       i++;
     }
   lcd_pos(2,0);             //设置显示位置为第三行的第1个字符
     i = 0;
    while(dis7 != '\0')
     {
       lcd_wdat(dis3);      //显示字符
       i++;
     }
  lcd_pos(3,0);             //设置显示位置为第四行的第1个字符
     i = 0;
    while(dis8 != '\0')
     {
       lcd_wdat(dis4);      //显示字符
       i++;
     }
}

void  disp_jianpan(uchar jian)
{
  uchar a;
  a=jian;
    if(a<10)
       {lcd_pos(1,p);
       lcd_wdat(table[a]);//将键值显示
       jianzhi=table[a];}//if中要执行多个语句时要加大括号,
    else if(a=10)
           q=0;//确认键
        else
          fm=0;//警报响         
}
void  disp_zongjia(uint qian)
{
   uchar z1,z2,z3,z4;
   float q3,q2;
   uint x, z0;
   x=qian;
   q3=a3*0.1+a2;
     q2=x*q3;
     z0=q2*10;
     z1=(int)z0/1000;
     z2=(int)z0%1000/100;
     z3=(int)z0%1000%100/10;
     z4=(int)z0%1000%100%10;
     lcd_pos(3,3);
      lcd_wdat(table[(int)z1]);
      lcd_pos(3,4);
      lcd_wdat(z2);
      lcd_pos(3,5);
      lcd_wdat(table[(int)z3]);
      lcd_pos(3,6);
      lcd_wdat('.');
      lcd_pos(3,7);
      lcd_wdat(table[(int)z4]);
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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