昨天,12单片机12M换24M导致时序错误,今天12864键值显示异常。看来短时间内完成工程。必须经验丰富来着。 /********************************************************** 用矩阵按键输入任意两位数并显示在12684上。如先输入2,再输入5 液晶上显示25。用矩阵按键0-9共10个按键。LCD12864用串行方式操作, 如果用并行,请自行修改。 ***********************************************************/ #include #include #define uchar unsigned char #define uint unsigned int #define NOP _nop_(); ***it LCD_CS=P1^0; //片选,高电平有效(RS) ***it LCD_SID=P1^1; //串行数据输入端(R/W) ***it LCD_SCLK=P1^2; //串行同步时钟,上升沿读取SID数据(E) ***it LCD_PSB=P1^3; //并/串选择 H并行 L串行 ***it LCD_RST=P1^4; //复位,低电平有效 uchar keynum; uchar code dis1[]={"请输入任意两位数"}; uchar code dis2[16]={"0123456789ABCDEF"}; uchar dis_buf[]={0,0}; uchar getkey(); void display(); void delay(uint x) { uchar i; while(x--) { for(i=0;i<110;i++); } } /*写指令程序,指令由3个字节组成,第一个为写指令*/ /*第二个为指令高4位,第三个为指令低4位*/ void send_cmd(uchar cmd_dat) { uchar i; uchar i_dat; i_dat=0xf8; LCD_CS=1; LCD_SCLK=0; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } i_dat=cmd_dat; i_dat&=0xf0; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } i_dat=cmd_dat; i_dat<<=4; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } LCD_CS=0; delay(10); } /*写数据程序,指令由3个字节组成,第一个为写数据*/ /*第二个为数据高4位,第三个为数据低4位*/ void send_dat(uchar cmd_dat) { uchar i; uchar i_dat; i_dat=0xfa; LCD_CS=1; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } i_dat=cmd_dat; i_dat&=0xf0; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } i_dat=cmd_dat; i_dat<<=4; for(i=0;i<8;i++) { LCD_SID=(bit)(i_dat&0x80); LCD_SCLK=0; LCD_SCLK=1; i_dat=i_dat<<1; } LCD_CS=0; delay(10); } void LCD_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); } uchar getkey() { unsigned char row,col,k; for(row=0;row<4;row++) //行值依次为0xfe, 0xfd, 0xfb, 0xf7 { P2=~(1< for(col=0;col<4;col++) //列值扫描 { if(!(P2&k)) //如果有键按下 return (row*4+col); //返回按键位置 k<<=1; } } return 99; //无键按下返回99 } void key_dispos() //按键处理并显示程序 { display(); //显示第一行和初始键值 keynum=getkey(); //获取键值 if(keynum<10) // { dis_buf[1]=dis_buf[0]; //第一个键值移位显示 dis_buf[0]=keynum; //获得第二个键值 display(); //显示改变后的键值 while(keynum<10) //松手检测 { keynum=getkey(); } } } void main() { P1=0xff; LCD_INIT(); while(1) { key_dispos(); } } void display() { uint i; send_cmd(0x80); //第一行显示 i=0; while(dis1!='\0') { send_dat(dis1); i++; } send_cmd(0x90); //第二行显示数据 send_dat(dis2[dis_buf[1]]); send_dat(dis2[dis_buf[0]]); } |
更多回帖