很久以前测试过的超声波测距,用MSP430F149+超声波测距+LCD1602/LCD12864显示
12864液晶显示代码:
- #include <msp430x14x.h>
- #define RISE 1
- #define FALL 0
- #define DataIn P4DIR=0x00 //数据口方向设置为输入
- #define DataOut P4DIR=0xff //数据口方向设置为输出
- #define MCU_Data P4IN
- #define LCD_Data P4OUT
- #define CMDOut P6DIR|=0xfc //P6口的低23456位设置为输出
- #define RS_H P6OUT|=BIT2 //P6.2
- #define RS_L P6OUT&=~BIT2 //P6.2
- #define RW_H P6OUT|=BIT3 //P6.3
- #define RW_L P6OUT&=~BIT3 //P6.3
- #define EN_H P6OUT|=BIT4 //P6.4
- #define EN_L P6OUT&=~BIT4 //P6.4
- #define PSB_RST_H P6OUT|=BIT5+BIT6 //P6.5 P6.6为高
- unsigned int TA_Overflow_Cnt;//TA溢出次数存放变量
- unsigned long int Period;//脉宽存放结果变量
- unsigned long int S;
- unsigned int distance;
- unsigned int RiseCapVal;//上升沿时刻捕获值存放变量
- unsigned char Edge=1;//当前触发沿
- const unsigned char hang1[]={"<<超声波测距仪>>"};
- const unsigned char hang2[]={"距离:"};
- const unsigned char hang3[]={"米"};
- unsigned char disbuff[4]={"0.00"};
-
- void Write_Cmd(unsigned char cmd);
- void Write_Data(unsigned char dat);
- void Init_Lcd(void);
- void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num);
- void init_clk();
- void init_timerA();
- void init_IO();
- void display_juli();
- /*******************************************
- 函数名称:Delay_1ms
- 功 能:延时约1ms的时间
- ********************************************/
- void Delay_1ms(void)
- {
- unsigned char i;
- for(i=150;i>0;i--) _NOP();
- }
- /*******************************************
- 函数名称:Delay_Nms
- 功 能:延时N个1ms的时间
- 参 数:n--延时长度
- ********************************************/
- void Delay_Nms(unsigned int n)
- {
- unsigned int i;
- for(i=n;i>0;i--) Delay_1ms();
- }
- /*******************************************
- 函数名称:Write_Cmd
- 功 能:向液晶中写控制命令
- 参 数:cmd--控制命令
- ********************************************/
- void Write_Cmd(unsigned char cmd)
- {
- unsigned char lcdtemp=0;
-
- RS_L;
- RW_H;
- DataIn;
- do //判忙
- {
- EN_H;
- _NOP();
- lcdtemp = MCU_Data;
- EN_L;
- }
- while(lcdtemp & 0x80);
-
- DataOut;
- RW_L;
- LCD_Data = cmd;
- EN_H;
- _NOP();
- EN_L;
- }
- /*******************************************
- 函数名称:Write_Data
- 功 能:向液晶中写显示数据
- 参 数:dat--显示数据
- ********************************************/
- void Write_Data(unsigned char dat)
- {
- unsigned char lcdtemp = 0;
-
- RS_L;
- RW_H;
- DataIn;
- do //判忙
- {
- EN_H;
- _NOP();
- lcdtemp = MCU_Data;
- EN_L;
- }
- while(lcdtemp & 0x80);
-
- DataOut;
- RS_H;
- RW_L;
- LCD_Data = dat;
- EN_H;
- _NOP();
- EN_L;
- }
- /*******************************************
- 函数名称:Ini_Lcd
- 功 能:初始化液晶模块
- ********************************************/
- void Init_Lcd(void)
- {
- CMDOut; //液晶控制端口设置为输出
- PSB_RST_H; //设置并行显示方式;
-
- 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); //设定显示的起始地址
- // Write_Cmd(0x01);
- Disp_HZ(0x80,hang1,8);
- Disp_HZ(0x91,hang2,3);
- Disp_HZ(0x96,hang3,1);
- }
- /*******************************************
- 函数名称:Disp_HZ
- 功 能:控制液晶显示汉字
- 参 数:addr--显示位置的首地址
- pt--指向显示数据的指针
- num--显示字符个数
- ********************************************/
- void Disp_HZ(unsigned char addr,const unsigned char * pt,unsigned char num)
- {
- unsigned char i;
- Write_Cmd(addr);
- for(i = 0;i < (num*2);i++)
- Write_Data(*(pt++));
- }
- //初始化系统时钟函数
- void init_clk()
- {
- unsigned char i;
- BCSCTL1&=~XT2OFF;//打开XT振荡器
- BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
- do
- {
- IFG1 &= ~OFIFG;//清除振荡错误标志
- for(i=0;i<0xff;i++) _NOP();//延时等待
- }
- while((IFG1 & OFIFG) != 0);//如果标志为1继续循环等待
- IFG1&=~OFIFG;
- }
- //初始化定时器A函数
- void init_timerA()
- {
- TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
- TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
- }
- //初始化端口函数
- void init_IO()
- {
- P1DIR |= BIT1;//P1.1输出
- P1DIR &=~ BIT2;//P1.2输入
- P1SEL |= BIT2;//P1.2第二功能,捕获输入
-
- //P2DIR |= 0xff; //设置P2口方向为输出
-
- P4DIR |= 0xff;
- P6DIR |= 0xfc;
-
- P1OUT &=~BIT1;
- Delay_Nms(1000);
- }
- void display_juli()
- {
- if(S/100)
- {
- disbuff[0]=S/100+'0';
- disbuff[2]=S/10%10+'0';
- disbuff[3]=S%10+'0';
- }
- else if(S/10)
- {
- disbuff[2]=S/10+'0';
- disbuff[3]=S%10+'0';
- disbuff[0]='0';
- }
- else
- {
- disbuff[3]=S%10+'0';
- disbuff[0]='0';
- disbuff[2]='0';
- }
- }
- void main()
- {
- WDTCTL = WDTPW + WDTHOLD;//停狗
- init_IO();
- Init_Lcd();
- init_timerA();
- TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
- _EINT();
- while(1)
- {
- P1OUT |= BIT1;
- Delay_Nms(10);
- P1OUT &=~BIT1;
- Delay_Nms(80);
- //P2OUT = 0x00;
- P6OUT &= ~BIT1;
- display_juli();
- Disp_HZ(0x94,disbuff,2);
- if(S<10)
- {
- //P2OUT = 0xff;
- P6DIR |= BIT1;
- P6OUT |= BIT1;
- }
-
- }
- }
- //定时器A服务程序
- #pragma vector=TIMERA1_VECTOR
- __interrupt void Timer_A(void)
- {
- switch(TAIV)
- {
- case 2 :if(Edge==RISE)
- {
- RiseCapVal = TACCR1;
- TACCTL1 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
- //TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
- Edge = FALL;//下降沿捕获标志
- }
- else
- {
-
- _DINT();
-
- Period = TACCR1-RiseCapVal;
- S=(Period*17)/100;
- TACCR1 = 0;
- TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
- Edge = RISE;//上升沿捕获标志
- _EINT();
- }
- break;
- case 4 : break;
- case 10: TA_Overflow_Cnt++;break;
- }
- }
复制代码
1602液晶显示代码:
以上2个代码下载,如有错误请指教:
MSP430 超声波.rar
(43.44 KB, 下载次数: 79)
|