历史上的今天
今天是:2025年03月03日(星期一)
2020年03月03日 | 基于MSP430f149单片机的简单秒表
2020-03-03 来源:eefocus
单片机:MSP430f149
实现功能:按下一个按键,计时开始,再次按下该按键计时暂停,即由一个按键实现暂停看开始功能,设置另一个按键,按下该按键三秒以上,秒表清零。要求计时精度,10毫秒。
该实验用到了MSP430单片机的timerA的定时功能,显示设备而用到了LCD1602.
代码如下:
#include #include "Config.h" int second = 0, minute = 0, count = 0, flag = 0, a = 0, b = 0, c = 0; unsigned char FlagLcd; //************************************************************************* // 初始化IO口子程序 //************************************************************************* void Port_init() { P4SEL = 0x00; P4DIR = 0xFF; //数据口输出模式 P5SEL = 0x00; P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式 P1SEL = 0x00; //P1普通IO功能 P1DIR = 0xF0; //P10~P13输入模式,外部电路已接上拉电阻 P1IE = 0x0f; //开启 位中断 P1IES = 0x00; //上升沿触发中断 P1IFG = 0x00; //软件清零中断标志寄存器 } //*********************************************************************** // 显示屏命令写入函数 //*********************************************************************** void LCD_write_com(unsigned char com) { RS_CLR; RW_CLR; EN_SET; DataPort = com; //命令写入端口 delay_ms(5); EN_CLR; } //*********************************************************************** // 显示屏数据写入函数 //*********************************************************************** void LCD_write_data(unsigned char data) { RS_SET; RW_CLR; EN_SET; DataPort = data; //数据写入端口 delay_ms(5); EN_CLR; } //*********************************************************************** // 显示屏清空显示 //*********************************************************************** void LCD_clear(void) { LCD_write_com(0x01); //清屏幕显示 delay_ms(5); } //*********************************************************************** // 显示屏字符串写入函数 //*********************************************************************** void LCD_write_str(unsigned char x,unsigned char y,int w) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } LCD_write_data(48+w); } //*********************************************************************** // 显示屏单字符写入函数 //*********************************************************************** void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } LCD_write_data( data); } //*********************************************************************** // 显示屏初始化函数 //*********************************************************************** void LCD_init(void) { LCD_write_com(0x38); //显示模式设置 delay_ms(5); LCD_write_com(0x08); //显示关闭 delay_ms(5); LCD_write_com(0x01); //显示清屏 delay_ms(5); LCD_write_com(0x06); //显示光标移动设置 delay_ms(5); LCD_write_com(0x0C); //显示开及光标设置 delay_ms(5); } //*********************************************************************** // TIMERA初始化,设置为UP模式计数 //*********************************************************************** void TIMERA_Init(void) //UP模式计数,计数周期为CCR0+1 { TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE; //SMCLK做时钟源,8分频,增加计数模式,开中断 TACCR0 = 9999; //CCR0=9999,10ms中断一次 } //*********************************************************************** // 关闭计时,暂停计数 //*********************************************************************** void TimerA_end(void) { TACTL &= 0xfffd; } //********************************************************************** // 扫描按键P1^2是否长按 //********************************************************************** void GetKey()//长按,返回2;短按,返回1。 { unsigned char keyRetu=0; //返回的按键值 static unsigned char s_keyState=0,keyTime=0; //按键状态,按键按下的时间 switch (s_keyState) { case 0: { if((P1IN&0x02)==0x00) //检测到有按键,转到状态1,相当于是消抖过程。 { s_keyState=1; } } break; case 1: { if((P1IN&0x02)==0x00) //再次检测到有按键,转到状态2 { s_keyState=2; keyTime=0; //清零按键时间计数器 } else { s_keyState=0; //没有检测到按键,说明状态0检测到是一个抖动,重新转到状态0 } } break; case 2: { if((P1IN&0x02)==0x02) //检测到按键松开 { s_keyState=0; //状态转到状态0 keyRetu=1; //输出1 } else { if(++keyTime>=150) //按下时间>1s { s_keyState=3; //转到状态3 keyTime=0; //清零按键时间计数器 keyRetu=2; // 输出2 } } } break; case 3: { if((P1IN&0x02)==0x02) //检测到按键松开 { s_keyState=0; //状态转到状态0 } else { s_keyState=3; //转到状态3 } } break; } if(keyRetu==2) { a = 0; b = 0; c = 0; count = 0; second = 0; minute = 0; } } //*********************************************************************** // TIMERA中断服务程序,需要判断中断类型 //*********************************************************************** #pragma vector = TIMERA1_VECTOR __interrupt void Timer_A(void) { switch(TAIV) //需要判断中断的类型 { case 2:break; case 4:break; case 10:count++;break; //设置标志位Flag } if(count==100) //100次为1秒 { second++; count=0; } if(second == 60) { minute++; second = 0; } GetKey(); } //********************************************************************** // P1口中断服务程序,需要判断 //********************************************************************** #pragma vector = PORT1_VECTOR __interrupt void P1_IRQ(void) { switch(P1IFG&0x0F) { case 0x01: { flag++; P1IFG=0x00; } break; default:P1IFG = 0x00;break; } } //*********************************************************************** // 主程序 //*********************************************************************** void main(void) { WDT_Init(); //看门狗设置 Clock_Init(); //系统时钟设置 Port_init(); //系统初始化,设置IO口属性
下一篇:IAR6.3创建MSP430工程
史海拾趣
|
数据分析线程在读信号量和消费者指针的控制下成功读取一包数据后,根据通道标示号提取此包中每个通道的数据,写入对应的内存映射文件中,再调用数据处理函数对每个通道数据做误码分析。误码分析的结果可由主界面线程调用显示。数据分解流程如图4所 ...… 查看全部问答> |
|
S3C6410 Camera接口获取图像成功,但是数据全是0.求助!!! 我用在WINCE 使用S3C6410的摄像头驱动,应用程序中使用DeviceIoControl来设置摄像头属性和获取一帧数据。 在驱动的程序中看到了它的控制代码如下: // prepare 准备好DMA缓存,设置成 CAPTURE / VIDEO / PREVIEW 模式 #define ...… 查看全部问答> |
|
在应用程序里如何查询某个USB连在哪一个USB controller上 在具有多个USB controller和多个USB设备的情况下, 如何查询这些USB设备连接在哪个USB controller上。 设备管理器中,如果选择“依连接排序设备”,就可以看到所 有设备的Device Tree,VC里有什么API或者什么方法可以获得 类似的信息吗? 请高 ...… 查看全部问答> |
|
看看有没有问题,第一次玩STM32,没有什么经验,硬件是按照st-link制作的,做了一些修改(st-link本来也是一块开发板)。准备自己做JTAG下载工具或者调试工具,呵呵,如果搞的定的话。PCB还没铺地,其他都OK了。发现一个错误,应该BOOT1接地,BO ...… 查看全部问答> |
|
μC/OS-II实时性能测试指标 衡量嵌入式实时操作系统的好坏一般主要参考以下主要性能指标参数: 任务切换时间、中断响应时间、任务响应时间、任务创建/删除时间、交替信号量时间、取得/释放信号量时间、交替消息队列传输时间等。本文仅对前2个 ...… 查看全部问答> |
|
我用hot51开发板做实现测量电压和输出相同电压的功能,但是没有响应,麻烦大家指出我程序的问题,谢谢了 /* PCF8591四路电压 LCD1602显示 参考电压接至5V电源 */ /* 最小输出电压:0.00V 最大输出电压:5.00V 分辨率:0.02V */ /****************** ...… 查看全部问答> |




