MSP430单片机的4X4矩阵键盘C语言程序
基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计报告

单片机原理及接口技术课程设计报告设计题目:计算器设计信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价格低,用途灵活,无处不在,属专用计算机。
是一种特殊器件,需经过专门学习方能掌握应用,应用中要设计专用的硬件和软件。
近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。
与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。
影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。
其中系统的抗干扰性能是系统可靠性的重要指标。
数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的出现可以大大解放人在设计计算过程中的工作量,使计算的精度、速度得到改善,通过msc51单片机,矩阵键盘和LED数码管可以实现简单的四位数的四则运算和显示,并当运算结果超出范围时予以报错。
注:这一部分主要描述题目的背景和意义,对设计所采取的主要方法做一下简要描述。
字数不要太多,300-500字。
另注:本文要当做模板使用,不要随意更改字体、字号、行间距等,学会使用格式刷。
文中给出的各项内容都要在大家的报告中体现,可采用填空的方式使用本模板。
1. 设计任务结合实际情况,基于AT89C51单片机设计一个计算器。
该系统应满足的功能要求为:(1) 实现简单的四位十进制数字的四则运算;(2) 按键输入数字,运算法则;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。
主要硬件设备:AT89C51单片机、LED数码管、矩阵键盘。
注:这一部分需要写明系统功能需求,用到的主要硬件(参考实验箱的说明书)。
2. 整体方案设计计算器以AT89C51单片机作为整个系统的控制核心,应用其强大的I/O功能和计算速度,构成整个计算器。
通过矩阵键盘输入运算数据和符号,送入单片机进行数据处理。
MSP430矩阵键盘程序

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; //清中断标志}。
MSP430和AT89C51单片机4x4键盘C程序

MSP430和AT89C51单片机4x4键盘C程序本程序在一位上显示按键,如果多位显示主程序需要修高为多位显示。
本程序软件包括去抖功能,没有注释说明。
#include#define uchar unsignedchar#define uint unsigned intuint key,i;uchar temp,temp1,ms,buff;uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void delay(ms){while(ms--) {for(i=0;i<120;i++); }}void B_key(){ temp1=0xfe; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1; switch(temp) { case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; default:break; } } } temp1=0xfd; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1;switch(temp) { case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; default:break; } } } temp1=0xfb;P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1; switch(temp) { case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break;case0x7b:key=11;break; default:break; } } } temp1=0xf7; P1=temp1; if(P1!=temp1) { delay(10); if (P1!=temp1) { temp=P1;switch(temp) { case 0xe7:key=12;break; case 0xd7:key=13;break; case 0xb7:key=14;break; case 0x77:key=15;break;default:break; } }}}void main(){while(1){ B_key(); P2=tab[key]; P3=0x04;}}tips:感谢大家的阅读,本文由我司收集整编。
4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
4X4矩阵式键盘输入程序

4*4 键盘程序readkeyboard: orl a,#0f0h mov a, r2begin: acall key_on mov r6,a swap a jnz delay cpl a add a,r3ajmp readkeyboard jz next retdelay:acall delay10ms ajmp key_c key_ccode:push a acall key_on next: mov a,r7 swap ajnz key_num jnb acc.7,error anl a,#0fhajmp begin rl a dec akey_num:acall key_p mov r7,a rl a ; 行号乘anl a,#0FFh ajmp l_loop 4jz begin error:mov a,#00h rl aacall key_ccode ret mov r7,apush a key_c:mov r2,#00h pop akey_off:acall key_on mov r3,#00h anl a,#0fh jnz key_off mov a,r6 dec apop a mov r5,#04h add a,r7ret again1:jnb acc.0,out1retkey_on: mov a,#00h rr a delay10ms: orl a,#0fh inc r2 anl tmod,#0f0h mov p1,a djnz r5, again1 orl tmod,#01h mov a,p1 out1: inc r2 mov th0,#0d8h orl a,#0f0h mov a,r7 mov tl0,#0f0h cpl a mov r5,#04h setb tr0ret again2:jnb acc.4,out2wait:jbc tf0,overkey_p: mov r7,#0efh rr a ajmp waitl_loop:mov a,r7 inc r3 clr tr0 mov p1,amov a,p1 djnz r5,again2out2: inc r3 单片机键盘设计over:ret二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。
单片机c语言程序设计---矩阵式键盘实验报告

