此项功能只需要增加一个蜂鸣器(接单片机P1.7脚)在编写按键扫描程序中,在每一个case语句后添加上蜂鸣器的驱动程序即可。当有按键按下时,就会调用蜂鸣器的驱动序,促使蜂鸣器发出“滴” 的一声。
附录Ⅰ:
图一:所有电路连接的全局图
图一
附录Ⅱ:
附所有程序源代码:
Font.h//存放取模数据的头文件
#define uchar unsigned char #define uint unsigned int uint code number[][16]={
{0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*\
{0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00},/*\
{0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00},/*\
{0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00},/*\
{0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00},/*\
{0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00},/*\
{0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00},/*\
{0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00},/*\
{0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00},/*\
{0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00},/*\
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\
{0x08,0x20,0xF8,0x3F,0x00,0x24,0x00,0x02,0x80,0x2D,0x80,0x30,0x80,0x20,0x00,0x00},/*\
{0x00,0x00,0x00,0x6B,0x80,0x94,0x80,0x94,0x80,0x94,0x80,0x93,0x80,0x60,0x00,0x00},/*\
{0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\
{0x20,0x80,0x20,0x40,0x22,0x20,0x22,0x10,0x22,0x0C,0xE2,0x03,0x22,0x00,0x22,0x00},
{0x22,0x00,0xE2,0x3F,0x22,0x40,0x22,0x40,0x22,0x40,0x20,0x40,0x20,0x78,0x00,0x00},/*\元\
};
uint code tem[][16]={
{0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*\
{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\
{0xF8,0x03,0x08,0x3C,0x00,0x07,0xF8,0x00,0x00,0x07,0x08,0x3C,0xF8,0x03,0x00,0x00},/*\
{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\
{0x00,0x40,0x00,0x30,0x00,0x00,0xF1,0x03,0x12,0x39,0x14,0x41,0x10,0x41,0x10,0x45},
{0x10,0x59,0x14,0x41,0x12,0x41,0xF1,0x73,0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00},/*\总\
{0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x80,0x20,0x60,0x90,0x1F},
{0x0C,0x00,0x03,0x00,0x0C,0x00,0x90,0xFF,0x20,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*\价\
{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\
}Delay.c//延时函数 void delay(uint x){/*100us延时函数*/ uint i; while(x--) for(i=100; i>0; i--);
}LCD12232.c//LCD12232
的使用函数
sfr DATAport=0x80;//定义LCD12232数据口(0x80表示P0口)
sbit lcda0=P2^0;//写(数据/指令)(1/0)选择 sbit lcde1=P2^1;//LCD左边使能 sbit lcde2=P2^2;//LCD右边使能
sbit lcdrw=P2^3;//(读/写)(1/0)状态选择
sbit lcdbusy=P0^7;//忙状态检测位(即数据口最高位) void LCDcmd(uchar temp){ delay(2); lcde1=0; //禁止控制器
lcde2=0; lcda0=0;
//写指令模式 lcdrw=0; //写使能 lcde1=1; //控制器使能 lcde2=1;
DATAport=temp; //写指令
lcde1=0;
//写完后,禁止控制器 lcde2=0;
}
/*写数据*/
void LCDdata(bit lcde,uchar temp){ delay(2); lcde1=0;
//禁止控制器
lcde2=0; lcda0=1;
//写数据模式 lcdrw=0; //写使能
lcde1=~lcde;
//(lcde=0/1)(左/右)控
制器使能
lcde2=lcde;
DATAport=temp; //写数据 lcde1=0;
//写完后,禁止主控制器
lcde2=0;
}
/*LCD清屏*/
void LCDclr(uint Page){
unsigned char i; LCDcmd(0xB8|Page); //设置主控制器页地址
LCDcmd(0x00);
//设置主控制器列地址 for(i=0;i<61;i++){ LCDdata(0,0x00);
}
for(i=0;i<61;i++){ LCDdata(1,0x00);
}
}
/*LCD初始化*/
void LCDrst(){ LCDcmd(0xE2);//复位 LCDcmd(0xAE);//关显示
LCDcmd(0xA4);//正常驱动模式
LCDcmd(0xA9);//占空比为1/32(即32行液晶显示驱
动)
LCDcmd(0xA1);//设定列驱动与液晶列数据口连接方式 LCDcmd(0xEE);//正常读写模式(读/写数据后列地址+1)
LCDclr(0); //擦除0页 LCDclr(1); //擦除1页
LCDclr(2); //擦除2页 LCDclr(3);
//擦除3页
LCDcmd(0xAF);//开显示
}
/*写LCD字符串*/ /*写指令*/
void LCDshow010(uint *a,uint b){ uint i,j;
for(j=0;j<2;j++){
LCDcmd(0xB8|j);
//第j页显示
LCDcmd(0x00);
//设置列开始地址
for(i=0; i<16;i++)
//写前半部分,显示“P:” LCDdata(0,tem[0][i*2+j%2]);
if(a[1]==0){
for(i=0; i<8;i++)
//写前半部分,如果十位为0,空格占位
LCDdata(0,number[10][i*2+j%2]);
}
else{
for(i=0; i<8;i++)
//写前半部分 ,显示单价的十位
LCDdata(0,number[a[1]][i*2+j%2]);
}
for(i=0; i<8;i++)
//写前半部分,显示单价的个位
LCDdata(0,number[a[0]][i*2+j%2]);
for(i=0; i<8;i++)
//写前半部分,空格占位
LCDdata(0,number[10][i*2+j%2]);
for(i=0; i<8;i++)
//写前半部分,空格占位
LCDdata(0,number[10][i*2+j%2]);
for(i=0; i<8;i++)
//写前半部分,空格占位
LCDdata(0,number[10][i*2+j%2]);
for(i=0; i<5;i++)
//写后半部分,显示“W:”
LCDdata(0,tem[2][i*2+j%2]);
for(i=5; i<16;i++)
//写后半部分 ,越界处理 LCDdata(1,tem[2][i*2+j%2]); if(b/100==0){
for(i=0; i<8;i++)
//写后半部分,如果十位为0,空格占位
LCDdata(1,number[10][i*2+j%2]);
}
else{
for(i=0; i<8;i++)
//写后半部分 ,显示重量的十位
LCDdata(1,number[b/100][i*2+j%2]);
}
for(i=0; i<8;i++)
//写后半部分 ,显示重量的个位
LCDdata(1,number[(b/10)][i*2+j%2]);
for(i=0; i<8;i++)
//写后半部分,显示小数点
LCDdata(1,number[13][i*2+j%2]);
for(i=0; i<8;i++)
//写后半部分,显示重量的小数位
LCDdata(1,number[b][i*2+j%2]);
for(i=0; i<16;i++)
//写后半部分 显示“kg”符号
LCDdata(1,number[11][i*2+j%2]);
}
}
void LCDshow230(uint c){ uint i,j;
for(j=2;j<4;j++){
LCDcmd(0xB8|j);
//第j页显示
LCDcmd(0x00);
//设置列开始地址
for(i=0; i<40;i++)
//写前半部分,显示“总价:” LCDdata(0,tem[4][i*2+j%2]);
if(c/10000==0){
for(i=0; i<8;i++)
//写前半部分,如果千位为0,千位空格占
位
LCDdata(0,number[10][i*2+j%2]);
}
else{
for(i=0; i<8;i++)
//写前半部分 ,显示总价的千位
LCDdata(0,number[c/10000][i*2+j%2]);
}
if(c/1000==0){
for(i=0; i<8;i++)
//写前半部分,在千,百位都为0的情况
下,百位空格占位
LCDdata(0,number[10][i*2+j%2]);
}
else{
for(i=0; i<8;i++)
//写前半部分 ,显示总价的百位
LCDdata(0,number[(c/1000)][i*2+j%2]);
}
if(c/100==0){
for(i=0; i<5;i++)
//写前半部分,在千、百、十位都为0 的情
况下,十位空格占位
LCDdata(0,number[10][i*2+j%2]);
for(i=5; i<8;i++)
//写后半部分,显示空格占位,因为存在越
界
LCDdata(1,number[10][i*2+j%2]);
}
else{
for(i=0; i<5;i++)
//写前半部分,显示总价的十位
LCDdata(0,number[(c/100)][i*2+j%2]);
for(i=5; i<8;i++)
//写后半部分,显示总价的十位,因为存在
越界
LCDdata(1,number[(c/100)][i*2+j%2]);
}
for(i=0; i<8;i++)
//写后半部分,显示总价的个位
LCDdata(1,number[(c/10)][i*2+j%2]);
for(i=0; i<8;i++)
//写后半部分,显示小数点
LCDdata(1,number[13][i*2+j%2]);
for(i=0; i<8;i++)
//写后半部分,显示总价的小数位
LCDdata(1,number[c][i*2+j%2]);
for(i=0; i<16;i++)
//写后半部分,显示“元”符号
LCDdata(1,number[14][i*2+j%2]);
}
}ADC0832.c//ADC0832的使用函数
sbit ADC_CS =P1^0; sbit ADC_CLK=P1^1; sbit ADC_DIO =P1^2;
uchar ReadADC() //把模拟电压值转换成8位二进制数并返回 { uchar i,dat1=1,dat2=0; ADC_CS=0;ADC_CLK=0; ADC_DIO=1;
_nop_();_nop_(); ADC_CLK=1;
_nop_();_nop_();
ADC_CLK=0;ADC_DIO=1; _nop_();_nop_(); ADC_CLK=1;
_nop_();_nop_();
ADC_CLK=0;ADC_DIO=0; _nop_();_nop_(); ADC_CLK=1;
_nop_();_nop_();
ADC_CLK=0;ADC_DIO=1; _nop_();_nop_();
for(i=0;i<8;i++) { ADC_CLK=1; _nop_();_nop_(); ADC_CLK=0;
_nop_();_nop_();
dat1=(dat1<<1)|ADC_DIO;
}
for(i=0;i<8;i++) {
dat2=dat2|((uchar)ADC_DIO<
ADC_CLK=1; _nop_();_nop_();
ADC_CLK=0;
_nop_();_nop_();
}
ADC_CS=1;
return (dat1==dat2)?dat1:0x00;
}MM74C922.c //MM74C922的使用函数
sbit DA=P1^6; sbit BEEP=P1^7; uchar Get_key(){ uint a=16; if(DA) a=P2/16;
return a;
}
void Beep() { uchar i;
for(i=0;i<100;i++){ delay(1); BEEP=~BEEP; }
BEEP=1;
}
void Juge_key(uint *c,uint e,uint f,uint *g,uint *h){ uint i,b=Get_key(); switch(b){ case 0:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=1;while(DA);Beep();break; case 1:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=2;while(DA);Beep();break; case
2:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-
1];c[i]=3;while(DA);Beep();break;
case 3:Beep();break; case 4:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=4;while(DA);Beep();break; case 5:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=5;while(DA);Beep();break; case 6:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-
1];c[i]=6;while(DA);Beep();break;
case 7:break; case 8:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=7;while(DA);Beep();break; case 9:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=8;while(DA);Beep();break; case
10:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=9;while(DA);Beep();break;
case 11:(*h)=e;while(DA);Beep();break; case 12:c[0]=0;c[1]=0;(*g)=0;(*h)=0;while(DA);Beep();break; case
13:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-
1];c[i]=0;while(DA);Beep();break;
case 14:(*g)=e*f;while(DA);Beep();break;
case
15:for(i=1;i>0;i--)c[i]=c[i-
1];c[i]=3;while(DA);Beep();break;
}
}main()函数 #include
#include
#include\存放取模数据的头文件 #include\延时函数 //#include\
#include\的使用函数 #include\的使用函数 #include\的使用函数 uchar adcdata; //uint DataTime[]; uint p[]={0,0};
uint price=0,weight,Total_price=0; uint Levelweight=0; main(){ delay(10);//LCD复位前适当延时,保证LCD复位成功 LCDrst();//LCD复位 while(1){ adcdata=ReadADC(); //
GetTime(DataTime);
Juge_key(p,weight,price,&Total_price,&Levelweight);
//总价的计算
weight=2*adcdata*1.47-Levelweight-2;
//实际重量与放大后电压的关系
Juge_key(p,weight,price,&Total_price,&Levelweight);
//总价的计算 LCDshow010(p,weight); price=p[0]+10*p[1];
//单价的输入
Juge_key(p,weight,price,&Total_price,&Levelweight);
//总价的计算 LCDshow230(Total_price);
Juge_key(p,weight,price,&Total_price,&Levelweight);
//总价的计算 }
}