关于引脚 我Vss和K接单片机上的GND,VDD和A接单片机的VCC,
1602的RS接P2.0,RW接P2.1,E接P2.27~14的8个引脚接MSP430的P1.0~P1.7。但是V0不知道怎么接。我输了一下程序led没数据显示,求教,麻烦各位了。
#include<msp430g2553.h>#define uchar unsigned char#define uint unsigned int#define P20 0#define P21 1#define P22 2#define RS_CLR P2OUT &= ~(1 << P20) //RS置低#define RS_SET P2OUT |= (1 << P20) //RS置高#define RW_CLR P2OUT &= ~(1 << P21) //RW置低#define RW_SET P2OUT |= (1 << P21) //RW置高#define EN_CLR P2OUT &= ~(1 << P22) //E置低#define EN_SET P2OUT |= (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); //修改指针的位置}/**************************************************** 函数名称: display_xy** 入口参数:x(unsigned char型),y(unsigned char型)** 出口参数:无** 功能描述: 设置光标位置, x是行号,y是列号****************************************************/void display_xy(unsigned char x,unsigned char y){ if(y==0x01) { x=x+0x40+x+0x80; } else { x=x+0x80;//数据指针设置80H+地址码 } write_com(x);}/*********************************************************************** 函数名称: display_string** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)** 出口参数:无** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号**********************************************************************/void display_string(unsigned char x,unsigned char y,unsigned char *s){ display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; }}/***************************************函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:X-----位置的列坐标 Y-----位置的行坐标 data--显示的字符数据返回值 :无***************************************/void Disp1Char(uchar x,uchar y,uchar data){ display_xy(x,y); write_data(data);//输出数据}/***********************************在1602LCD上显示**************** ***********浮点数*********************/void Disp_float(float f_data){ unsigned char lcd_table[3]; int aa; aa=f_data; lcd_table[0]= aa/1000 ; lcd_table[1]=aa%100/10; lcd_table[2]=aa%10; Disp1Char(5,0,(lcd_table[0]+0x30));//显示整数部分十位数 Disp1Char(6,0,(lcd_table[1]+0x30));//显示小数部分的个位 Disp1Char(7,0,(0x2e));//显示小数点 Disp1Char(8,0,(lcd_table[2]+0x30));//显示小数部分十分位 //加上0x30以便得到直接的ASCLL码显示}void main(){ WDTCTL = WDTPW | WDTHOLD; P2DIR=0XFF; P1DIR=0XFF; P1OUT=0; RW_CLR;//写数据指令 init(); ADC10CTL1|=CONSEQ_2;//单通道多次转换模式 ADC10CTL0 |= SREF_1+REFON;//选择内部参考源1.5V,打开基准源 ADC10CTL0 |= ADC10SHT_3+MSC; //过采样率设置为64个采样周期,打开AD转换 ADC10CTL1|= ADC10SSEL_3+SHS_0; //ACLK2分频为采样时钟,用ADC10SC触发采集 ADC10CTL1 |=INCH_1; //选择通道A1 ADC10CTL0 |= ADC10ON; //开启ADC10 while (1) { delay(1000); ADC10CTL0 |=ENC+ADC10SC; //开始转换 while((ADC10CTL0 &ADC10IFG)==0); //等待ADC10IFG标志变高(转换完成) ADC_CHO=ADC10MEM; //读取采样结果 data= (ADC_CHO-746)/(0.000355*678)+286; c=data; if(c>150) { P2DIR|=BIT3; P2OUT=0X00; delay(2000); } Disp_float(c);//显示结果 delay(2000); }}#pragma vector=ADC10_VECTOR__interrupt void ADC10_ISR (void){ __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)}#pragma vector=TIMER0_A0_VECTOR__interrupt void ta0_isr(void){ TACTL = 0; LPM0_EXIT; // Exit LPM0 on return}
此帖出自
小平头技术问答
一周热门 更多>