找回密码
 立即注册

QQ登录

只需一步,快速开始

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

keil生成.hex不成功,那位大神帮我修改一下89c52单片机的程序啊,跪谢!(红色为错...

[复制链接]
跳转到指定楼层
楼主
ID:69210 发表于 2014-11-22 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#include<math.h>
#include<lm4229.h>
#defineuchar unsigned char
#defineuint   unsigned int
sbit ADCS=P3^5;
sbit ADDI=P3^7;  
sbit ADDO=P3^7;  
sbitADCLK =P3^6;  
uintx1,y1,z1=0,w1;
ucharad_data,k,n,m,e,num,s;                              //采样值存储
uinttemp1;
sbit beep=P3^0;                                          
charpress_data;                                 //标度变换存储单元
float  press;
unsignedchar ad_alarm,temp;                          //报警值存储单元
unsignedchar abc[5]={48,46,48,48,48};
unsignedchar price_all[6]={48,48,46,48,48,48};
floatprice_unit[10]={5.5,2.8,3.6,4.5,2.4,4.2,3.8,6.0,1.5,0};   //商品初始单价
ucharprice_danjia[5]={48,46,48,48,48};
floatprice;
uintprice_temp1,price_temp2;                             //商品总价      
ucharAdc0832(unsigned char channel);                                                                                                         
voidalarm(void);
voiddata_pro(void);
voiddelay(uint k);
voidkeyscan();
voiddisp_init();
void  price_jisuan();
/************
主函数
************/
voidmain(void)
{
   delay(500);                        //系统延时500ms启动
   //ad_data=0;                       //采样值存储单元初始化为0
   lcd_init();                        //显示初始化
   disp_init();                                      //开始进入欢迎界面
   delay(1000);                                          //延时进入称量画面
   clear_lcd(0,4,40);
   clear_lcd(16,0,100);
   clear_lcd(28,0,40);
   clear_lcd(44,0,100);
   clear_lcd(56,0,40);
   clear_lcd(72,0,100);
   clear_lcd(84,0,40);
   clear_lcd(100,0,100);
   clear_lcd(112,0,40);
   write_lcd(0,8,"实用电子秤");              
       while(1)
    {
         ad_data =Adc0832(0);        //采样值存储单元初始化为0
         alarm();
         data_pro(); //读取重量
         keyscan();  //查询商品种类
         write_lcd(40,0,"------------------------------");
         write_lcd(56,0,"  :");
         write_lcd(56,11,price_danjia);
         write_lcd(56,20,"/千克");
         write_lcd(72,0,"总重量:");
         write_lcd(72,11,abc);
         write_lcd(72,20,"千克");
         write_lcd(88,0,"  :");
         price_jisuan();           //计算出价格
         write_lcd(88,10,price_all);
         write_lcd(88,20,"");
         write_lcd(112,0,"设计学生:0712201-23 ");
       }
}
/************
ADC0832函数
************/
//采集并返回
ucharAdc0832(unsigned char channel)     //AD转换,返回结果
{
     uchar i=0;
    uchar j;
    uint dat=0;
    uchar ndat=0;
    if(channel==0)channel=2;
    if(channel==1)channel=3;
    ADDI=1;
    _nop_();
    _nop_();
    ADCS=0;//拉低CS
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK,形成下降沿1
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK
    ADDI=channel&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK,形成下降沿2
    _nop_();
    _nop_();
    ADCLK=1;//拉高CLK
    ADDI=(channel>>1)&0x1;
    _nop_();
    _nop_();
    ADCLK=0;//拉低CLK,形成下降沿3
    ADDI=1;//控制命令结束
    _nop_();
    _nop_();
    dat=0;
    for(i=0;i<8;i++)
    {
        dat|=ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        dat<<=1;
        if(i==7)dat|=ADDO;
    }  
    for(i=0;i<8;i++)
    {
        j=0;
        j=j|ADDO;//收数据
        ADCLK=1;
        _nop_();
        _nop_();
        ADCLK=0;//形成一次时钟脉冲
        _nop_();
        _nop_();
        j=j<<7;
        ndat=ndat|j;
        if(i<7)ndat>>=1;
    }
    ADCS=1;//拉搞CS
    ADCLK=0;//拉低CLK
    ADDO=1;//拉高数据端,回到初始状态
    dat<<=8;
    dat|=ndat;
    return(dat);            //return ad k         
}
voiddata_pro(void)
{
      unsigned int;                    
        if(0<ad_data<256)                                 
             {                       
                 int vary=ad_data;                                                           
                     press=(0.019531*vary);               
                                                                                                   
                     temp1=(int)(press*1000);            //放大1000倍,便于后面的计算
                   abc[0]=temp1/1000+48;                         //取压力值百位
                     abc[1]=46;
                     abc[2]=(temp1%1000)/100+48;                     //取压力值十位
                     abc[3]=((temp1%1000)%100)/10+48;             //取压力值个位
                     abc[4]=((temp1%1000)%100)%10+48;                     //取压力值十分位
               }         
                     
}
/*****************报警子函数*******************/
voidalarm(void)
{
        if(ad_data>=256)                        
           beep=0;          //则启动报警
        
        else
             beep=1;            
}
voiddelay(uint k)
{
   uint i,j;
   for(i=0;i<k;i++)
    for(j=0;j<100;j++);
}
//开机欢迎界面
voiddisp_init()
{
   write_lcd(0,8,"欢迎使用电子秤");
  write_lcd(16,0,"------------------------------");
   write_lcd(28,0,"设计学生: ");
  write_lcd(44,0,"------------------------------");
   write_lcd(56,0,"班级学号:0712201-23");
  write_lcd(72,0,"------------------------------");
   write_lcd(84,0,"指导老师: ");
   write_lcd(100,0,"------------------------------");
   write_lcd(112,0,"设计日期:2010年6月29日");
}
//键盘服务程序
voidkeyscan()
{
                     P1=0xfe;
                     temp=P1;
                     temp=temp&0xf0;
                     while(temp!=0xf0)
                            {
                                   delay(5);
                                   temp=P1;
                                   temp=temp&0xf0;
                                   while(temp!=0xf0)
                                   {
                                          temp=P1;
                                   switch(temp)
                                          {                                                                                                                           
case0xee:num=1,price=price_unit[0], write_lcd(24,0,"  :       ");
                                                        break;
case0xde:num=2,price=price_unit[1],write_lcd(24,0,"  :        ");
                                                        break;
case0xbe:num=3,price=price_unit[2],write_lcd(24,0,"  :        ");
                                                        break;
case0x7e:num=4,price=price_unit[3],write_lcd(24,0,"  :        ");
                                                        break;
                                          }
                                   while(temp!=0xf0)
                                          {
                                                 temp=P1;
                                                 temp=temp&0xf0;
                                          }
                                   }
                            }
                     P1=0xfd;
                     temp=P1;
                     temp=temp&0xf0;
                     while(temp!=0xf0)
                            {
                                   delay(5);
                                   temp=P1;
                                   temp=temp&0xf0;
                                   while(temp!=0xf0)
                                   {
                                          temp=P1;
                                   switch(temp)
                                          {
case0xed:num=5,price=price_unit[4],write_lcd(24,0,"  :   西     ");
                                                        break;
case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,"  :        ");
                                                        break;
case0xbd:num=7,price=price_unit[6],write_lcd(24,0,"  :        ");
                                                        break;
case0x7d:num=8,price=price_unit[7],write_lcd(24,0,"  :        ");
                                                        break;
                                          }
                                   while(temp!=0xf0)
                                          {
                                                 temp=P1;
                                                 temp=temp&0xf0;
                                          }
                                   }
                            }
                     P1=0xfb;
                     temp=P1;
                     temp=temp&0xf0;
                     while(temp!=0xf0)
                            {
                                   delay(5);
                                   temp=P1;
                                   temp=temp&0xf0;
                                   while(temp!=0xf0)
                                   {
                                          temp=P1;
                                   switch(temp)
                                          {
case0xeb:num=9,price=price_unit[8],write_lcd(24,0,"  :        ");
                                                        break;
case0xdb:num=10,price=price_unit[9],write_lcd(24,0,"  :    商品代码");
                                                        break;
case0xbb:num=11,price=price_unit[1];
                                                        break;
case0x7b:num=12,price=price_unit[2];
                                                        break;
                                          }
                                   while(temp!=0xf0)
                                          {
                                                 temp=P1;
                                                 temp=temp&0xf0;
                                          }
                                   }
                            }
                     P1=0xf7;
                     temp=P1;
                     temp=temp&0xf0;
                     while(temp!=0xf0)
                            {
                                   delay(5);
                                   temp=P1;
                                   temp=temp&0xf0;
                                   while(temp!=0xf0)
                                   {
                                          temp=P1;
                                   switch(temp)
                                          {
                                                 case0xe7:num=13,price=price_unit[3];
                                                        break;
                                                 case0xd7:num=14,price=price_unit[4];
                                                        break;
                                                 case0xb7:num=15,price=price_unit[5];
                                                        break;
                                                 case0x77:num=16,price=price_unit[6];
                                                        break;
                                          }
                                   while(temp!=0xf0)
                                          {
                                                 temp=P1;
                                                 temp=temp&0xf0;
                                          }
                                   }
                            }
       price_temp1=(int)(price*1000);
        price_danjia[0]=price_temp1/1000+48;                            //取单价个位
       price_danjia[1]=46;
        price_danjia[2]=(price_temp1%1000)/100+48;                         //取单价十分位
        price_danjia[3]=((price_temp1%1000)%100)/10+48;                 //取单价百分位
         price_danjia[4]=((price_temp1%1000)%100)%10+48;                //取单价千分位
}
void  price_jisuan()
{
            price_temp2=(int)(price*press*1000);
            price_all[0]=price_temp2/10000+48;
                   price_all[1]=(price_temp2/1000)%10+48;                           
                     price_all[2]=46;
                     price_all[3]=(price_temp2%1000)/100+48;                  
                     price_all[4]=((price_temp2%1000)%100)/10+48;                  
                     price_all[5]=((price_temp2%1000)%100)%10+48;            
}
   

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

