按键和显示单独都调通了,但我想通过按键改变显示的内容,却不行,偶第一次玩单片机,请各位高手帮忙,做完国庆结婚了!!程序如下:<br />#include <reg51.h><br />#include <intrins.h><br />//#include "lcd12864.h"<br />#define uchar unsigned char<br />#define uint unsigned int<br />#define Lcd_Bus P0 // P0<------> LCM<br />#define FIRST_ADDR 0 //定义字符/汉字显示起始位置<br />#define port P1 //定义P1口<br />sbit P2_0 = P2^0; //定义p2.0口<br />sbit P2_1 = P2^1;<br />sbit RS = P2^5;<br />sbit RW = P2^6;<br />sbit E = P2^7;<br />unsigned char *axis;<br />unsigned int zdtime=0;<br />unsigned int pingbaotime=0;<br />/*定义20个按键的返回值*/<br />#define xkey 1<br />#define ykey 2<br />#define zkey 3<br />#define shiftkey 4<br />#define key1 5<br />#define key2 6<br />#define key3 7<br />#define zerokey 8<br />#define key4 9<br />#define key5 10<br />#define key6 11<br />#define rightkey 12<br />#define key7 13<br />#define key8 14<br />#define key9 15<br />#define leftkey 16<br />#define key0 17<br />#define zhengkey 18<br />#define setkey 19<br />#define enterkey 20<br />void delay(uchar n)<br />{<br /> uint i,j;<br /> for(i = 0;i<n;i++)<br /> for(j= 125;j>0;j--)<br /> {}<br />}<br /><br />//按键扫描函数<br />unsigned char getkey()<br />{<br />// unsigned char a,b;<br /> unsigned int delay=0; //延时变量<br /><br /> port=0xff; //p0口复位<br /> P2_0=1; //p2.0复位<br /><br /> //扫描第五行<br /> P2_0=0;<br /> while(!(port&0x01))<br /> {<br /><br /> P2_1 = ~P2_1;<br /><br /> if(++delay>0x1ff0)<br /> {<br /> return(0);}<br /> }<br /> while(!(port&0x02))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(zhengkey);<br /> }<br /> }<br /> while(!(port&0x04))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(setkey);<br /> }<br /> }<br /> while(!(port&0x08))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(enterkey);}<br /> }<br /><br /> port=0xff; //p0口复位<br /> P2_0=1; //p2.0复位<br /><br /> //扫描第一行<br /> port=0x7f;<br /> delay=0;<br /> while(!(port&0x01))<br /> {<br /><br /> P2_1 = ~P2_1;<br /><br /> if(++delay>0x1ff0)<br /> {<br /> return(xkey);}<br /> }<br /> while(!(port&0x02))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(ykey);<br /> }<br /> }<br /> while(!(port&0x04))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(zkey);<br /> }<br /> }<br /> while(!(port&0x08))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(shiftkey);}<br /> }<br /><br /> port=0xff; //p0口复位<br /> P2_0=1; //p2.0复位<br /> //扫描2行<br /> port=0xbf;<br /> delay=0;<br /> while(!(port&0x01))<br /> {<br /><br /> P2_1 = ~P2_1;<br /><br /> if(++delay>0x1ff0)<br /> {<br /> return(key1);}<br /> }<br /> while(!(port&0x02))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key2);<br /> }<br /> }<br /> while(!(port&0x04))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key3);<br /> }<br /> }<br /> while(!(port&0x08))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(zerokey);}<br /> }<br /><br /> port=0xff; //p0口复位<br /> P2_0=1; //p2.0复位<br /> //扫描三行<br /> port=0xdf;<br /> delay=0;<br /> while(!(port&0x01))<br /> {<br /><br /> P2_1 = ~P2_1;<br /><br /> if(++delay>0x1ff0)<br /> {<br /> return(key4);}<br /> }<br /> while(!(port&0x02))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key5);<br /> }<br /> }<br /> while(!(port&0x04))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key6);<br /> }<br /> }<br /> while(!(port&0x08))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(rightkey);}<br /> }<br /><br /> port=0xff; //p0口复位<br /> P2_0=1; //p2.0复位<br /> port=0xef;<br /> delay=0;<br /> while(!(port&0x01))<br /> {<br /><br /> P2_1 = ~P2_1;<br /><br /> if(++delay>0x1ff0)<br /> {<br /> return(key7);}<br /> }<br /> while(!(port&0x02))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key8);<br /> }<br /> }<br /> while(!(port&0x04))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(key9);<br /> }<br /> }<br /> while(!(port&0x08))<br /> {<br /> if(++delay>0x1ff0)<br /> {<br /><br /> P2_1 = ~P2_1;<br /> return(leftkey);}<br /> }<br /><br /> return(0);<br />}<br />//LCD12864驱动程序<br />/*------------------检查忙位-----------------------------*/<br />void chk_busy()<br />{<br /> RS=0;<br /> RW=1;<br /> E=1;<br /> Lcd_Bus=0xff;<br /> while((Lcd_Bus&0x80)==0x80);<br /> E=0;<br />}<br /><br /><br />/*------------------写命令到LCD------------------------------*/<br />void write_com(unsigned char cmdcode)<br />{<br /> chk_busy();<br /> RS=0;<br /> RW=0;<br /> E=1;<br /> Lcd_Bus=cmdcode;<br /> delay(5);////////////////////在数据写入的时候加入适当的延时<br /> E=0;<br /> delay(5);<br />}<br /><br />/*-------------------写数据到LCD----------------------------*/<br />void write_data(unsigned char Dispdata)<br />{<br /> chk_busy();<br /> RS=1;<br /> RW=0;<br /> E=1;<br /> Lcd_Bus=Dispdata;<br /> delay(5);///////////////////在数据写入的时候加入适当的延时<br /> E=0;<br /> delay(5);<br />}<br />/*------------------初始化LCD屏--------------------------*/<br />void lcdreset()<br />{ delay(2000);<br /> write_com(0x30);<br /> delay(10); //选择基本指令集<br /> write_com(0x30); //选择8bit数据流<br /> delay(5);<br /> write_com(0x0c); //开显示(无游标、不反白)<br /> delay(10);<br /> write_com(0x01); //清除显示,并且设定地址指针为00H<br /> delay(500);<br /> write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位<br /> delay(0);<br />}<br /><br />/*------------------显示字符串--------------------------*/<br />void hzkdis(unsigned char code *s)<br />{<br /> while(*s>0)<br /> { write_data(*s);<br /> s++;<br /> delay(50);<br /> }<br />}<br />/*------------------首屏显示--------------------------*/<br />void ceshi()<br />{<br /> write_com(0x01);//清除显示,并且设定地址指针为00H<br /> delay(5);<br /> write_com(0x80);//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)<br /> hzkdis("Position:");<br /><br /> write_com(0x90);//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)<br /> hzkdis(*axis);<br /> write_com(0x94);<br /> write_com(0x0e);<br /> hzkdis("85.5");<br /> write_com(0x96);<br /> hzkdis("mm");<br /> write_com(0x88);//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)<br /> hzkdis("Lasers : ");<br /> write_com(0x8d);<br /> write_com(0x06);<br /> hzkdis("ON");<br /> write_com(0x98);//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)<br /> write_com(0x0f);<br /> hzkdis("|X |");<br /> write_com(0x9a);<br /> write_com(0x0f);<br /> hzkdis("|Z1|");<br /> write_com(0x9c);<br /> write_com(0x0f);<br /> hzkdis("|Z2|");<br /> write_com(0x9e);<br /> write_com(0x0f);<br /> hzkdis("|Set|");<br />}<br />/*------------------显示图片------------------------2005.11.14.21:20修改---benladn911---*/<br />void Disp_Img(unsigned char code *map)<br />{ unsigned int j=0;<br /> unsigned char x,y,i;<br /> for(i=0;i<9;i+=8)<br /> for(y=0;y<32;y++)<br /> for(x=0;x<8;x++)<br /> { write_com(0x36);//功能设置---8BIT控制界面,扩充指令集<br /> write_com(y+0x80); //行地址<br /> write_com(x+0x80+i); //列地址<br /> write_com(0x30);<br /> write_data(map[j++]);<br /> write_data(map[j++]);<br /> }<br /><br />}<br />/*------------------清整个GDRAM空间----------------------------*/<br />void clrgram()<br />{<br /> unsigned char x,y;<br /> for(y=0;y<64;y++)<br /> for(x=0;x<16;x++)<br /> { write_com(0x34);<br /> write_com(y+0x80); //行地址<br /> write_com(x+0x80); //列地址<br /> write_com(0x30);<br /> write_data(0x00);<br /> write_data(0x00);<br /> }<br />}<br />/*------------------整屏写入数据:全亮,或者竖条-----------------------------*/<br />void lcdfill(unsigned char disdata)<br />{ unsigned char x,y;<br /> for(y=0;y<32;y++)<br /> for(x=0;x<16;x++)<br /> { write_com(0x36);<br /> write_com(y+0x80); //行地址<br /> write_com(x+0x80); //列地址<br /> write_com(0x30);<br /> write_data(disdata);<br /> write_data(disdata);<br /> }<br /> write_com(0x34);<br /> write_com(0x36);<br /> }<br /><br />/*------------------清屏命令--------------------------*/<br /> void clrscreen()<br /> {<br /> write_com(0x01);<br /> delay(10);<br /> }<br />main()<br />{<br /> unsigned char key;<br /> int p;<br /> for(p=0;p<3;p++)<br /> {<br /> P2_1 =1;<br /> delay(5000);<br /> P2_1 =0;<br /> delay(5000);<br /> }<br /> RW=0;<br /> lcdreset(); //初始化LCD屏<br /> // Disp_Img(map_1);<br /> // delay(5000);<br /> ceshi(); //显示测试字样<br /> RW =1;<br /> while(1)<br /> {<br /> key = getkey();<br /> switch(key)<br /> {<br /> case xkey:<br /> {<br /> write_com(0x90);<br /> clrgram();<br /> axis = "X :" ;<br /> };<br /> break;<br /> case ykey:<br /> {<br /> write_com(0x90);<br /> //clrgram( );<br /> axis = "Z1:";<br /> };<br /> break;<br /> default: break;<br /> }<br /> }<br /> }<br /><br /><br /> |
|