历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2018年01月30日 | msp430单片机控制步进电机带显示程序

2018-01-30 来源:eefocus

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); 
  } 
  }} 


推荐阅读

史海拾趣

FOCI Fiber Optic Communications Inc公司的发展小趣事

FOCI Fiber Optic Communications Inc.公司发展的五个故事

故事一:成立与初创期

FOCI Fiber Optic Communications Inc.(以下简称FOCI)成立于1995年,由台湾工业技术研究院(工研院)的核心团队创立。这家公司自诞生之初就专注于光纤互连技术的发展,致力于设计、制造和销售高性能的光纤组件和集成模块。初创时期,FOCI凭借其对光纤技术的深刻理解和市场需求的敏锐洞察,逐步在市场上站稳脚跟,成为光纤通信领域的一股新兴力量。

故事二:技术创新与突破

FOCI在发展过程中,始终将技术创新视为企业发展的核心驱动力。公司不断投入研发资源,在光纤耦合器、PLC分配器、薄膜粗波分复用/密集波分复用以及多光纤电缆组装模块等领域取得了多项技术突破。这些技术创新不仅提升了产品的性能和质量,还大幅降低了生产成本,使得FOCI的产品在市场上更具竞争力。

故事三:与奇景光电的战略合作

2024年,半导体解决方案无晶圆厂巨头奇景光电(Himax Technologies)宣布向FOCI投入5.22亿新台币(折合约为1610万美元)的资金。这次投资不仅是两家公司财务合作的结果,更是双方在技术融合与应用拓展上迈出的重要一步。根据合作协议,FOCI的共封装光学器件(CPO)与奇景光电的晶圆级光学器件(WLO)将被整合到多芯片模块中,这些模块将广泛应用于高性能计算、云服务器、人工智能等多个领域。

故事四:全球化布局与市场拓展

随着全球光纤通信市场的快速发展,FOCI积极实施全球化战略,不断拓展国际市场。公司通过参加国际展会、建立海外销售网络等方式,将高性能的光纤组件和集成模块带到了世界各地。特别是在光纤到户(FTTH)和云计算领域,FOCI的产品因其高效、低成本的特性而广受欢迎,成功在全球市场占据了一席之地。

故事五:子公司设立与多元化发展

为了进一步拓展业务领域和市场份额,FOCI在国内设立了多家子公司,如中山上诠通信科技有限公司等。这些子公司不仅继承了FOCI在光纤通信领域的深厚底蕴和技术优势,还根据当地市场需求进行了产品和服务的本地化调整。同时,FOCI还积极探索多元化发展路径,涉足光纤高速数据传输技术开发设计、研发和咨询等多个领域,为公司未来的持续发展奠定了坚实基础。

Dowosemi公司的发展小趣事

在电子保护器件领域,Dowosemi公司以其创新的TVS二极管技术崭露头角。该公司研发团队经过数年的努力,成功开发出具有PS级响应速度、大瞬态功率和低漏电流的TVS二极管。这一技术突破大大提高了产品的性能,满足了市场对高效能过电压保护元件的需求。Dowosemi公司凭借这一优势,迅速在市场上确立了领先地位。

冠图电子(GTL-POWER)公司的发展小趣事

Dowosemi公司一直将产品质量视为企业的生命线。他们建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都进行严格的把控。此外,公司还定期对员工进行质量培训,确保每一位员工都能深刻理解并贯彻执行质量标准。这种对质量的坚持让Dowosemi公司的产品在市场上赢得了良好的口碑。

Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON一直注重技术创新和品质保证。公司不断投入研发资金,引进先进技术和设备,以确保产品的质量和性能始终处于行业领先地位。同时,ELECTRONICON还建立了完善的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格的质量控制。

Amphenol Nexus公司的发展小趣事

1998年,Amphenol Nexus Technologies经历了一次重要的领导层更迭。拜尔斯先生退休,弗雷德·法拉哈尼(Fred Farahani)收购了Nexus, Inc.的股份,并与弗拉纳根先生成为合伙人。在Fred的领导下,公司开始关注销售和开发方面的新机遇,产品基础也扩展到包括微型连接器系列。这一变革为公司带来了新的增长点,使其在激烈的市场竞争中保持了领先地位。

GREEGOO公司的发展小趣事
使用时钟信号重整器对时钟信号进行重新整形,使时钟信号的时序更加准确。

问答坊 | AI 解惑

FPGA设计流程简介及设计注意事项

    欢迎大家加入 FPGA技术群:63296979…

查看全部问答>

单片机第六课:单片机的内外部结构分析(四)

上两次我们做过两个实验,都是让P1.0这个引脚使灯亮,我们可以设想:既然P1.0可以让灯亮,那么其它的引脚可不可以呢?看一下图1,它是8031单片机引脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都可以让灯亮呢?除了以P1开头的外,还有以P0, ...…

查看全部问答>

一个CCeCommandBar的问题

框架结构中,使用m_wndCommandBar.Create(this)创建命令栏,但不添加Menu,ToolBar,以及关闭按钮等,这样命令栏就显示不出来,请教高人如何才能得到一个空白命令栏呢?…

查看全部问答>

wince 5.0下的串口驱动是如何实现的?

如题: 本人接触的是XScale 270的平台,但是当我把整个串口驱动读完之后,切没有发现串口是否是使用中断来实现的? 为什么在代码里面看不到呢?急!!!!!!!…

查看全部问答>

ARM面试问题

面试官说ARM上调试程序时,如果知道了指令的16进制地址,就可以计算出对应的C源代码的地址,前提是在编译时需要使用一个命令行参数,问具体怎么做? 我说用-g参数结合debugger来做。可是面试官说我没有做过arm开发,他说做过arm开发的人应该知道怎 ...…

查看全部问答>

wince上ucp通信问题

请问各位大哥,pda能通过无线网络与pc之间进行udp通信吗?我用evc写的一个udp通信的程序,在pda上自己给自己发是可以收到的,但是给pc机发送时pc机收不到,pc机上的udp接收程序是用CB写的,不知道是不是我的程序有问题?望各位大虾指点一下,谢谢了!…

查看全部问答>

开发板申请

学习入门,降低功耗…

查看全部问答>

基于FPGA的教仪实验箱开发

FPGA核心板开发使用手册,大家相互探讨技术 [ 本帖最后由 yifan5156 于 2013-7-17 16:52 编辑 ]…

查看全部问答>

13年原件清单

本帖最后由 paulhyde 于 2014-9-15 03:40 编辑 应该是真的。。    …

查看全部问答>