使用道具 举报

沙发
ID:68618 发表于 2014-11-22 00:26 | 只看该作者
是不是因为缺少头文件??
回复

使用道具 举报

板凳
ID:68618 发表于 2014-11-22 00:27 | 只看该作者
把下面这个代码保存为 lm4229.h 复制到同一目录下面看看
回复

使用道具 举报

地板
ID:68618 发表于 2014-11-22 00:27 | 只看该作者
#define uchar unsigned char
#define uint unsigned int
#define DATA_PORT   PORTD

//#define WRIT  PORTAbits.RA10             //WR
//#define RD    PORTAbits.RA9        //RD
//#define CD    PORTBbits.RB6        //C/D
//#define CE    PORTBbits.RB7        //CS
//#define RST   PORTBbits.RB8        //RST

#define WRIT  RC3             //WR
#define RD    RC2        //RD
#define CD    RC0        //C/D
#define CE    RC1        //CS
#define RST   RC4        //RST

//===========================================
//              函数声明
//-------------------------------------------
void delay_lcd(uchar);
void write_data(uchar);
void write_com(uchar);
void clr_lcd(uchar,uchar,uint);
void draw_Horizontal(uchar,uchar,uchar);
void draw_Vertical_right(uchar,uchar,uchar);
void draw_Vertical_left(uchar,uchar,uchar);
void write_image(uchar x,uchar y,uchar a,uchar b,uchar *tab_image);

uchar Status=0x00;
//--------------------------------------------
//              读数据函数
//--------------------------------------------
uchar read_data(void)
{
TRISD = 0xff;
CD = 1;           //set CD
RD = 0;           //clear RD
Status = PORTD;
RD = 1;           //set RD
return(Status);
}

//--------------------------------------------
//              写数据函数
//--------------------------------------------
void write_data(uchar dat)
{
//while((read_data()&0x02)!=0x02);
CD=0;          //数据
CE=0;          //LCD使能
WRIT=0;        //写
DATA_PORT=dat; //把数据送到P口
delay_lcd(1);  //当晶振较高时加延时
WRIT=1;        //关写
CE=1;          //关使能
}

//--------------------------------------------
//              写命令函数
//--------------------------------------------
void write_com(uchar com)
{
//while((read_data()&0x01)!=0x01);
CD=1;            //命令
CE=0;
WRIT=0;
DATA_PORT=com;
delay_lcd(1);    //当晶振较高时加延时
WRIT=1;
CE=1;
}
//--------------------------------------------
// 指定位置、长度清屏(//清全屏会更好-goldenspider)
//--------------------------------------------

void clr_lcd(uchar x,uchar y,uint length)
{
uint i,place;
place=x*30+y;
write_data(place&0xff);
write_data(place/256);
write_com(0x24);           //设置
for(i=0;i<length;i++)
write_data(0xff);          //写入空格,清屏
write_com(0xb2);           //关闭自动写
}

//--------------------------------------------
//         LM4229初始化函数
//--------------------------------------------
void lcd_init()
{
write_data(0x00);
write_data(0x00);
write_com(0x40);
//设置CGRAM的起始位置
write_data(30);
write_data(0x00);
write_com(0x41);
write_data(0);        //图形首地址
write_data(0);        //图形首地址
write_com(0x42);      //图形首地址设置
write_data(30);
write_data(0);
write_com(0x43);      //图形区域设置
write_com(0x80);      //设置为OR模式
//write_com(0x84);
write_com(0x98);      //关闭文本显示,开图形显示
//write_com(0x9c);
}



//==================【画线和矩形部分】==============

//--------------------------------------------
//         LM4229在指定位置画横线
//     参数说明:x、y 坐标     a 长度  
//     (a为8的倍数)x:0~29;y:0~127
//--------------------------------------------
void draw_Horizontal(uchar x,uchar y,uchar a)
{
uint place;
uchar j;

//---- 画横线长 a -----
place=x+y*30;
write_data(place&0xff);   //写地址低8位
write_data(place>>8);     //写地址高8位
write_com(0x24);          //设置地址
write_com(0xb0);          //设置数据自动写
for(j=0;j<a/8;j++)        //a/8列数据
{write_data(0xff);}
write_com(0xb2);         //自动复位
}

