资源描述
附录1 电路原理图
附录2 程序
/***********************************************************
程序功能:在12864液晶上显示重量
-----------------------------------------------------------
----------------------------------------------------
测试说明:观察液晶显示
***********************************************************/
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
extern const unsigned char shuzi_table[];
float e;
/***************全局变量***************/
uchar key_Pressed; //按键是否被按下:1--是,0--否
uchar key_val; //存放键值
uchar key_Flag; //按键是否已放开:1--是,0--否
/*设置键盘逻辑键值与程序计算键值的映射*/
uchar key_Map[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT0 //P3.0
#define LCD_RS_L P3OUT&=~BIT0 //P3.0
#define LCD_RW_H P3OUT|=BIT1 //P3.1
#define LCD_RW_L P3OUT&=~BIT1 //P3.1
#define LCD_EN_H P3OUT|=BIT2 //P3.2
#define LCD_EN_L P3OUT&=~BIT2 //P3.2
/*******************************************
写入内容待显示内容
********************************************/
const uchar hang1[] = {"小小苏电子称系统"};
const uchar hang2[] = {"净重: g "};
const uchar hang3[] = {"总价: 元"};
const uchar hang4[] = {"单价 /Kg"};
const uchar hang5[] = {"萝卜"};const uchar hang6[] = {"豆角"};
const uchar hang7[] = {"土豆"};const uchar hang8[] = {"白菜"};
const uchar hang9[] = {"苹果"};const uchar hang10[] = {"香蕉"};
const uchar hang11[] = {"橘子"};const uchar hang12[] = {"桃子"};
const uchar hang13[] = {"猪肉"};const uchar hang14[] = {"羊肉"};
const uchar hang15[] = {"牛肉"};const uchar hang16[] = {"鸡肉"};
const uchar hang17[] = {"山药"};const uchar hang18[] = {"生姜"};
const uchar hang19[] = {"木耳"};
/*******************************************
函数名称:Init_Keypad
功 能:初始化扫描键盘的IO端口
参 数:无
返回值 :无
********************************************/
void Init_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端口,获得键值
参 数:无
返回值 :无
********************************************/
void Check_Key(void)
{
uchar row ,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,完成消抖功能
参 数:无
返回值 :无
********************************************/
void delay()
{
uint tmp;
for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:Key_Event
功 能:检测按键,并获取键值
参 数:无
返回值 :无
********************************************/
void Key_Event(void)
{
uchar tmp;
P1OUT &= 0x00; // 设置P1高四位全为0,等待按键输入
tmp = P1IN; // 获取 p1IN
if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下
{
key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识
delay(); //消除抖动
Check_Key(); // 调用check_Key(),获取键值
}
else if((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放
{
key_Pressed = 0; // 清除key_Pressed标识
key_Flag = 1; // 设置key_Flag标识
}
else
{
_NOP();
}
}
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 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--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 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
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_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--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < num;i++)
Write_Data(*(pt++));
}
/*******************************************
函数名称:Disp_WEI
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_WEI(uchar addr,int c,char num)
{
uchar i;
Write_Cmd(addr);
for(i = 0;i < num;i++)
Write_Data(c);
}
/***************************主函数*************************/
void main( 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)
{case 0: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;
case 1: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;
case 2: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;
case 3: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;
case 4: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;
case 5: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;
case 6: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;
case 7: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;
case 8: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;
case 9: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;
case 10: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;
case 11: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;
case 12: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;
case 13: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;
case 14: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;
case 15: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 ;
}
}
}
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR(void)
{ int a,b,c,d,temp;
long int g,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%100000%10000%1000%100/10+0x30);
_BIC_SR_IRQ(CPUOFF);
}
展开阅读全文