单片机c语言程序设计---矩阵式键盘实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称:矩阵式键盘实验一、实验目的和要求1.掌握矩阵式键盘结构2.掌握矩阵式键盘工作原理3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法二、实验内容和原理实验1.矩阵式键盘实验功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计电路原理图如下仿真所需元器件(2)proteus仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。
具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。
完成思考题。
三、实验方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
四、实验结果与分析void Scan_line()//扫描行{Delay(10);//消抖switch ( P1 ){case 0x0e: i=1;break;case 0x0d: i=2;break;case 0x0b: i=3;break;case 0x07: i=4;break;default: i=0;//未按下break;}}void Scan_list()//扫描列{Delay(10);//消抖switch ( P1 ){case 0x70: j=1;break;case 0xb0: j=2;break;case 0xd0: j=3;break;case 0xe0: j=4;break;default: j=0;//未按下break;}}void Show_Key(){if( i != 0 && j != 0 ) P0=table[ ( i - 1 ) * 4 + j - 1 ];else P0=0xff;}五、讨论和心得。
4×4矩阵键盘数码管显现按键值程序

4×4矩阵键盘数码管显现按键值程序4;x;4矩阵键盘数码管显现按键值程序//电路阐明如下。
//单片机:运用51系列兼容的即可;//4;x;4矩阵键盘:接在P1口;//两位数码显现器:P0口输出七段码,P2口输出位选码。
//===================================================== =========//C言语程序如下。
/****************************************************** ********文件名:KEY_LED.c*功用:对4;x;4矩阵键盘进行输出,在数码管后两位显现按键值。
******************************************************* *******/#includelt;reg51.h#includelt;intrins.h#defineuintunsignedint#defineucharunsignedchar//ucharcodetable[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x 01,0x09};ucharcodetable[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x8 0,0x90};/****************************************************** *********称谓:Delay_1ms()*功用:延时子程序,延时时刻为1ms*x*输入:x(延时一毫秒的个数)*输出:无******************************************************* ********/voidDelay_1ms(uintx){uinti;ucharj;for(i=0;ilt;x;i++)for(j=0;jlt;=148;j++);}/*******************************************************称谓:Keyscan()*功用:P1外接4;x;4按键,依照扫描法读出键值*输出:按键值0~15/如无键按下,回来16******************************************************* ********/ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xef,0xdf,0xbf,0x7f};for(j=0;jlt;4;j++){//循环四次P1=Buffer[j];//在P1高四位别离输出一个低电平temp=0x01;//方案先判别P1.0位for(i=0;ilt;4;i++){//循环四次if(!(P1temp))//从P1低四位,截取1位return(i+j*4);//回来获得的按键值templt;lt;=1;//判别的位,左移一位}}return16;//判别完毕,没有键按下,回来16}//哈哈,实质性的句子不过8行,即是这么简练!/*******************************************************称谓:Display(uchark)*功用:将参数分红十位、个位别离显现*输入:k(键盘数值)*输出:P0口输出七段码,P2口输出位选码******************************************************* ********/voidDisplay(uchark){P2=0;//消隐P0=table[k/10];P2=0x02;Delay_1ms(5);//显现5ms十位P2=0;//消隐P0=table[k%10];P2=0x01;Delay_1ms(5);//显现5ms个位}/****************************************************** *********称谓:Main()*功用:主函数******************************************************* ********/voidMain(void){ucharKey_Value=16,Key_Temp1,Key_Temp2;//两次读出的键值while(1){//---------以下读入按键、消抖、等候按键开释P1=0xff;Key_Temp1=Keyscan();//先读入按键if(Key_Temp1!=16){//假如有键按下//Delay_1ms(10);//延时一下Display(Key_Value);//可用显现替代延时Key_Temp2=Keyscan();//再读一次按键if(Key_Temp1==Key_Temp2){//有必要是两次持平Key_Value=Key_Temp1;//才保留下来,这即是消除颤动while(Keyscan()lt;16)//等候按键开释Display(Key_Value);//等候时期显现键值//---------以下是对按键的处理Display(Key_Value);//显现键值}}Display(Key_Value);//没有按键按下,也显现键值}}//用PROTEUS仿真作业时的屏幕截图如下:。
4乘4矩阵式键盘使用

4乘4矩阵式键盘在单片机中的应用--C语言下图为4*4键盘的结果图,用单片机的P1口接4×4矩阵键盘,接法如图所示,用数码管显示按键的值,按下键S1,数码管显示0,按下S2,数码管显示1,按下S16,显示F。
先看程序代码:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//八段数码管对应0—F值。
void Delay_1ms(uint i)//1ms延时{uchar x, j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay()//消除按键抖动延时{int i,j;for(i=0; i<=10; i++)for(j=0; j<=2; j++);}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];delay();temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_V alue; //读出的键值while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(15); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}P0 = table[Key_V alue];//P0口输出数据到数码管}}代码分析:程序从Main开始执行,Key_V alue用来存放Keyscan();的返回值,Key_V alue为1,则数码管会显示1。