基于MSP430F149矩阵键盘设计程序附仿真图
- 格式:doc
- 大小:46.00 KB
- 文档页数:3
MSP430矩阵键盘程序/************************************************************** **************keyboard for MSP430Designed by CUGer——Mr.Wei程序可用,当系统时钟改变时,注意修改按键消抖延时*************************************************************** *************/ #include#define KEY_DIR P1DIR#define KEY_OUT P1OUT#define KEY_IN P1IN#define KEY_IE P1IE#define KEY_IES P1IES#define KEY_IFG P1IFG/***************全局变量***************/unsigned char Key_Val; //存放键值void CtrlKey(unsigned char sw); //控制键盘开关//sw=0关sw=1开/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){KEY_DIR = 0x0f; //P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H)KEY_OUT &=0xf0; //P1.0~P1.3输出为低电平(卫编)KEY_IES =0xf0; //P1.4~P1.7下降沿触发中断KEY_IE =0xf0; //P1.4~P1.7允许中断KEY_IFG= 0; //中断标志清0Key_Val = 16; //按键值初始设为非0~15的值均可}/*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无********************************************///p14\5\6\7 接上拉电阻/***************************************key_Val 对应键值列:[p14] [p15] [p16] [p17]↓↓↓↓行:[p13]→0 1 2 3[p12]→ 4 5 6 7[p11]→8 9 10 11[p10]→12 13 14 15***************************************/void Check_Key(void){unsigned char hang ,lie,tmp1,tmp2;unsigned char keymap[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//设置键盘逻辑键值与程序计算键值的映射tmp1 = 0x08;for(hang = 0;hang < 4;hang++) //行扫描{KEY_OUT = 0x0f; //P1.0~P1.3输出全1KEY_OUT -= tmp1; //P1.0~p1.3输出四位中有一个为0tmp1 >>=1;if((KEY_IN & 0xf0)<0xf0) //是否P1IN的P1.4~P1.7中有一位为0{tmp2 = 0x10; // tmp2用于检测出哪一位为0for(lie = 0;lie < 4;lie++) // 列检测{if((KEY_IN & tmp2) == 0x00) // 是否是该列,等于0为是{Key_Val = keymap[hang*4 + lie]; // 获取键值return; // 退出循环}tmp2 <<= 1; // tmp2右移1位}}}}/*******************************************函数名称:delay功能:延时约15ms,完成消抖功能返回值:t= tmp*5*clk 根据使用时钟调整tmp值********************************************/void delay(void){unsigned int tmp;for(tmp = 12000;tmp > 0;tmp--);}/*******************************************函数名称:Key_Event功能:检测按键,并获取键值参数:无返回值:无********************************************/void Key_Event(void){unsigned char tmp;KEY_OUT =0; // 设置P1OUT全为0,等待按键输入tmp = KEY_IN; // 获取p1INif((tmp & 0xf0) < 0xf0) //如果有键按下{delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值switch(Key_Val)//P2.0~P2.3接发光二极管,测试程序用{case 0: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 1: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 2: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 3: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 4: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 5: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 6: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT^=BIT2;break;case 7: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 8: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 9: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 10: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 11: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 12: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 13: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 14: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 15: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;default :break;}}}/************************************************************** ******* 控制打开或者关闭键盘中断SW= 0:关闭;ELSE:打开*************************************************************** ******/ void CtrlKey(unsigned char sw){if(sw==0)KEY_IE =0; //关闭端口中断elseKEY_IE =0xf0; //打开端口中断}/************************************************************** *******主函数*************************************************************** ******/void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗Init_Keypad(); //键盘初始化delay();CtrlKey(1); //键盘打开while(1)Key_Event(); //不断扫描,获取键值}/*端口1按键中断*/#pragma vector=PORT1_VECTOR__interrupt void Port(void){if((KEY_IFG&0xf0)!=0){Key_Event();if(Key_Val!=16) //键值!=16有键按下{CtrlKey(0); //关键盘中断}}KEY_IFG=0;KEY_OUT=0; //清中断标志}。
基于MSP430F149的OLED显示系统的设计作者:刘勇来源:《电子技术与软件工程》2013年第23期摘要:有机发光二极管是最具发展潜力的显示技术之一,由于LCD具有价格偏高、可视角度小、反应时间慢等缺点,本文设计了基于MSP430F149的OLED显示系统电路。
分析了OLED显示驱动芯片SSD1306的工作原理,采用美国德州仪器(TI)公司开发的MSP430F149作为处理器,显示模块采用ALINETEK的OLED12864,设计了SSD1306与MSP430F149的硬件接口连接,并分析了软件设计。
【关键词】有机发光二极管 MSP430F149 显示系统与传统的LCD相比,OLED具有体积小、高亮度、宽视角、自发光、低功耗、寿命长、动态范围广、可弯曲及在低温条件下能够正常工作等优点,OLED被业界誉为最有潜力的显示器件之一。
OLED点阵显示技术是集微电子、计算机和信息处理一体的显示方式。
随着电子产品不断地发展,OLED显示模块在移动电话、工业控制、便携式电子产品等领域获得了广泛的应用。
本文介绍了一种基于MSP430F149的OLED显示系统的设计。
1 系统硬件设计1.1 OLED模块本电路选用的OLED显示模块采用ALINETEK的OLED显示屏,该显示模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色,显示尺寸为0.96寸,分辨率为128*64,该模块提供了8位的6800、8080系列MCU两种并行接口方式、3线或4线的穿行SPI接口方式和IIC接口方式。
其中,OLED的操作电压为3.3V,电路中通过DC-DC变换器就可以让OLED正常工作。
其中5种模式通过模块的BS0~2高低电平的选择来进行设置,BS0-2的设置与模块接口模式的关系如表1所示。
ALIENTEK OLED模块默认设置为8080并口方式,如果需要设置其他模式,则只要进行相应的修改即可。
ALIENTEK模块的原理图如图1所示。
微控制器应用及系统设计课程设计报告南京理工大学20012 年 4 月目录1 引言 (2)2 系统总体设计 (2)2.1系统组成结构和工作原理 (2)2.2系统工作流程 (3)3 系统硬件设计 (5)3.14位独立式按键电路设计 (5)3.2七段共阴极LED数码管电路设计 (6)3.31602LCD电路设计 (7)3.4ADC转换电路设计 (7)3.58位流水灯电路设计 (8)4 系统软件设计 (8)4.1ADC转换实现从题库中随机选题程序设计 (8)4.2LCD显示程序设计 (10)4.3按键实现确认键值程序设计 (13)4.4七段共阴极LED数码管实现显示题号、分数程序设计 (13)4.58位流水灯实现状态指示和流水灯效果程序设计 (13)4.6P1端口中断实现选难度、选答案程序设计 (14)4.7T IMER_A中断实现游戏结束画面程序设计 (14)5 调试过程中遇到的问题及解决方法 (14)6 结论与心得体会 (15)7 参考文献 (16)8 代码1 引言从上世纪80年代开始,随着MCU技术的成熟与大众生活的娱乐化,家庭游戏机开始风靡全球。
市场上最开始出现的是任天堂公司的8位游戏机FC(FamilyComputer),随着MCU技术更加蓬勃的发展,功能越来越强大的MCU投入到游戏机的生产中,到目前为止,功能最强大的游戏机例如PS3(PlayStation3)已经是采用”Cell”处理器的256位游戏机了。
此次我们将设计一个迷你游戏机,设计采用TI公司的MSP430F149超低功耗单片机,面向人群为刚接触算术运算的小学生,其实现的功能为:让玩家依据题目选择选项,如“1+1 A=1 B=2”,此时我们选择B=2。
根据不同的对象选择不同的题库,如十以内的加减法、一百以内的加减法、九九乘法表、一千以内的乘除法等等。
此游戏机结合学习、游戏为一体,让玩家可以在玩游戏的同时巩固最基本的算术运算。
由于条件和时间的限制,我们此次只做了一个比较精简的版本。
自文档归原著所有LT-1BMSP430F149 学习板原理图技术文档说明:自文档归原著所有,但原理图部分有本人自己画图所得,将原著分开的文档画在一个工作区内,方便查阅。
MSP430F149学习板特点选用16 位超低功耗单片机MSP430F149,此MCU的特点如下:l 1.8V~3.6V超宽供电电压l 5 种低功耗模式,从standby 模式唤醒时间小于6μsl0.1uA RAM 保持l0.8uA 实时时钟模式l2K RAM,60KB+256B Flash Memory(支持IAP)l片内硬件乘法器支持四种乘法运算l两个具有PWM输出单元的16-Bit定时器(TimerA3,TimerB7)l两个UART接口,两个SPI 接口(与UART 复用)l一个8 通道12-Bit模数转换器(ADC),具有片内参考电压源l一个模拟比较器,看门狗电路等开发板上功能全面、板上资源丰富:¾三种可选供电方式(标准稳压器接口、USB 接口、电池接口)¾一个8-Bit 双向电平转换接口(5V--3.3V, 3.3V--5V)¾一个兼容USB2.0 规范、符合USB1.1 规范的标准USB 接口¾一个标准的六芯PS2 接口¾一个符合原厂标准的JTAG 仿真调试端口¾一个蜂鸣器¾一个射频通信模块接口¾一个12-Bit 高精度温度传感器¾一个8 路12-Bit 模数转换器(ADC)接口¾一个标准的1602 液晶接口¾一个标准的12864液晶接口¾一个六位共阴极动态扫描数码管电路¾一个可更换的CPU适配器¾一个RTC实时时钟+纽扣电池¾一个存储容量为256×8-Bit的EEPROM¾一个单路输出8-Bit 数模转换器(DAC)¾一个4×4的矩阵式键盘¾一个4×1的独立式按键(与4×4 的矩阵式键盘复用)¾一个标准的RS232接口¾一个简易的RS485接口¾一个含8 个LED 的流水灯电路(红、黄、绿)¾MCU 的全部IO 都用插针引出,便于二次开发提供电源指示灯和上电自动复位、手动复位电路,全SMD 设计、系统稳定可靠。
/************键盘部分**********************/#include <msp430x14x.h>#include "keyscan.h"void key_init(void){KEY_DIR=0x0f;//将P1.0~1.3设置为输出(行),将P1.4~1.7设置为输入(列)}uchar key_scan(void){uchar tmp1,row,key_val,tmp2;uchar key;tmp1=0x01;KEY_HANG=0xf0;//将行全部拉低,好去判断下面是否有键按下if((KEY_LIE&0xf0)!=0xf0)//判断是否有键按下{delay5ms(); //延时5毫秒for(row=0;row<4;row++)//一行一行的扫描{KEY_HANG=~tmp1;//tmp2=KEY_LIE&0xf0;if((KEY_LIE&0xf0)!=0xf0){tmp2=(KEY_LIE&0xf0);key = (KEY_HANG&0x0f) | tmp2;break;}else tmp1<<=1;}while((KEY_LIE&0xf0)!=0xf0);//等待按键释放switch(key)//获取键值{case 0xee:key_val='1';break;case 0xde:key_val='2';break;case 0xbe:key_val='3';break;case 0x7e:key_val='A';break;case 0xed:key_val='4';break;case 0xdd:key_val='5';break;case 0xbd:key_val='6';break;case 0x7d:key_val='B';break;case 0xeb:key_val='7';break;case 0xdb:key_val='8';break;case 0xbb:key_val='9';break;case 0x7b:key_val='C';break;case 0xe7:key_val='*';break;case 0xd7:key_val='0';break;case 0xb7:key_val='.';break;case 0x77:key_val='D';break;default:key_val='#';}}return key_val;}/*delay5ms for key dejitter*/void delay5ms(void){uint i=2000;while(i--);}/****************LCD部分**************************/ #include <msp430x14x.h>#include "cry1602.h"//typedef unsigned char uchar;//typedef unsigned int uint;#define uchar unsigned char#define uint unsigned int/******************************************* 显示坐标行列********************************************/void LocateXY(uchar x,uchar y){uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; //如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);}/*******************************************显示单字符********************************************/void Disp1Char(uchar x,uchar y,uchar data){LocateXY( x, y );LcdWriteData( data );}/*******************************************LCD初始化********************************************/void LcdReset(void){CtrlDir |= 0x38; //控制线端口设为输出状态DataDir = 0xFF; //数据端口设为输出状态LcdWriteCommand(0x38, 0); //规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1); //显示模式设置LcdWriteCommand(0x08, 1); //显示关闭LcdWriteCommand(0x01, 1); //显示清屏LcdWriteCommand(0x06, 1); //写字符时整体不移动,写字符后地址指针加一,光标加一LcdWriteCommand(0x0f, 1); //显示开,显示光标,光标闪烁}/*******写命令********************************************************************************/void LcdWriteCommand(uchar cmd,uchar chk){if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort = cmd; //将命令字写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************写数据********************************************/void LcdWriteData( uchar data ){WaitForEnable(); //等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; //将显示数据写入数据端口_NOP();SET_EN; //产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************检测忙信号********************************************/void WaitForEnable(void){P2DIR &= 0x00; //将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN & Busy)!=0); //检测忙标志CLR_EN;P2DIR |= 0xFF; //将P4口切换为输出状态}/*******************************************延时函数,消抖用********************************************/ void Delay5ms(void){uint i=4000;while (i != 0){i--;}}/****************主程序部分***************************/#include <msp430x14x.h>#include "keyscan.h"#include "cry1602.h"//#include "clock.c"//#define uchar unsigned charvoid main( void ){uchar x=0,y=0;WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset /*关闭所有IO口,以使之后未用到的IO口保持关闭以降低功耗*/P1DIR=0xff;P1OUT=0xff;P2DIR=0xff;P2OUT=0xff;P3DIR=0xff;P3OUT=0xff;P4DIR=0xff;P4OUT=0xff;P5DIR=0xff;P5OUT=0xff;P6DIR=0xff;P6OUT=0xff;//sysclk();key_init();LcdReset();//LocateXY(0,0);while(1){KEY_HANG=0xf0;//将行全部拉低,好去判断下面是否有键按下if((KEY_LIE&0xf0)!=0xf0)//判断是否有键按下{delay5ms();//LocateXY(x,y);if(x==0x10){if(x==0x10&&y==1)LcdWriteCommand(0x01, 1);//显示清屏x=0;y^=1;LocateXY(x,y);LcdWriteData( key_scan() );}else{LocateXY(x,y);LcdWriteData( key_scan() );}x++;}}}。
Protues 电路连接图如下所示:PS:矩阵键盘说明——4×4矩阵从左到右依次编码为1,,3,4,5,6,7,8,9,10,11,12,13,14,15,16按下某一按键,Led数码管就会显示相应的数字。
Keil C51 程序如下:有点不足望改进。
O(∩_∩)O谢谢!!!/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////#include <reg51.h>#define uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char#define uint unsigned int //宏的定义变量类型 uint 代替 unsigned intuchar dis_buf; //显示缓存uchar temp;uchar l,h,j; //定义行列void delay0(uchar x); //x*0.14MS// 此表为 LED 的字模 0 1 2 3 4 5 6 78 9uchar code LED7Code[] = {0xc0,0xf9,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};/************************************************************* * ** 延时子程序 ** **************************************************************/void delay(uchar x){ uchar j;while((x--)!=0) //CPU执行x*12次,x=10{ for(j=0;j<50;j++){;}}}/************************************************************* * * * 键扫描子程序 (4*4的矩阵) P1.4 P1.5 P1.6 P1.7为行 * * P1.0 P1.1 P1.2 P1.3为列 ** * *************************************************************/void keyscan(void){ temp=0;P1=0xF0; //高四位输入行为高电平列为低电delay(3); //延时temp=P1; //读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp>>4)|0xF0); //高四位取反无键按下取反应为0xf0if(temp==1) //0001 [1,1] 被拉低h=1;else if(temp==2) //0010[2,1] 被拉低h=2;else if(temp==4) //0100[3,1] 被拉低h=3;else if(temp==8) //1000[4,1] 被拉低h=4;dis_buf = h;dis_buf = (dis_buf<<4) & 0xf0; //行信息现存在第四位delay(10);P1=0x0F; //低四位输入列为高电平行为低电平delay(3); //延时temp=P1; //读P1口temp=temp&0x0F; //屏蔽高四位temp=~(temp|0xF0); //取反if(temp==1) //1列被拉低l=1;else if(temp==2) //2列被拉低l=2;else if(temp==4) //3列被拉低l=3;else if(temp==8) //4列被拉低l=4;l= l & 0x0f;delay(3);dis_buf= l | dis_buf;}/************************************************************** **判断键是否按下 ** **************************************************************/void keydown(void){P2=0xF0; //显示00P3=0xf0;//将高4位全部置1 低四位全部置0if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}void display( ){j=50;while(j){P2= 0x80;P0= LED7Code[0];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display1( ){j=50;while(j){P2= 0x80;P0= LED7Code[2];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display2( ){j=50;while(j){P2= 0x80;P0= LED7Code[3];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display3( ){j=50;while(j){P2= 0x80;P0= LED7Code[4];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display4( ){j=50;while(j){P2= 0x80;P0= LED7Code[5];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;} }void display5( ){j=50;while(j){P2= 0x80;P0= LED7Code[6];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}/************************************************************** ** 主程序 ** **************************************************************/ void main(){P0=0xc0;delay(20); //延时while(1){ keydown(); //调用按键判断检测程序switch( dis_buf){case 0x11 : P2=0x80; P0= LED7Code[1]; break;case 0x12 : P2=0x80; P0= LED7Code[2]; break;case 0x13 : P2=0x80; P0= LED7Code[3]; break;case 0x14 : P2=0x80; P0= LED7Code[4]; break;case 0x21 : P2=0x80; P0= LED7Code[5]; break;case 0x22 : P2=0x80; P0= LED7Code[6]; break;case 0x23 : P2=0x80; P0= LED7Code[7]; break;case 0x24 : P2=0x80; P0= LED7Code[8]; break;case 0x31 : P2=0x80; P0= LED7Code[9]; break;case 0x32 : display();break;case 0x33 : P2 = LED7Code[1]; P0= LED7Code[1]; break;case 0x34 : display1(); break;case 0x41 : display2(); break;case 0x42 : display3();; break;case 0x43 : display4();; break;case 0x44 : display5();; break;}delay(250);}}/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////(注:本资料素材和资料部分来自网络,仅供参考。
基于M SP 430F 149单片机的键盘显示系统A Keypad and LCD System ba sed on M SP 430F 149杨凌志 张爱玲(太原理工大学 太原 030024)【摘 要】 给出了一种基于T I 公司的16位FLA SH 型M SP 430F 149单片机的键盘显示系统的接口设计方案及程序实例,介绍了M SP 430F 149与液晶显示模块HD 66421的特性、结构、接口电路和程序设计,实验证明,该系统电路运行稳定可靠,具有可移植性。
【关键词】 单片机,键盘L CD 显示,HD 66421,M SP 430F 149ABSTRACT T h is paper p resen ts an examp le of keypad &L CD system on 16b its and flashtype m icrocon tro ller M SP 430F 149that is p roduced by T ICompany .T he characters and structu re ofM SP 430F 149and L CD HD 66421,in terface circu it and p rogram de 2sign ,are in troduced .T hat system circu it is stab ilized and reliab le that has been p roved th rough experi m en t ,and can be tran sp lan ted .KEYWOR D S single ch i p p rocesso r ,keypad &L CD ,HD 66421,M SP 430F 1491 M SP 430F 149的特性和硬件结构M SP 430F 149单片机工作电压为1.8V ~3.3V ,在1M H z 时钟条件下,最大工作电流仅有350ΛA ;具有5种低功耗工作模式,在不同的工作模式下,工作电流可下降到70ΛA 0.1ΛA 。