msp430DA应用,可键盘程控

发布者:丝路老君最新更新时间:2016-08-23 来源: eefocus关键字:msp430  键盘程控 手机看文章 扫描二维码
随时随地手机看文章
         自己刚刚学习msp430不久,写的一个小程序:

         就是应用10位串行DA 5615将数字量转化为模拟量,用数码管显示输入10位二进制数的数值。用矩阵建模控制10位二进制数字量的输入,我设置了+1、-1、+10、-10。然后从5615的out端输出转化得到的模拟量。

 //动态显示方式 P300
//例如,要在8个数码管上分别显示"1""2""3""4",动态扫描显示的C语言程序如下(共阳极方式):

//针对本开发板,修改了部分代码

#include  
//共阳数码管的表格为:
//本表格通过LEDSET软件可以快速得到

#define uchar unsigned char
#define uint  unsigned int

unsigned char const dofly[]={0X84,  0XBD, 0XE0,  0XB0,  0X99,  0X92,  0X82,  0XBC, 0X80,  0X90, 0X88,  0X83,  0XC6,  0XA1,  0XC2,  0XCA }; 
const uchar KeyCode[16]=
{
//0->key17
0xE7,
//1->key18
0xD7,
//2->key19
0xB7,
//3->key20
0x77,
//4->key21
0xEB,
//5->key22
0xED,
//6->key23
0xDB,
//7->key24
0xDD,
//8->key25
0xBB,
//9->key26
0xBD,
//10->key27
0x7B,
//11->key28
0x7D,
//12->key29
0xEE,
//13->key30
0xDE,
//14->key31
0xBE,
//15->key32
0x7E
};
uchar KeyValue=0xFF;

uchar keyscan(void);
void delay(uint i);
void da5615(uint da);

void main(void)
{
 uchar i=0;

 uint daben;
 uint love=0x66;
 WDTCTL = WDTPW + WDTHOLD;  //停看门狗
 P6DIR |= 0x07;  //P6.1,p6.2,p6.3输出
 P4DIR = 0XFF; //P4作为段输出
 P5DIR = 0X0F; //P5作为位输出
 P4OUT = 0XFF; //熄灭所有数码管
 P5OUT = 0X00; //熄灭所有数码管
        P2DIR=0xF0;//P2.4 P2.5 P2.6 P2.7设置为输出
 P2OUT=0x00;//使按键按下时能产生中断
 P2IE=0x0F;//P2.0 P2.1 P2.2 P2.3中断允许
 P2IES=0x0F;//P2.0 P2.1 P2.2 P2.3下降沿触发中断  
 P1DIR |= BIT0+BIT1+BIT2;
 
 BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
 DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
        //初始化时钟 
 BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率
 DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
 do
 {
  IFG1&=~OFIFG;//清除振荡器失效标志
  for(i=255;i>0;i--);
 }while(IFG1&OFIFG);//判断XT2是否起振
 BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
 
 _EINT();//打开中断
        
for(;;)
 {
    for(i=0;i<4;i++)
  {   
   if(KeyValue==KeyCode[0])
   {
      KeyValue = 0xff;
                                if(love+1>1023)love=1023;
      else love=love+1;
    delay(1000);
   } 
                        if(KeyValue==KeyCode[1])
   {
      KeyValue = 0xff;
                                if(love<1)love=0;
      else love=love-1;
    delay(1000);
   }
                        if(KeyValue==KeyCode[2])
   {
      KeyValue = 0xff;
                                if(love+10>1023)love=1023;
      else love=love+10;
    delay(1000);
   } 
                        if(KeyValue==KeyCode[3])
   {
      KeyValue = 0xff;
                                if(love<10)love=0;
      else love=love-10;
    delay(1000);
   } 
  }
  delay(1000);
 da5615(love);
 daben=love;
 P4OUT =dofly[daben/1000];
 daben=daben%1000;
 P5OUT = 0x01;  
 delay(1000);
 P4OUT =dofly[daben/100];
 daben=daben%100;
 P5OUT = 0x02;
 delay(1000);
 P4OUT =dofly[daben/10];
daben=daben%10;
 P5OUT = 0x04;
 delay(1000);
 P4OUT =dofly[daben];
 P5OUT = 0x08;  //点亮数码管LED1,
 
 
   }
}


