*** FATAL ERROR L256: MODULE CONTAINS DUPLICATE SEGMENT NAMES
SEGMENT: ?PR?_DELAY?1
MODULE: .\1.obj (1)
Target not created
这是怎么回事,程序边玩以后不能编译,求大神帮忙指导,这是单片机模拟自动售货机的实现,控制步进电机驱动出货。
实现目标:
(1)按下“购物”以后,系统启动,显示商品,等待选择。
(2)顾客按键选择商品,显示所选择的商品,。
(3)机器等待顾客投币,并且计算商品价值总额。
(4)顾客投币,机器计算投入金额。
(5)若投入金额大于商品价值总额,则出货并计算余额退币,若投入金额小于商品价值总额,则不出货,但是退币;
(6)顾客取出商品,系统还原
最好能够30s不动作就初始化。
总程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
//sbit LCD_RST = P3^7; //液晶复位端口
uchar code shangpinhao[]={1,2,3,4,5,6,7,8} ;
uchar code price[]={1,2,3,4,1,2,3,4};
unsigned char KeyValue;
sbit jinshu=P3^4;
sbit guangdian=P3^0;
sbit A1 = P2^0;
sbit A2 = P2^1;
sbit A3 = P2^2;
sbit A4 = P2^3;
sbit A5 = P2^4;
sbit A6 = P3^5;
sbit A7= P3^6;
sbit A8 = P3^7;
int num;
int jiage;
int geshu;
int money;
#define step11 {A1=0;A2=1;A3=1;A4=1;}
#define step21 {A1=0;A2=0;A3=1;A4=1;}
#define step31 {A1=1;A2=0;A3=1;A4=1;}
#define step41 {A1=1;A2=0;A3=0;A4=1;}
#define step51 {A1=1;A2=1;A3=0;A4=1;}
#define step61 {A1=1;A2=1;A3=0;A4=0;}
#define step71 {A1=1;A2=0;A3=1;A4=0;}
#define step81 {A1=0;A2=0;A3=1;A4=0;}
#define step12 {A5=0;A6=1;A7=1;A8=1;}
#define step22 {A5=0;A6=0;A7=1;A8=1;}
#define step32 {A5=1;A6=0;A7=1;A8=1;}
#define step42 {A5=1;A6=0;A7=0;A8=1;}
#define step52 {A5=1;A6=1;A7=0;A8=1;}
#define step62 {A5=1;A6=1;A7=0;A8=0;}
#define step72 {A5=1;A6=0;A7=1;A8=0;}
#define step82 {A5=0;A6=0;A7=1;A8=0;}
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/
uchar code DIS1[] = { " 1号 1元 2号 2元 " };
uchar code DIS2[] = { " 3号 3元 4号 4元 " };
uchar code DIS3[] = { " 5号 1元 6号 2元 " };
uchar code DIS4[] = { " 7号 3元 8号 4元 " };
uchar code DIS5[] = { " 您已选择 " };
uchar code DIS6[] = { " 号商品 " };
/*********************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=100;x++);
}
void one_quan1()
{
int i,j;
for(i=20;i>0;i--)
{
for(j=30;j>0;j--)
{
step11;
Delay(4);
step21;
Delay(4);
step31;
Delay(4);
step41;
Delay(4);
step51;
Delay(4);
step61;
Delay(4);
step71;
Delay(4);
step81;
Delay(4);
}
}
}
void one_quan2()
{
int i,j;
for(i=20;i>0;i--)
{
for(j=30;j>0;j--)
{
step12;
Delay(4);
step22;
Delay(4);
step32;
Delay(4);
step42;
Delay(4);
step52;
Delay(4);
step62;
Delay(4);
step72;
Delay(4);
step82;
Delay(4);
}
}
}
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms();//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e):KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue;break;
case(0Xb0):KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0):KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
Delay10ms();
a++;
}
}
}
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
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;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
//LCD_RST = 0; //液晶复位
// delay(3);
// LCD_RST = 1;
// delay(3);
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
/*********************************************************
* *
* 主函数 *
* *
*********************************************************/
void xianshi1()
{
uchar i;
//上电,等待稳定
// clr_screen();
// while(1)
{
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
delay(30);
}
lcd_pos(2,0); //设置显示位置为第二行
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
delay(30);
}
lcd_pos(3,0); //设置显示位置为第三行
for(i=0;i<16;i++)
{
lcd_wdat(DIS3[i]);
delay(30);
}
lcd_pos(4,0); //设置显示位置为第四行
for(i=0;i<16;i++)
{
lcd_wdat(DIS4[i]);
delay(30);
}
}
}
void xianshi2()
{
uchar i;
//上电,等待稳定
//clr_screen();
//while(1)
{
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{ lcd_wdat(DIS5[i]);
delay(30);
}
lcd_pos(2,3);
for(i=0;i<1;i++)
{KeyDown();
lcd_wdat(shangpinhao[KeyValue]+0x30);
// delay(10);
}
lcd_pos(3,0);
for(i=0;i<16;i++)
{
lcd_wdat(DIS6[i]);
delay(30);
}
}
}
void jishu()
{
if(jinshu==1)
if(guangdian==1)
num++;
money=5*num;
}
void shuliang()
{KeyDown();
if(8<<KeyValue<<12)
{
geshu=KeyValue-8;
}
}
void chuhuo()
{ if(KeyValue==13)
{
if(money>=geshu*jiage)
{int j,k;
for(j=geshu;j>0;j--)
one_quan1();
for(k=money-geshu*jiage;k>0;k--)
one_quan2();
}
if(money<geshu*jiage)
{
int m;
for(m=num;m>0;m--)
one_quan2();
}
}
}
void main()
{ delay(100);
lcd_init();
clr_screen();
while(1)
{ KeyDown();
jishu();
if(KeyValue==12)
{
xianshi1();
}
if(KeyValue<=8)
{
xianshi2();
jiage=price[KeyValue];
Delay(100);
clr_screen();
}
shuliang();
Delay(100);
chuhuo();
Delay(100);
}
}
求帮忙修改!急!
SEGMENT: ?PR?_DELAY?1
MODULE: .\1.obj (1)
Target not created
这是怎么回事,程序边玩以后不能编译,求大神帮忙指导,这是单片机模拟自动售货机的实现,控制步进电机驱动出货。
实现目标:
(1)按下“购物”以后,系统启动,显示商品,等待选择。
(2)顾客按键选择商品,显示所选择的商品,。
(3)机器等待顾客投币,并且计算商品价值总额。
(4)顾客投币,机器计算投入金额。
(5)若投入金额大于商品价值总额,则出货并计算余额退币,若投入金额小于商品价值总额,则不出货,但是退币;
(6)顾客取出商品,系统还原
最好能够30s不动作就初始化。
总程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
//sbit LCD_RST = P3^7; //液晶复位端口
uchar code shangpinhao[]={1,2,3,4,5,6,7,8} ;
uchar code price[]={1,2,3,4,1,2,3,4};
unsigned char KeyValue;
sbit jinshu=P3^4;
sbit guangdian=P3^0;
sbit A1 = P2^0;
sbit A2 = P2^1;
sbit A3 = P2^2;
sbit A4 = P2^3;
sbit A5 = P2^4;
sbit A6 = P3^5;
sbit A7= P3^6;
sbit A8 = P3^7;
int num;
int jiage;
int geshu;
int money;
#define step11 {A1=0;A2=1;A3=1;A4=1;}
#define step21 {A1=0;A2=0;A3=1;A4=1;}
#define step31 {A1=1;A2=0;A3=1;A4=1;}
#define step41 {A1=1;A2=0;A3=0;A4=1;}
#define step51 {A1=1;A2=1;A3=0;A4=1;}
#define step61 {A1=1;A2=1;A3=0;A4=0;}
#define step71 {A1=1;A2=0;A3=1;A4=0;}
#define step81 {A1=0;A2=0;A3=1;A4=0;}
#define step12 {A5=0;A6=1;A7=1;A8=1;}
#define step22 {A5=0;A6=0;A7=1;A8=1;}
#define step32 {A5=1;A6=0;A7=1;A8=1;}
#define step42 {A5=1;A6=0;A7=0;A8=1;}
#define step52 {A5=1;A6=1;A7=0;A8=1;}
#define step62 {A5=1;A6=1;A7=0;A8=0;}
#define step72 {A5=1;A6=0;A7=1;A8=0;}
#define step82 {A5=0;A6=0;A7=1;A8=0;}
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/
uchar code DIS1[] = { " 1号 1元 2号 2元 " };
uchar code DIS2[] = { " 3号 3元 4号 4元 " };
uchar code DIS3[] = { " 5号 1元 6号 2元 " };
uchar code DIS4[] = { " 7号 3元 8号 4元 " };
uchar code DIS5[] = { " 您已选择 " };
uchar code DIS6[] = { " 号商品 " };
/*********************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=100;x++);
}
void one_quan1()
{
int i,j;
for(i=20;i>0;i--)
{
for(j=30;j>0;j--)
{
step11;
Delay(4);
step21;
Delay(4);
step31;
Delay(4);
step41;
Delay(4);
step51;
Delay(4);
step61;
Delay(4);
step71;
Delay(4);
step81;
Delay(4);
}
}
}
void one_quan2()
{
int i,j;
for(i=20;i>0;i--)
{
for(j=30;j>0;j--)
{
step12;
Delay(4);
step22;
Delay(4);
step32;
Delay(4);
step42;
Delay(4);
step52;
Delay(4);
step62;
Delay(4);
step72;
Delay(4);
step82;
Delay(4);
}
}
}
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms();//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e):KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue;break;
case(0Xb0):KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0):KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
Delay10ms();
a++;
}
}
}
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<150;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
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;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
//LCD_RST = 0; //液晶复位
// delay(3);
// LCD_RST = 1;
// delay(3);
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
/*********************************************************
* *
* 主函数 *
* *
*********************************************************/
void xianshi1()
{
uchar i;
//上电,等待稳定
// clr_screen();
// while(1)
{
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
delay(30);
}
lcd_pos(2,0); //设置显示位置为第二行
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
delay(30);
}
lcd_pos(3,0); //设置显示位置为第三行
for(i=0;i<16;i++)
{
lcd_wdat(DIS3[i]);
delay(30);
}
lcd_pos(4,0); //设置显示位置为第四行
for(i=0;i<16;i++)
{
lcd_wdat(DIS4[i]);
delay(30);
}
}
}
void xianshi2()
{
uchar i;
//上电,等待稳定
//clr_screen();
//while(1)
{
lcd_pos(1,0); //设置显示位置为第一行
for(i=0;i<16;i++)
{ lcd_wdat(DIS5[i]);
delay(30);
}
lcd_pos(2,3);
for(i=0;i<1;i++)
{KeyDown();
lcd_wdat(shangpinhao[KeyValue]+0x30);
// delay(10);
}
lcd_pos(3,0);
for(i=0;i<16;i++)
{
lcd_wdat(DIS6[i]);
delay(30);
}
}
}
void jishu()
{
if(jinshu==1)
if(guangdian==1)
num++;
money=5*num;
}
void shuliang()
{KeyDown();
if(8<<KeyValue<<12)
{
geshu=KeyValue-8;
}
}
void chuhuo()
{ if(KeyValue==13)
{
if(money>=geshu*jiage)
{int j,k;
for(j=geshu;j>0;j--)
one_quan1();
for(k=money-geshu*jiage;k>0;k--)
one_quan2();
}
if(money<geshu*jiage)
{
int m;
for(m=num;m>0;m--)
one_quan2();
}
}
}
void main()
{ delay(100);
lcd_init();
clr_screen();
while(1)
{ KeyDown();
jishu();
if(KeyValue==12)
{
xianshi1();
}
if(KeyValue<=8)
{
xianshi2();
jiage=price[KeyValue];
Delay(100);
clr_screen();
}
shuliang();
Delay(100);
chuhuo();
Delay(100);
}
}
求帮忙修改!急!