您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 430f149矩阵键盘lcd显示
/************键盘部分**********************/#includemsp430x14x.h#includekeyscan.hvoidkey_init(void){KEY_DIR=0x0f;//将P1.0~1.3设置为输出(行),将P1.4~1.7设置为输入(列)}ucharkey_scan(void){uchartmp1,row,key_val,tmp2;ucharkey;tmp1=0x01;KEY_HANG=0xf0;//将行全部拉低,好去判断下面是否有键按下if((KEY_LIE&0xf0)!=0xf0)//判断是否有键按下{delay5ms();//延时5毫秒for(row=0;row4;row++)//一行一行的扫描{KEY_HANG=~tmp1;//tmp2=KEY_LIE&0xf0;if((KEY_LIE&0xf0)!=0xf0){tmp2=(KEY_LIE&0xf0);key=(KEY_HANG&0x0f)|tmp2;break;}elsetmp1=1;}while((KEY_LIE&0xf0)!=0xf0);//等待按键释放switch(key)//获取键值{case0xee:key_val='1';break;case0xde:key_val='2';break;case0xbe:key_val='3';break;case0x7e:key_val='A';break;case0xed:key_val='4';break;case0xdd:key_val='5';break;case0xbd:key_val='6';break;case0x7d:key_val='B';break;case0xeb:key_val='7';break;case0xdb:key_val='8';break;case0xbb:key_val='9';break;case0x7b:key_val='C';break;case0xe7:key_val='*';break;case0xd7:key_val='0';break;case0xb7:key_val='.';break;case0x77:key_val='D';break;default:key_val='#';}}returnkey_val;}/*delay5msforkeydejitter*/voiddelay5ms(void){uinti=2000;while(i--);}/****************LCD部分**************************/#includemsp430x14x.h#includecry1602.h//typedefunsignedcharuchar;//typedefunsignedintuint;#defineucharunsignedchar#defineuintunsignedint/*******************************************显示坐标行列********************************************/voidLocateXY(ucharx,uchary){uchartemp;temp=x&0x0f;y&=0x01;if(y)temp|=0x40;//如果在第2行temp|=0x80;LcdWriteCommand(temp,1);}/*******************************************显示单字符********************************************/voidDisp1Char(ucharx,uchary,uchardata){LocateXY(x,y);LcdWriteData(data);}/*******************************************LCD初始化********************************************/voidLcdReset(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);//显示开,显示光标,光标闪烁}/*******写命令********************************************************************************/voidLcdWriteCommand(ucharcmd,ucharchk){if(chk)WaitForEnable();//检测忙信号?CLR_RS;CLR_RW;_NOP();DataPort=cmd;//将命令字写入数据端口_NOP();SET_EN;//产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************写数据********************************************/voidLcdWriteData(uchardata){WaitForEnable();//等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort=data;//将显示数据写入数据端口_NOP();SET_EN;//产生使能脉冲信号_NOP();_NOP();CLR_EN;}/*******************************************检测忙信号********************************************/voidWaitForEnable(void){P2DIR&=0x00;//将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();while((P2IN&Busy)!=0);//检测忙标志CLR_EN;P2DIR|=0xFF;//将P4口切换为输出状态}/*******************************************延时函数,消抖用********************************************/voidDelay5ms(void){uinti=4000;while(i!=0){i--;}}/****************主程序部分***************************/#includemsp430x14x.h#includekeyscan.h#includecry1602.h//#includeclock.c//#defineucharunsignedcharvoidmain(void){ucharx=0,y=0;WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimertopreventtimeoutreset/*关闭所有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++;}}}
本文标题:430f149矩阵键盘lcd显示
链接地址:https://www.777doc.com/doc-4692921 .html