您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 单片机矩阵键盘1602显示
#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintuchardis_buf;//显示缓存uchartemp;ucharkey;//键顺序吗voiddelay0(ucharx);//x*0.14MSsbitLCD_RW=P2^5;sbitLCD_RS=P2^6;sbitLCD_EN=P2^7;ucharcdis1[16]={KEYNUMBER};ucharcdis2[16]={KEY-CODE:H};#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};/*************************************************************//**//*延时子程序*//**//*************************************************************/voiddelay(ucharx){ucharj;while((x--)!=0){for(j=0;j125;j++){;}}}/*************************************************************//**//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据*//**//*************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);LCD_EN=0;return(result);}/*******************************************************************//**//*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//**//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//**//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//**//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*************************************************************//**//*LCD初始化设定*//**//*************************************************************/voidlcd_init(){delay(15);lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x0c);//显示开,关光标delay(5);lcd_wcmd(0x06);//移动光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/*************************************************************//**//*设定显示位置*//**//*************************************************************/voidlcd_pos(ucharpos){lcd_wcmd(pos|0x80);//数据指针=80+地址变量}/*************************************************************//**//*键扫描子程序(4*3的矩阵)P1.4P1.5P1.6P1.7为行*//*P1.1P1.2P1.3为列*//**//*************************************************************/voidkeyscan(void){temp=0;P1=0xF0;//高四位输入行为高电平列为低电平delay(1);temp=P1;//读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp4)|0xF0);if(temp==1)//p1.4被拉低key=0;elseif(temp==2)//p1.5被拉低key=1;elseif(temp==4)//p1.6被拉低key=2;elseif(temp==8)//p1.7被拉低key=3;elsekey=16;P1=0x0F;//低四位输入列为高电平行为低电平delay(1);temp=P1;//读P1口temp=temp&0x0F;temp=~(temp|0xF0);if(temp==1)//p1.0被拉低key=key+0;elseif(temp==2)//p1.1被拉低key=key+4;elseif(temp==4)//p1.2被拉低key=key+8;elseif(temp==8)//p1.3被拉低key=key+12;elsekey=16;dis_buf=key;//键值入显示缓存dis_buf=dis_buf&0x0f;if(dis_buf9)//转换为ASCII码dis_buf=dis_buf+0x37;elsedis_buf=dis_buf+0x30;}/*************************************************************//**//*判断键是否按下*//**//*************************************************************/voidkeydown(void){P1=0xF0;if(P1!=0xF0)//判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan();}}/*************************************************************//**//*主程序*//**//*************************************************************/main(){ucharm;P0=0xFF;//置P0口P1=0xFF;//置P1口delay(10);//延时lcd_init();//初始化LCDlcd_pos(0);//设置显示位置为第一行的第1个字符m=0;while(cdis1[m]!='\0'){//显示字符lcd_wdat(cdis1[m]);m++;}lcd_pos(0x40);//设置显示位置为第二行第1个字符m=0;while(cdis2[m]!='\0'){lcd_wdat(cdis2[m]);//显示字符m++;}dis_buf=0x2d;//显示字符-while(1){keydown();lcd_pos(0x4c);lcd_wdat(dis_buf);//第一位数显示}}/************************************************************/
本文标题:单片机矩阵键盘1602显示
链接地址:https://www.777doc.com/doc-7061889 .html