//==================【画线和矩形部分】==============

//--------------------------------------------
//         LM4229在指定位置画虚线(横)
//      参数说明:x、y 坐标     a 长度  
//      (a为8的倍数)x:0~29;y:0~127
//--------------------------------------------
void draw_DottedLine(uchar x,uchar y,uchar a)
{
uint place;
uchar j;

//---- 画横线长 a -----
place=x+y*30;
write_data(place&0xff);   //写地址低8位
write_data(place>>8);     //写地址高8位
write_com(0x24);          //设置地址
write_com(0xb0);          //设置数据自动写
for(j=0;j<a/8;j++)        //a/8列数据
{write_data(0x3c);}
write_com(0xb2);         //自动复位
}

//--------------------------------------------
//         LM4229在指定位置画竖线(左)
// 参数说明:x、y 坐标     b 长度   0000 0001   
//--------------------------------------------
void draw_Vertical_left(uchar x,uchar y,uchar b)
{
uint place;
uchar j;
place=x+y*30;
for(j=0;j<b;j++)              
{
    write_data(place&0xff);   //写地址低8位
    write_data(place>>8);     //写地址高8位
    write_com(0x24);          //设置地址
    write_com(0xb0);          //设置数据自动写
    write_data(0x80);         //数据位1居中较妥当--goldenspider
    write_com(0xb2);          //自动复位
    place=place+30;
}
}

//--------------------------------------------
//         LM4229在指定位置画竖线(右)
//   参数说明:x、y 坐标     b 长度   1000 0000   
//--------------------------------------------

void draw_Vertical_right(uchar x,uchar y,uchar b)
{
uint place;
uchar j;
place=x+y*30;
for(j=0;j<b;j++)              //a/8列数据
{
    write_data(place&0xff);   //写地址低8位
    write_data(place>>8);     //写地址高8位
    write_com(0x24);          //设置地址
    write_com(0xb0);          //设置数据自动写
    write_data(0x01);
    write_com(0xb2);          //自动复位
    place=place+30;
}
}

//--------------------------------------------
//         LM4229在指定位置画矩形a*b
//     参数说明:x、y 坐标     a、b 长度
//     调用到上面几个函数 x:0~29;y:0~127
//--------------------------------------------
void draw_rect(uchar x,uchar y,uchar a,uchar b)
{
draw_Vertical_right(x+a/8-1,y,b);  //画右宽
draw_Vertical_left(x,y,b);         //画左宽
draw_Horizontal(x,y,a);            //画上边
draw_Horizontal(x,y+b,a);          //画下边
}

//==================【显示图片部分】====================

//--------------------------------------------
//               纵向显示字符
//         LM4229在指定位置显示a*b图片
//     a为图片宽,b为图片高(a为8的倍数)
//--------------------------------------------
void write_image(uchar x,uchar y,uchar a,uchar b,uchar *tab_image)
{
uint place;
uchar i,j;
place=x+y*30;
for(i=0;i<b;i++)              //b行数据
{
    write_data(place&0xff);   //写地址低8位
    write_data(place>>8);     //写地址高8位
    write_com(0x24);          //设置地址
    write_com(0xb0);          //设置数据自动写
    for(j=0;j<a/8;j++)        //a/8列数据
    {write_data(tab_image[(a/8)*i+j]);}
    write_com(0xb2);          //自动复位
    place=place+30;           //换行
}
}

//-------------------------------------------------------
//                 横向显示字符
//          LM4229在指定位置显示a*b图片
//n为字符个数(图片长),a为字符宽(a为8的倍数)b为字符高
//--------------------------------------------------------
void write_Char(uchar x,uchar y,uchar a,uchar b,uchar n,uchar *tab_image)
{
uint place;
uchar i,j,k;
place=x+y*30;
for(k=0;k<n;k++)
{
  for(i=0;i<b;i++)            //b行数据
  {
    write_data(place&0xff);   //写地址低8位
    write_data(place>>8);     //写地址高8位
    write_com(0x24);          //设置地址
    write_com(0xb0);          //设置数据自动写
    for(j=0;j<a/8;j++)        //a/8列数据
    {write_data(~tab_image[k*(a/8)*b+(a/8)*i+j]);}
    write_com(0xb2);          //自动复位
    place=place+30;           //换行
    if(i==(b-1))
    place=x+y*30+(k*a/8);
  }
    place=place+a/8;
}
}

//--------------------------------------------
//              延时函数
//--------------------------------------------
void delay_lcd(uchar t)
{
for(;t!=0; t--);
}

//===================================================
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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