void delay(uint i)//延时函数
{
while(i--);
}

void da5615(uint da)  //5615的驱动程序,即产生10位二进制数函数
{

uchar i;
//uchar j;       //此为实验程序便于观察
//uchar k;       //此为实验程序便于观察
uint han;
da<<=6;

P1OUT=0xf9;
P1OUT=0xf8;

for (i=0;i<12;i++)
{
han=(da&0x8000);
if(han==0x8000)
{P1OUT|=0xf2;}
else P1OUT&=0xfd;
//for(j=0;j<8;j++){delay(60000);}   //此为实验程序便于观察

P1OUT|=0xf1;
da<<=1;
P1OUT&=0xfe;

}

P1OUT|=0xf4;
P1OUT&=0xfe;
delay(1000);
//for(k=0;k<8;k++)delay(40000);  //此为实验程序便于观察
 
    
}


#pragma vector=PORT2_VECTOR
__interrupt void Port2INT(void)
{
   uchar i;
 uchar colpos=0x70; //列位置
 uchar keytemp=0xff;

 for(i=255;i>0;i--); //延时,消除抖动 
 
 for(i=0;i<4;i++) //扫描4列
 {
    colpos &= 0xf0; //保持P1.4~P1.7为输出,屏蔽P1.0~P1.3
  P2OUT=colpos; //输出列
  _NOP();//延时
  _NOP();
  keytemp=P2IN & 0x0f; //获取值,屏蔽P1.4~P1.7
  keytemp |= colpos;//得到行列值,P1.0~1.3为行值,P1.4~P1.7为列值
  if((keytemp&0x0f)!=0x0f) KeyValue=keytemp; //判断是否有按键按下
  colpos>>=1; //右移一位,进行下一列扫描
  colpos|=0x80;//高位补1,因为是低输出有效,右移时高位是补0的
 }
 P2OUT=0x00;//恢复原来的值,使下次按键按下时能产生中断
 
 P2IFG=0x00;//清除中断标志位
}

关键字:msp430  键盘程控 引用地址:msp430DA应用,可键盘程控

上一篇:一种基于低功耗单片机SN8P2711A的移动电源设计
下一篇:MSP430 LED扫描程序范例(采用HC595芯片扩展)

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

基于MSP430F449D的携带式电子血压计硬件设计方案
一、血压测量原理 血压的概念就是血液流经血管壁时的压力。由心脏出来的血液,需要有推力,才能绕行身体一周,心脏就是借着不停的收缩、放松,将血液推送前进。血压有两种,一是收缩压:是当心脏收缩将血液打到血管所测得的血压,另一是舒张压:是心脏在不收缩所测得的压力。当袖带的压力等于血压时,血液开始可以流通而产生所谓的袖带声,这时候表现为收缩压,从这一刻开始做记录,直到最后袖带声音消失的时候,记录此点即为舒张压。 二、电子血压计工作原理 系统框图如图1所示。系统由恒流源、压力传感器、放大电路、带通滤波、二次放大、血压脉冲触发、液晶驱动器、键盘语音电路和单片机组成。 图1 电子血压计原理图 单片机主要原理为:PWM输出控制气泵充气漏气调
[单片机]
基于<font color='red'>MSP430</font>F449D的携带式电子血压计硬件设计方案
关于MSP430 FET-430UIF仿真器
为了使用CCS最新版的一些功能(虽然说相对低一些的版本也有,但是觉得新版本总归是更完善一些吧),安装了CCSV6.1版本。在第一次FET-430UIF仿真器连接电脑的时候,自动安装了对应的VCP驱动(系统为win7 64位)。但是在开始debug的时候,CCS却提示必须更新固件才能继续,虽然有取消按钮,但是取消之后debug也就被终止了,如下图: 然后选择了更新固件,连续更新了两次,才能进行正常的debug操作。 后来发现程序运行有不正常的地方,在程序里找bug找了一段时间之后,怀疑是不是操作系统的问题,毕竟win7 64位还是受人诟病的,于是在另外一台电脑上安装了Windows XP双系统,同样安装了CCSV6.1版本。插上
[单片机]
关于<font color='red'>MSP430</font> FET-430UIF仿真器
MSP430F249数码管显示
/****************************************************************** ** ** File : Display.c | Display led segment | ** Version : 1.0 ** Description: led 7 segment display ** Author : LightWu ** Date : 2013-4-9
[单片机]
Proteus中MSP430与SHT11的IIC通信问题
调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上。DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了。mark一下,顺便感谢那位作者,附上他的链接: http://blog.sina.com.cn/s/blog_52f5ded30100bf68.html 附上MSP430代码: 在main里调用: s_connectionreset(); s_write_status(); for(;;) { s_read_temp_and_humi();//读取温度、湿度 } sht11.h: enum {TEMP,HUMI}; #def
[单片机]
MSP430平台下实现Si4432的收发数据
Si4432芯片是Silicon Labs公司推出集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。可以工作在433M免费频段。早期生产的V2版本的不太稳定,经过SI公司改进后,B1版本的性能比较稳定,最大功率可以到20dBm(100mw),接收灵敏度可以到-121dbm,工作电压为1.9~3.6 V,20引脚QFN封装(4 mm×4 mm),可工作在315/433/868/915 MHz四个频段;内部集成分集式天线、功率放大器、唤醒定时器、数字调制解调器、64字节的发送和接收数据FIFO,以及可配置的GPIO等。因其发射功率大,接收灵敏度高,可以传输到上千米的距离,素有 穿墙王 之称。他与NRF905、CC1101无
[单片机]
MSP430实现微波成像的扫描控制与数据采集
引言   ----在无源微波遥感中,微波辐射计是一种获取场景微波特征的重要手段。微波辐射计通常是一部超外差接收机,通过接收被测场景在一定频带内的电磁辐射,转换为输出的低频信号,来表征被测场景的地物信息。利用微波辐射计来探测、接收被测目标、背景在微波波段的电磁辐射,并把接收到的辐射信号按比例用伪彩色图像直观地显现出来的系统称为微波辐射成像系统。   ----微波辐射成像系统要求在恶劣的环境和天气下长期稳定地进行天线扫描成像,所以要求系统设备用于天线扫描控制及数据采集的电路尽量简单、稳定。基于以上的要求,采用了TI公司所生产的MSP430F149型超低功耗FLASH单片机作为这套系统的从机部分,该单片机有60KB的FLASH存储器
[安防电子]
用<font color='red'>MSP430</font>实现微波成像的扫描控制与数据采集
MSP430教程17:MSP430单片机开发总结
1.#i nclude 指要在编辑器设定目录下,#i nclude 指的是在当前工程目录下。 2.要调用另一个文件中的函数,要把这个函数文件放到当前工程目录下,并且在工程中添加此文件。 3.命名中不能有-,比如:byq-ee会认为是错误的,要用下划线。 4.用IAR软件仿真时,可以加入变量,如果是查看I/O信息只需加入PXIN,PXOUT即可。 5.IAR在处理字符时,要注意,是字符处理结尾标志,他和其他编辑软件是不同的。比如我们长用字符处理回 自动在结尾处加,但IAR有些是不加的,这就要十分注意。 6.如果只用到LFX1的低速时钟,9600bit/s传输的话,接收会出现问题,原因是误差太大,可以设置到4800以下。 7.在写FL
[单片机]
基于MSP430自动胀管控制器的研制
  胀管机是针对冷凝器、冷油器、加热器、换热器中各类管材与管板胀接需要而设计开发的一种专用设备。其控制器的基本原理是用驱动电机(又称驱动马达、胀管机头)的工作电流来标定所加载的负荷,即驱动电机在一定的工作电流值下,提供相当数量的扭矩,而与之相当数量的扭矩可以通过旋转胀管器产生一定的膨胀量(胀力),它是可以被测量的。因此,通过精确测量并控制驱动马达的工作电流值,就可获得并控制所需要的膨胀量(胀力)。   目前,市场上大多数的胀管机采用51单片机,但其缺点比较突出。如内部无存储器,必需外接Flash或EPROM存储设置信息,这就导致电路比较复杂,不利于扩展,且工作电压范围较窄,抗干扰能力较差。而采用MSP430F149单片机的胀管机
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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