msp430g2553简单程序
msp430基础时钟模块包含以下3个时钟输入源。 一、4个时钟振荡源 1、lfxt1clk: 外部晶振或时钟1 低频时钟源 低频模式:hz 高频模式:(400khz-16mhz) 2、xt2clk: 外部晶振或时钟2 高频时钟源(400khz-16mhz) 3、dcoclk: 内部数字rc振荡器,复位值1.1mhz 4、vloclk: 内部低功耗振荡器 12khz 注:msp: lfxt1 不支持 hf 模式, xt2 不支持, rosc 不支持. (1)lfxt1clk 低频时钟源:由lfxt1振荡器产生(如图2所示)。通过软件将状态寄存器中oscoff复位后,lfxt1开始工作,即系统采用低频工作。如果lfxt1clk没有用作smclk或mclk信号,则可以用软件将oscoff置位,禁止lfxt1工作。 (2)xt2clk高频时钟源:由xt2振荡器产生。它产生时钟信号xt2clk,其工作特性与lfxt1振荡器工作在高频模式时类似。可简单地通过软件设置xt2振荡器是否工作,当xt2clk没有用作smclk或mclk信号时,关闭xt2,选择其他时钟源。 3)dcoclk 数字控制rc振荡器。由集成在时钟模块中的dco振荡器产生。dco振荡器是一个rc振荡器,频率可以通过软件调节,其控制逻辑如图3所示。当振荡器lfxt1、xt2被禁止或失效时,dco振荡器被自动选作mclk的时钟源。因此由振荡器失效引起的系统中断请求可以得到响应,甚至在cpu关闭的情况下也能得到处理。 由基础时钟模块可以提供系统所需的3种时钟信号,即:aclk、mclk、smclk。其中辅助时钟aclk是lfxt1clk信号经1、2、4、8分频后得到的。aclk可由软件选作各个外围模块的时钟信号,一般用于低速外设；系统主时钟mclk可由软件选择来自lfxt1clk、xt2clk、dcoclk三者之一,然后经1、2、4、8分频得到。mclk主要用于cpu和系统。子系统时钟smclk可由软件选择来自lfxt1clk和dcoclk,或者xt2clk和dcoclk,然后经1、2、4、8分频得到,主要用于高速外设模块。 中断小程序  p1口中断  } #pragma vector=wdt_vector __interr pt void watchdog_time(void) { p1out^=0x01； }  呼吸灯程序 msp430g2553 呼吸灯演示程序 - 使用timer_a,up mode, dco smclk   介绍: 该程序利用timer a 的 up模式 在p1.6脚产生pwm输出  将ccr0设置为1500来定义pwm的周期,利用循环不断改变ccr1的值,  实现利用改变pwm的占空比来改变led亮度.  aclk = na, smclk = mclk = taclk = defa lt dco   msp430g2553  --  || xin|-  | | |  --|rst xout|-  | |  | p1.6ta1|-- ccr1 - pwm   使用 msp430 la nchpad , msp430g2553芯片  在iar embedded workbench for msp430 5.40下编译测试通过  nsigned char key_val； 存放键值 void ctrlkey( nsigned char sw)； 控制键盘开关sw=0关 sw=1开 void init_keypad(void) { p1dir = 0x0f； p1.0~p1.3设置为输出状态,p1.4~p1.7输入 状态(上拉h) p1out=0； p1ies =0xf0； p1.4~p1.7允许中断 p1ie =0xf0； p1.4~p1.7下降沿触发中断 p1ifg=0； 中断标志清0 key_val = 0； } p14567 接上拉电阻 void check_key(void) { nsigned char row ,col,tmp1,tmp2； nsigned char keymap[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}；设置键盘逻辑键值 tmp1 = 0x08； for(row = 0；row  4；row) 行扫描 { p1out = 0x0f； p1.0~p1.3输出全1 p1out -= tmp1； p1.0~p1.3输出四位中有一个为0 tmp1 =1； if((p1in & 0xf0)0xf0) 是否p1in的p1.4~p1.7中有一位为0 { tmp2 = 0x10；  tmp2用于检测出哪一位为0 for(col = 0；col  4；col)  列检测 { if((p1in & tmp2) == 0x00)  是否是该列,等于0为是 { key_val = keymap[row*4 + col]；  获取键值 ret rn；  退出循环 } tmp2 = 1；  tmp2右移1位 } } } } void delay(void) { nsigned int tmp； for(tmp = ；tmp  0；tmp--)； } void key_event(void) { nsigned char tmp； p1out =0；  设置p1out全为0,等待按键输入 tmp = p1in；  获取 p1in if((tmp & 0xf0)  0xf0) 如果有键按下 { delay； 消除抖动 check_key；  调用check_key,获取键值 } } void ctrlkey( nsigned char sw) { if(sw==0) p1ie =0； 关闭端口中断 else p1ie =0xf0； 打开端口中断 } #pragma vector=port1_vector __interr pt void port(void) { if((p1ifg&0xf0)！=0) { key_event； if(key_val！=0) 键值！=0有键按下 { ctrlkey(0)； 关键盘中断 } } p1ifg=0 1out=0； 清中断标志 } 下面的程序是自己改了下,端口发生了变化！ 按键矩阵也发生了变化！ #incl de nsigned char key_val； 存放键值 void main { wdtctl=wdtpw+wdthold； init_keypad； _bis_sr(lpm3_bits + gie)； 最低功耗睡眠 while(1)； } void init_keypad(void) { p1dir = 0x38； p1.0~p1.3设置为输出状态,p1.4~p1.7输入 状态(上拉h) p1out=0； p1ies =0xc0； p1.4~p1.7允许中断 p1ie =0xc0； p1.4~p1.7下降沿触发中断 p1ifg=0； 中断标志清0 key_val = 0； } p131415 接上拉电阻 void check_key(void) { nsigned char row ,col,tmp1,tmp2； nsigned char keymap[] = {1,2,3,4,5,6}；设置键盘逻辑键值 tmp1 = 0x08； 从(相左移) for(row = 0；row  3；row) 列扫描 { p1out = 0x38； p1.3~p1.5输出全1 p1out -= tmp1； p1.3~p1.5输出四位中有一个为0 tmp1 =1； if((p1in & 0xc0)0xc0) 是否p1in的p1.4~p1.7中有一位为0 { tmp2 = 0x80；  tmp2用于检测出哪一位为0 for(col = 0；col  2；col)  行检测 { if((p1in & tmp2) == 0x00)  是否是该列,等于0为是 { key_val = keymap[row*4 + col]；  获取键值 ret rn；  退出循环 } tmp2 = 1；  tmp2右移1位 } } } } void delay(void) { nsigned int tmp； for(tmp = ；tmp  0；tmp--)； } void key_event(void) { nsigned char tmp； p1out =0；  设置p1out全为0,等待按键输入 tmp = p1in；  获取 p1in if((tmp & 0xf0)  0xf0) 如果有键按下 { delay； 消除抖动 check_key；  调用check_key,获取键值 } } #pragma vector=port1_vector __interr pt void port(void) { delay； if((p1in&0xc0)0xc0) { check_key； switch(key_val) { case 1: { ；自己接相应按键的功能 break； } case 2: { ；自己接相应按键的功能 break； } case 3: { ；自己接相应按键的功能 break； } case 4: { ；自己接相应按键的功能 break； } case 5: { ；自己接相应按键的功能 break； } case 6: { ；自己接相应按键的功能 break； } defa lt:break； } } p1ifg=0； 清中断标志 } 下面这个按键用了数组了,存放按键的值,可以应用于密码锁之类的应用！为网上淘来  此示例程序为中断方式,得到键盘的键值,存放在队列keyb ff[10]中  此示例程序没有显示,  键盘的按键按下引起p1口的中断服务程序,得到键盘的键值,保存到键值队列  在其他的中断服务程序中通过键值队列中的数据引导程序的流程 #incl de nsigned char keyb ff[10]； nsigned char keypoint=0； void delay(int v) { while(v！=0)v--； } nsigned char key(void) { nsigned char x=0xff； p1dir=0x0f； p1out=0x01； 扫描第一行 if((p1in&0x70)==0x10) x=0； else if((p1in&0x70)==0x20) x=1； else if((p1in&0x70)==0x40) x=2； else { p1out=0x2； 扫描第二行 if((p1in&0x70)==0x10) x=3； else if((p1in&0x70)==0x20) x=4； else if((p1in&0x70)==0x40) x=5； else { p1out=0x4； 扫描第三行 if((p1in&0x70)==0x10) x=6； else if((p1in&0x70)==0x20) x=7； else if((p1in&0x70)==0x40) x=8； else {p1out=8； 扫描第四行 if((p1in&0x70)==0x10) x=9； else if((p1in&0x70)==0x20) x=10； else if((p1in&0x70)==0x40) x=11； } } } ret rn(x)； } nsigned char keyj(void) { nsigned char x； p1dir=0x0f； p1out=0x0f； 键盘硬件:p10--p13为行线,最上面一根为p10 x=(p1in&0x70)；  p14--p16为列线,最左边一根为p14,列线下拉 ret rn(x)；  无按键,返回 0？； 有按键返回 非0 } interr pt[port1_vector] void port1key(void) { if(keyj！=0x00) { delay(300) ； 消抖动 if(keyj！=0x0) { keyb ff[keypoint]=key； 按键见键值保存到队列 keypoint；  if(keypoint==10) keypoint=0； } } p1out=0x0f； p1ifg=0x0； 清除中断标志 } void main(void) { wdtctl = wdtpw + wdthold； p1dir=0xf； p1out=0xf； p1ies=0x0； p1ie=0x70； 列线上升沿允许p1中断 _eint； while(1) { lpm0； _nop； } } 这个是单个按键是,输入端的p1ren要设为1。允许上拉电阻！为网上淘来 关于msp430g2553的按键程序,虽然很简单,但是纠结了一个下午,错就错在看视频的时候那个老师的片子没有加上拉电阻但是正常运行,我的却不可以,现在找到问题,希望对和我一样遇着这个问题的人有所帮助； #incl de "msp430g2553.h" #define keyin (p1in & 0x08) void delay(void)； int main(void) {  stop watchdog timer to prevent time o t reset wdtctl = wdtpw + wdthold； p1ren |= bit3； p1dir |= bit6； p1out &= ~bit6； while(1) { if(keyin ！= 0x08) { delay； if(keyin ！= 0x08) { while(keyin ！=0x08)； p1out ^= bit6； } } } } void delay(void) { nsigned int i； for(i=； i0； i--)；