1602的RS接P2.0,RW接P2.1,E接P2.2
7~14的8个引脚接MSP430的P1.0~P1.7,其余按照1602引脚要求连接。
#include<msp430g2553.h> #define uchar unsigned char #define uint unsigned int #define P20 0 #define P21 1 #define P22 2 #define RS_CLRP2OUT &= ~(1 << P20) //RS置低 #define RS_SETP2OUT |= (1 << P20) //RS置高 #define RW_CLRP2OUT &= ~(1 << P21) //RW置低 #define RW_SETP2OUT |= (1 << P21) //RW置高 #define EN_CLRP2OUT &= ~(1 << P22) //E置低 #define EN_SETP2OUT |= (1 << P22) //E置高 uchar num; int ADC_CHO; int c; int data; unsigned char x; unsigned char y; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) //输入数据 { RS_CLR; //RS置低 输入指令 P1OUT=com; delay(5); EN_SET; delay(5); EN_CLR; //E置低 1->0 执行指令 } void write_data(uchar data) //输出数据 { RS_SET; //RS置高 RS=1输出数据 P1OUT=data; delay(5); EN_SET; delay(5); EN_CLR; //E置低 1->0 执行指令 } void init() //1602初始化,请参考1602的资料 { EN_CLR; write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口 write_com(0x0e); //光标不显示 write_com(0x06); //写入新数据后光标右移,显示频不移动 write_com(0x01); //0000000001 清屏 write_com(0x80); //修改指针的位置 } void display_xy(unsigned char x,unsigned char y) { if(y==0x01) { x = x + 0x40 + 0x80; } else { x = x+0x80; //数据指针设置 80H+地址码 (0-27H,40H-67H) } write_com(x); } void Disp1Char(uchar x,uchar y,uchar data) { display_xy(x,y); write_data(data); ////输出数据 } void Disp_float(float f_data) { unsigned char lcd_table[3]; int aa; aa=f_data; lcd_table[0]= aa/100; lcd_table[1]= aa%100/10; lcd_table[2]=aa%10; Disp1Char(5,0,(lcd_table[0]+0x30)); //显示整数部分的十位数 0x30的原因CGROM和CGRAM与字符的对应关系 Disp1Char(6,0,(lcd_table[1]+0x30));//显示小数部分的个位 Disp1Char(7,0,(0x2e)); //显示小数点"." 小数点对应00101110 Disp1Char(8,0,(lcd_table[2]+0x30)); //显示小数部分的十分位 //加上0x30以便直接得到相应的ASCII码去显示 } void main() { WDTCTL = WDTPW + WDTHOLD; P2DIR = 0XFF; P1DIR = 0XFF; //输出all P1OUT = 0; RW_CLR; //写数据指令 init(); ADC10CTL1 |= CONSEQ_2; //单通道多次转换模式 ADC10CTL0 |= SREF_1+REFON;//REFON=1选择内部参考源1.5,VR+=VREF+and VR-=VSS,打开基准源 ADC10CTL0 |= ADC10SHT_3+MSC;//过采样率设置为64个采样周期,打开AD转换,MSC多次采样 ADC10CTL1 |= ADC10SSEL_3+SHS_0;//ACLK2分频为采样时钟,用ADC10SC触发采集 ADC10CTL1 |= INCH_10;//选择通道10 ADC10CTL0 |= ADC10ON;//开启ADC10 while(1) { delay(1000); ADC10CTL0 |= ENC + ADC10SC; // 开始转换 ENC为转换使能位,ADC10SC转换控制位 while((ADC10CTL0 & ADC10IFG)==0);//等待ADC10IFG标志位变高(转换完成) ADC_CHO= ADC10MEM;//读取采样结果 data =(ADC_CHO-746)/(0.000335*678)+286;//计算温度值 c=data; if(c>150) {P2DIR |= BIT3; P2OUT=0x00; delay(2000); } Disp_float(c); //显示结果 delay(2000); } }