MSP430单片机步进电机带显示程序

发布者:科技狂人最新更新时间:2018-01-30 来源: eefocus关键字:MSP430  单片机  步进电机 手机看文章 扫描二维码
随时随地手机看文章

MSP430 单片机 步进电机带显示程序


#include "msp430x22x4.h" 
#define uchar unsigned char 
#define uint  unsigned int 

#define comm  0

#define dat   1 
#define sclk_1   P4OUT|=0x01         //sclk=1;  001----p4.0 
#define sclk_0   P4OUT&=0x06         //sclk=0;  110----p4.1 
#define std_1    P4OUT|=0x02         //std =1;  010 
#define std_0    P4OUT&=0x05         //std =0;  101 

#define keyin   (P2IN&0x0F) 

unsigned char key[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; 

uchar hang[]={0xef,0xdf,0xbf,0x7f};// 选中行码 
uchar lie[]={0x0e,0x0d,0x0b,0x07};//相应列值 
unsigned char save,aa,bb; 
uchar m=1,j=0; 
uchar M=0,key1=0,key2=0; 
uchar flag_key1=0,flag_key2=0,flag_go=0; 
float nquan=0x00; 



uchar caidan[]={ 
  "Please Input M  " 
  "电机转动      度"  
  " M=             " 
  "****************" 
   
}; 

uchar caidan1[]={"0123456789."}; 

// 扫描式4x4键盘 
void delay(uint aj)   //us 

   
    while(aj--); 


void DELAY(uint aj)   //ms 

  for(uint fl=0;fl<1000;fl++) 
    while(aj--); 

   
void init_port(void) 

   
  P2DIR=0XF0; 
  P2SEL=0; 
  P2OUT=0; 
  P2IE=0X0F; 
  P2IES=0XF0; 
  P2IFG=0; 
   
  P3DIR=0XFF;   //p3.0--A P3.1---B  P3.2---C   P3.3---D 
  P3SEL=0X00; 
  P3OUT=0X00; 
   
  P4DIR=0XFF;   //P4口输出 作液晶接口p4.0--SCK p4.1---sid 
  P4SEL=0; 
  P4OUT=0; 
  
  _EINT(); 
   
  return; 



/* 
******************************************************************************** 
*模块名称:wr_LCD定义 
*完成日期:08-07-29 
*修改内容:none 
********************************************************************************/ 
//********写命令/数据*************************************************** 
void wr_lcd (unsigned char dat_comm,unsigned char content) 

  unsigned char a,b,i,j; 
  delay (50); 
  a=content; 
    //cs_1;      
    sclk_0;      
    std_0;         
    std_1;          
  for(i=0;i<5;i++)   
  { sclk_1;sclk_0;} 
     std_0; 
     sclk_1; 
     sclk_0; 
  if(dat_comm)std_1; 

  else 
    std_0; 
  sclk_1; 
  sclk_0; 
  std_0; 
  sclk_1; 
  sclk_0; 
  for(j=0;j<2;j++) 
  { 
    for(i=0;i<4;i++) 
    {b=a;       
      if((b&=0x80)==0) 
      {std_0;a=a<<1;} 
      else 
      {std_1;a=a<<1;} 
      sclk_1;sclk_0; 
    } 
    std_0; 
    for(i=0;i<4;i++) 
    { sclk_1;sclk_0;} 
  } 

/********************************************************************************* 
*模块名称:初始化定义 
*完成日期:08-7-29 
*修改内容:none 
******************************************************************************** 
*/ 
void init_lcd (void) 

  wr_lcd (comm,0x30);  /*30---基本指令动作*/    
  wr_lcd (comm,0x01);  /*清屏,地址指针指向00H*/ 
  delay (100); 
  wr_lcd (comm,0x06);  /*光标的移动方向*/ 
  wr_lcd (comm,0x0c);  /*开显示,关游标*/ 


/* 
******************************************************************************** 
*模块名称:清DDRAM定义 
*完成日期:08-7-29 
*修改内容:none 
******************************************************************************** 
*/ 
void clrram (void) 

  wr_lcd (comm,0x30); 
  wr_lcd (comm,0x01); 
  delay (180); 


/* 
******************************************************************************** 
*模块名称:显示汉字或字符定义 
*完成日期:08-7-29 
*修改内容:none 
******************************************************************************** 
*/ 
void chn_disp(unsigned char *chn) 

  unsigned char i; 
  wr_lcd (comm,0x30); 
  wr_lcd (comm,0x80); 
   
  for (i=0;i<64;i++) 
    wr_lcd (dat,chn[i]); 


//****************lcd_mesg定点显示*********************************** 
void  lcd_mesg(uint gao,uchar p,uchar q,uchar w) 

  uint adder1,adder2,adder3,adder4; 
  adder1=gao/1000,gao=gao-adder1*1000; 
  adder2=gao/100,gao=gao-adder2*100; 
  adder3=gao/10,adder4=gao%10; 

  wr_lcd(comm,p); 
      wr_lcd(dat,caidan1[adder1]);delay(20); 
      wr_lcd(dat,caidan1[adder2]);delay(20); 
  wr_lcd(comm,q); 
      wr_lcd(dat,caidan1[adder3]);delay(20); 
      wr_lcd(dat,caidan1[10]);delay(20); 
   wr_lcd(comm,w);    
      wr_lcd(dat,caidan1[adder4]);delay(20); 
      wr_lcd(dat,caidan1[0]);delay(20); 


void  lcd_mesg1(uint gao,uchar p) 

  uint adder1,adder2; 
adder1=gao/10,adder2=gao%10; 
 wr_lcd(comm,p); 
      wr_lcd(dat,caidan1[adder1]);delay(20); 
      wr_lcd(dat,caidan1[adder2]);delay(20); 


void  lcd_mesg2(uchar gao,uchar di,uchar p) 

  wr_lcd(comm,p); 
      wr_lcd(dat,caidan1[gao]);delay(20); 
      wr_lcd(dat,caidan1[di]);delay(20); 

   
/*******************************************************************************/ 

void keyprocess(void) 
{  
   
       for(aa=0;aa<4;aa++) 
       { 
           P2OUT=hang[aa];       //逐行扫描 
            if(keyin != 0x0f)break;//检测该行有键按下则退出循环 
       } 
             
       for(bb=0;bb<4;bb++)     //逐列扫描 
       { 
         if(keyin==lie[bb]) 
         { 
           save=key[aa][bb];break;        //检测该列有键按下则退出循环 
         } 
       } 
        
        
switch(save) 
       { 
 case 0: 
    if(flag_key1==1) 
         {key1=0,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=0,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break; 
          
  case 1: 
    if(flag_key1==1) 
         {key1=1,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=1,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;        
  case 2: 
    if(flag_key1==1) 
         {key1=2,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=2,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break; 
     
     case 3: 
    if(flag_key1==1) 
         {key1=3,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=3,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;      
          
      case 4: 
    if(flag_key1==1) 
         {key1=4,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=4,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;     
          
       case 5: 
    if(flag_key1==1) 
         {key1=5,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=5,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;    
     
        case 6: 
    if(flag_key1==1) 
         {key1=6,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=6,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;   
          
        case 7: 
    if(flag_key1==1) 
         {key1=7,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=7,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;   
     
        case 8: 
    if(flag_key1==1) 
         {key1=8,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=8,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break;   
     
     case 9: 
    if(flag_key1==1) 
         {key1=9,flag_key1=0;lcd_mesg2(key1,key2,0x92);} 
    if(flag_key2==1) 
         {key2=9,flag_key2=0;lcd_mesg2(key1,key2,0x92);}     
            break; 
          
   case 12:flag_key1=1;break; 
   case 13:flag_key2=1;break; 
   case 14:flag_go=1;break; 
  
       case 10: 
       case 11: 
       case 15:break; 
       }     
        
    return; 
       } 

#pragma vector = PORT2_VECTOR  
__interrupt void PORT_ISR(void)       
       
 {  
  keyprocess(); 
  P2IFG=0; 
  P2OUT = 0; 
   return; 
 } 

void main(void) 

  WDTCTL=WDTPW+WDTHOLD;                   //关看门狗 
  BCSCTL1 =CALBC1_1MHz;                   //设定DCO为1MHZ 
  DCOCTL =CALBC1_1MHZ;      
   
  init_port(); 
  init_lcd(); 
  chn_disp(caidan); 
  while(1){ 
  while((key1|key2==0)&&(flag_go==0)); 
  key1=key1*10; 
  M=key1+key2; 
  nquan=50/M*72; 
  lcd_mesg(nquan,0x8c,0x8d,0x8e);delay(10);//显示转动度数 
   
 for(;j<50/M;j++)    // 双8拍  j=50刚好一圈360 最小度数为7.2度---j=1 
  { 
     P3OUT=0X03;//AB 
      delay(420); 
      P3OUT=0X07;//ABC 
      delay(420); 
      P3OUT=0X06;//BC 
      delay(420); 
       P3OUT=0X0E;//BCD 
      delay(420); 
      P3OUT=0X0c;//CD 
      delay(420);       
       P3OUT=0X0D;//CDA 
      delay(420); 
      P3OUT=0X09;//DA 
      delay(420); 
      P3OUT=0X0B;//DAB 
      delay(420); 
  } 
  }} 


关键字:MSP430  单片机  步进电机 引用地址:MSP430单片机步进电机带显示程序

上一篇:MSP430单片机1602液晶显示程序
下一篇:MSP430单片机步进电机程序

推荐阅读最新更新时间:2024-03-16 15:53

MCU&USB设备控制器IP核的设计
  1 引言   在传统的计算机系统上常采用串口(如RS232)和并口连接外围设备,但串口和并口都存在着通信速度 慢,接口独占不利于扩展等无法克服的缺点,而通用串行总线(Universal Serial Bus,即USB)因具有传输 速度快、支持热插拔、扩展方便、抗干扰强、成本低、数据传输质量高、节省系统资源等优点而得到了广 泛的应用,当前它已成为计算机最常用的接口之一 。   现在USB控制器主要有两种:带USB接口的单片机(MCU)和纯粹的USB接口芯片。纯粹的USB接口芯片仅处 理USB通信,必须有个外部微处理器来进行协议处理和数据交换。典型产品有Philips公司的PDIUSBD11(I2C 接口)、PDIUSBD12
[单片机]
<font color='red'>MCU</font>&USB设备控制器IP核的设计
周立功单片机亮相IIC深圳,发力无线抄表领域
  在正在举行的第十三届国际集成电路研讨会暨展览会上,周立功单片机发展有限公司(简称周立功公司)展出了其近期开发的多类工业用M2M嵌入式产品-无线抄表模块。   这类产品所包括的种类很广,包括GSM/GPRS模块,CDMA模块等。据该公司的工程师翁树杰介绍,开发GPRS的原因是由于目前G网最为普及,可以方便地实现远程,无线和网络化通信。而开发CDMA产品的原因则是数据率要明显高于GPRS,又许多场合需要更高速率的大量数据的传输。   在目前抄表领域开发商云集的情况下,翁树杰认为,周立功公司具有几个优势。一是NXP平台的优势;二是基于该公司长期从事嵌入式系统研发的经验,同时也具有许多的工程设计经验,故能够为客户定制应用;再就是周
[工业控制]
周立功<font color='red'>单片机</font>亮相IIC深圳,发力无线抄表领域
基于51单片机超声波测距器设计
一、设计要求     设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。要求测量范围在0.10-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。 二、设计思路   超声波传感器及其测距原理       超声波是指频率高于20KHz的机械波。为了以超声波作为检测手段,必须产生超生波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的
[单片机]
基于51<font color='red'>单片机</font>超声波测距器设计
汽车的智能感官之“心”:适于检测及传感应用的MCU
Renesas(瑞萨电子)一直以来在汽车电子应用中具有重要地位,MCU R5F1177A属于Renesas RL78系列微控制器产品,该款MCU具有极低的功耗,丰富的模拟功能以及出色的低功耗表现,这使R5F1177A可以完美的应用于对功耗敏感的汽车电子应用,尤其是检测及传感器应用。 完备的模拟功能 世强代理的R5F1177A,集成了丰富的模拟功能,包括运算放大器、模式转换器、窗口比较器等。 同时该款MCU内部集成了4路运算放大器,2路窗口比较器,在外部配合简单的电阻电容设计,即可完成对信号的放大、滤波以及信号的监测,配合内部集成的分辨率高达12位的模数转换器,R5F1177A以极小的设计面积就可以完成对外部信号的测
[汽车电子]
CC430单片机的ADC学习
山雨欲来风满楼。 对于使用CC430的一般功能,还是需要很多模块的配合,团结就是力量。要想雨按时地落下,必须经过各个方面的配合。不过人脑又不是CPU,进程不能并行地展开,人的力量还是太微弱了,吃饭时也只能一口一口地往下咽。一步一步来,今天也就只能介绍某一个模块了。 这一篇也就只能介绍一下CC430的AD转换功能了。在一个充满模拟化的人类世界中,要想单片机这种数字化另类完成模拟数据的操作,必须得有一个能完成模拟向数字转换的模块。TI工程师确实想法很好,很厉害。CC430可以实现一段时间内多个通道数据的同时转换 ,以前在我心中只是个传说,现在终于见到面了。妈呀,又有点扯远了。 序幕缓缓拉开...........
[单片机]
CC430<font color='red'>单片机</font>的ADC学习
单片机时钟电路作用
单片机运行需要时钟支持 就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。 单片机可以看成是在时钟驱动下的时序逻辑电路。 以MCS一5l单片机为例随明:MCS一51单片机为l2个时钟周期执行一条指令。也就是说单片机运行一条指令,必须要用r2个时钟周期。没有这个时钟,单片机就跑不起来了,也没有办法定时和进行和时间有关的操作。 时钟电路是微型计算机的心脏,它控制着计算机的二个节奏。CPU就是通过复杂的时序电路完成不同的指令功能的。MCS一51的时钟信号可以由两种方式产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号:另一种为外部方式,时钟信号由外部引入。 如果没有
[单片机]
基于SX单片机实现WebServer和网络协议栈
    摘要: 讨论UBICOM公司(原SCENIX公司)的SX52BD100单片机构建Webserver的具体方案;给出硬件构成框图,并分析每一部分的作用、完成功能以及软件流程图。为了突出这种单片机的虚拟外设的特点,特别详细地说明网络协议和协议栈的具体实现。     关键词: 网络单片机 协议栈 虚拟外设 信息家电 WebServer 前 言 Internt的日益普及,信息共享程度的不断提高,给工作和生活带来了极大的方便。现在,上网浏览对于人们来说是一件很平常的事情。不仅如此,架构一个WebServer,做自己的主页也是司空见惯的。一般情况下,人们通过一台上网的电脑来建立WebServer。在这里将讨论另
[应用]
51单片机开发板的主要功能 51单片机开发板能做什么
51单片机开发板是一种基于8051系列单片机芯片的开发板,具有丰富的功能和广泛的应用。下面将详细介绍51单片机开发板的主要功能以及能够实现的各种应用。 一、基本功能: 通用输入输出:51单片机开发板具有多个通用输入输出引脚,可以连接各种外部设备和传感器,实现数据的输入和输出。 时钟管理:开发板通常会集成时钟电路,包括晶振、时钟发生器等,可以提供稳定的时钟信号给单片机使用。 存储器管理:开发板通常会搭载闪存、EEPROM、SRAM等各种类型的存储器,用于存储程序代码和数据。 电源管理:开发板通常会提供多种电源供电方式,可以选择外部电源或者USB供电。 通信接口:如串口、SPI、I2C等,可以连接各种外部设备进行数据通信
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved