/**********************************************************用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作,如果用并行,请自行修改。***********************************************************/#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineNOP_nop_();sbitLCD_CS=P1^0;//片选,高电平有效(RS)sbitLCD_SID=P1^1;//串行数据输入端(R/W)sbitLCD_SCLK=P1^2;//串行同步时钟,上升沿读取SID数据(E)sbitLCD_PSB=P1^3;//并/串选择H并行L串行sbitLCD_RST=P1^4;//复位,低电平有效ucharkeynum;ucharcodedis1[]={请输入任意两位数};ucharcodedis2[16]={0123456789ABCDEF};uchardis_buf[]={0,0};uchargetkey();voiddisplay();voiddelay(uintx){uchari;while(x--){for(i=0;i110;i++);}}/*写指令程序,指令由3个字节组成,第一个为写指令*//*第二个为指令高4位,第三个为指令低4位*/voidsend_cmd(ucharcmd_dat){uchari;uchari_dat;i_dat=0xf8;LCD_CS=1;LCD_SCLK=0;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}i_dat=cmd_dat;i_dat&=0xf0;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}i_dat=cmd_dat;i_dat=4;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}LCD_CS=0;delay(10);}/*写数据程序,指令由3个字节组成,第一个为写数据*//*第二个为数据高4位,第三个为数据低4位*/voidsend_dat(ucharcmd_dat){uchari;uchari_dat;i_dat=0xfa;LCD_CS=1;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}i_dat=cmd_dat;i_dat&=0xf0;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}i_dat=cmd_dat;i_dat=4;for(i=0;i8;i++){LCD_SID=(bit)(i_dat&0x80);LCD_SCLK=0;LCD_SCLK=1;i_dat=i_dat1;}LCD_CS=0;delay(10);}voidLCD_INIT(){LCD_PSB=0;//串行方式操作send_cmd(0x30);//基本指令操作delay(5);send_cmd(0x0c);//显示开,关游标,游标位置反白禁止delay(5);send_cmd(0x06);//光标右移,整体显示不移动delay(5);send_cmd(0x01);//清除LCD显示内容delay(5);}uchargetkey(){unsignedcharrow,col,k;for(row=0;row4;row++)//行值依次为0xfe,0xfd,0xfb,0xf7{P2=~(1row);k=0x10;for(col=0;col4;col++)//列值扫描{if(!(P2&k))//如果有键按下return(row*4+col);//返回按键位置k=1;}}return99;//无键按下返回99}voidkey_dispos()//按键处理并显示程序{display();//显示第一行和初始键值keynum=getkey();//获取键值if(keynum10)//{dis_buf[1]=dis_buf[0];//第一个键值移位显示dis_buf[0]=keynum;//获得第二个键值display();//显示改变后的键值while(keynum10)//松手检测{keynum=getkey();}}}voidmain(){P1=0xff;LCD_INIT();while(1){key_dispos();}}voiddisplay(){uinti;send_cmd(0x80);//第一行显示i=0;while(dis1[i]!='\0'){send_dat(dis1[i]);i++;}send_cmd(0x90);//第二行显示数据send_dat(dis2[dis_buf[1]]);send_dat(dis2[dis_buf[0]]);}