于基msp430f149电子秤设计 附电路图本科毕业设计.docx
《于基msp430f149电子秤设计 附电路图本科毕业设计.docx》由会员分享,可在线阅读,更多相关《于基msp430f149电子秤设计 附电路图本科毕业设计.docx(14页珍藏版)》请在冰豆网上搜索。
于基msp430f149电子秤设计附电路图本科毕业设计
附录1电路原理图
附录2程序
/***********************************************************
程序功能:
在12864液晶上显示重量
-----------------------------------------------------------
----------------------------------------------------
测试说明:
观察液晶显示
***********************************************************/
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
externconstunsignedcharshuzi_table[];
floate;
/***************全局变量***************/
ucharkey_Pressed;//按键是否被按下:
1--是,0--否
ucharkey_val;//存放键值
ucharkey_Flag;//按键是否已放开:
1--是,0--否
/*设置键盘逻辑键值与程序计算键值的映射*/
ucharkey_Map[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
#defineLCD_DataInP4DIR=0x00//数据口方向设置为输入
#defineLCD_DataOutP4DIR=0xff//数据口方向设置为输出
#defineLCD2MCU_DataP4IN
#defineMCU2LCD_DataP4OUT
#defineLCD_CMDOutP3DIR|=0x07//P3口的低三位设置为输出
#defineLCD_RS_HP3OUT|=BIT0//P3.0
#defineLCD_RS_LP3OUT&=~BIT0//P3.0
#defineLCD_RW_HP3OUT|=BIT1//P3.1
#defineLCD_RW_LP3OUT&=~BIT1//P3.1
#defineLCD_EN_HP3OUT|=BIT2//P3.2
#defineLCD_EN_LP3OUT&=~BIT2//P3.2
/*******************************************
写入内容待显示内容
********************************************/
constucharhang1[]={"小小苏电子称系统"};
constucharhang2[]={"净重:
g"};
constucharhang3[]={"总价:
元"};
constucharhang4[]={"单价/Kg"};
constucharhang5[]={"萝卜"};constucharhang6[]={"豆角"};
constucharhang7[]={"土豆"};constucharhang8[]={"白菜"};
constucharhang9[]={"苹果"};constucharhang10[]={"香蕉"};
constucharhang11[]={"橘子"};constucharhang12[]={"桃子"};
constucharhang13[]={"猪肉"};constucharhang14[]={"羊肉"};
constucharhang15[]={"牛肉"};constucharhang16[]={"鸡肉"};
constucharhang17[]={"山药"};constucharhang18[]={"生姜"};
constucharhang19[]={"木耳"};
/*******************************************
函数名称:
Init_Keypad
功能:
初始化扫描键盘的IO端口
参数:
无
返回值:
无
********************************************/
voidInit_Keypad(void)
{
P1DIR=0xf0;//P1.0~P1.3设置为输入状态,P1.4~P1.7设置为输出状态
P1OUT|=0xf0;//P1.4~P1.7输出低电平
key_Flag=0;
key_Pressed=0;
key_val=5;
}
/*******************************************
函数名称:
Check_Key
功能:
扫描键盘的IO端口,获得键值
参数:
无
返回值:
无
********************************************/
voidCheck_Key(void)
{
ucharrow,col,tmp1,tmp2;
tmp1=0x80;
for(row=0;row<4;row++)//行扫描
{
P1OUT=0xf0;//P1.4~P1.7输出全0
P1OUT-=tmp1;//P1.4~p1.7输出四位中有一个为0
tmp1>>=1;
if((P1IN&0x0f)<0x0f)//是否P1IN的P1.0~P1.3中有一位为0
{tmp2=0x01;//tmp2用于检测出那一位为0
for(col=0;col<4;col++)//列检测
{if((P1IN&tmp2)==0x00)//是否是该列,等于0为是
{key_val=key_Map[row*4+col];//获取键值
return;//退出循环
}
tmp2<<=1;//tmp2右移1位
}
}
}
//return(key_val);
}
/*******************************************
函数名称:
delay
功能:
延时约15ms,完成消抖功能
参数:
无
返回值:
无
********************************************/
voiddelay()
{
uinttmp;
for(tmp=12000;tmp>0;tmp--);
}
/*******************************************
函数名称:
Key_Event
功能:
检测按键,并获取键值
参数:
无
返回值:
无
********************************************/
voidKey_Event(void)
{
uchartmp;
P1OUT&=0x00;//设置P1高四位全为0,等待按键输入
tmp=P1IN;//获取p1IN
if((key_Pressed==0x00)&&((tmp&0x0f)<0x0f))//如果有键按下
{
key_Pressed=1;//如果有按键按下,设置key_Pressed标识
delay();//消除抖动
Check_Key();//调用check_Key(),获取键值
}
elseif((key_Pressed==1)&&((tmp&0x0f)==0x0f))//如果按键已经释放
{
key_Pressed=0;//清除key_Pressed标识
key_Flag=1;//设置key_Flag标识
}
else
{
_NOP();
}
}
/*******************************************
函数名称:
Delay_1ms
功能:
延时约1ms的时间
参数:
无
返回值:
无
********************************************/
voidDelay_1ms(void)
{
uchari;
for(i=150;i>0;i--)_NOP();
}
/*******************************************
函数名称:
Delay_Nms
功能:
延时N个1ms的时间
参数:
n--延时长度
返回值:
无
********************************************/
voidDelay_Nms(uintn)
{
uinti;
for(i=n;i>0;i--)Delay_1ms();
}
/*******************************************
函数名称:
Write_Cmd
功能:
向液晶中写控制命令
参数:
cmd--控制命令
返回值:
无
********************************************/
voidWrite_Cmd(ucharcmd)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data=cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
Write_Data
功能:
向液晶中写显示数据
参数:
dat--显示数据
返回值:
无
********************************************/
voidWrite_Data(uchardat)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
Ini_Lcd
功能:
初始化液晶模块
参数:
无
返回值:
无
********************************************/
voidIni_Lcd(void)
{
LCD_CMDOut;//液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30);//基本指令集
Delay_1ms();
Write_Cmd(0x02);//地址归位
Delay_1ms();
Write_Cmd(0x0c);//整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01);//清除显示
Delay_1ms();
Write_Cmd(0x06);//游标右移
Delay_1ms();
Write_Cmd(0x80);//设定显示的起始地址
}
/*******************************************
函数名称:
Disp_HZ
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
********************************************/
voidDisp_HZ(ucharaddr,constuchar*pt,ucharnum)
{
uchari;
Write_Cmd(addr);
for(i=0;iWrite_Data(*(pt++));
}
/*******************************************
函数名称:
Disp_WEI
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
********************************************/
voidDisp_WEI(ucharaddr,intc,charnum)
{
uchari;
Write_Cmd(addr);
for(i=0;iWrite_Data(c);
}
/***************************主函数*************************/
voidmain(void)
{/*下面六行程序关闭所有的IO口*/
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
WDTCTL=WDTPW+WDTHOLD;//关狗
P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换
Ini_Lcd();//初始化液晶
ADC12CTL0=SHT0_2+ADC12ON;//设置采样时间+ADC12内核开
ADC12CTL1=SHP;//使用采样定时器
ADC12IE=0X01;//开启中断
ADC12CTL0|=ENC;//转换使能
P6SEL|=0X01;
Disp_HZ(0x80,hang1,16);
Disp_HZ(0x90,hang2,16);
Disp_HZ(0x88,hang3,16);
Disp_HZ(0x98,hang4,16);
Init_Keypad();
_EINT();
while
(1)
{
ADC12CTL0|=ADC12SC;//启动转换
//while((ADC12IFG&0x01)==0);
_NOP();
Key_Event();
if(key_Flag==1)
{key_Flag=0;
switch(key_val)
{case0:
P2OUT=0XFE;Disp_HZ(0x9a,hang5,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(2+0x30);
Write_Data(0x2e);Write_Data(3+0x30);
e=2.3;break;
case1:
P2OUT=0XFD;Disp_HZ(0x9a,hang6,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(6+0x30);
Write_Data(0x2e);Write_Data(9+0x30);
e=6.9;break;
case2:
P2OUT=0XFB;Disp_HZ(0x9a,hang7,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(2+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=2.0;break;
case3:
P2OUT=0XF7;Disp_HZ(0x9a,hang8,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(1+0x30);
Write_Data(0x2e);Write_Data(5+0x30);
e=1.5;break;
case4:
P2OUT=0XEF;Disp_HZ(0x9a,hang9,4);
Write_Cmd(0x9c);Write_Data(1+0x30);Write_Data(4+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=14.0;break;
case5:
P2OUT=0XDF;Disp_HZ(0x9a,hang10,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(9+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=9.0;break;
case6:
P2OUT=0XBF;Disp_HZ(0x9a,hang11,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(6+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=6.0;break;
case7:
P2OUT=0X7F;Disp_HZ(0x9a,hang12,4);
Write_Cmd(0x9c);Write_Data(2+0x30);Write_Data(0+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=20.0;break;
case8:
P2OUT=~0XFE;Disp_HZ(0x9a,hang13,4);
Write_Cmd(0x9c);Write_Data(3+0x30);Write_Data(5+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=30.0;break;
case9:
P2OUT=~0XFD;Disp_HZ(0x9a,hang14,4);
Write_Cmd(0x9c);Write_Data(8+0x30);Write_Data(0+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=80.0;break;
case10:
P2OUT=~0XFB;Disp_HZ(0x9a,hang15,4);
Write_Cmd(0x9c);Write_Data(7+0x30);Write_Data(0+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=70.0;break;
case11:
P2OUT=~0XF7;Disp_HZ(0x9a,hang16,4);
Write_Cmd(0x9c);Write_Data(1+0x30);Write_Data(5+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=15.0;break;
case12:
P2OUT=~0XEF;Disp_HZ(0x9a,hang17,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(3+0x30);
Write_Data(0x2e);Write_Data(5+0x30);
e=3.5;break;
case13:
P2OUT=~0XDF;Disp_HZ(0x9a,hang18,4);
Write_Cmd(0x9c);Write_Data(0+0x30);Write_Data(4+0x30);
Write_Data(0x2e);Write_Data(5+0x30);
e=4.5;break;
case14:
P2OUT=~0XBF;Disp_HZ(0x9a,hang19,4);
Write_Cmd(0x9c);Write_Data(4+0x30);Write_Data(0+0x30);
Write_Data(0x2e);Write_Data(5+0x30);
e=40.0;break;
case15:
P2OUT=~0X7F;//Disp_HZ(0x9a,hang21,4);
Write_Cmd(0x9a);Write_Data(0x20);Write_Data(0x20);
Write_Data(0x20);Write_Data(0x20);
Write_Data(0+0x30);Write_Data(0+0x30);
Write_Data(0x2e);Write_Data(0+0x30);
e=0;break;
default:
break;
}
}
}
}
#pragmavector=ADC_VECTOR
__interruptvoidADC12_ISR(void)
{inta,b,c,d,temp;
longintg,y;
temp=ADC12MEM0;
temp=temp/100;
g=121*temp;
y=g*e;
if(g>400)
{
a=g/1000;
b=g%1000/100;
c=g%1000%100/10;
d=g%1000%100%10;}
else
{
a=b=c=d=0;y=0;
}
Write_Cmd(0x93);Write_Data(a+0x30);Write_Data(b+0x30);
Write_Data(c+0x30);Write_Data(d+0x30);
Delay_Nms(200);
Write_Cmd(0x8b);Write_Data(y/100000+0x30);
Write_Data(y%100000/10000+0x30);
Write_Data(y%100000%10000/1000+0x30);Write_Data(0x2e);
Write_Data(y%100000%10000%1000/100+0x30);
Write_Data(y%1000