OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5277|回复: 5

矩阵键盘模拟手机键盘

[复制链接]

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-9-16
在线时间
0 小时
发表于 2015-10-13 12:39:56 | 显示全部楼层 |阅读模式
5金钱
下面是我写的一个用矩阵键盘模拟手机键盘的程序,但是不知道为什么按下键后,1602没反应
所以求高手指点
[mw_shl_code=c,true]#include <reg52.h> #include <intrins.h> sbit RS = P2^4; sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 #define KeyPort P1 unsigned char code table[]={'1','2','3','4','5','6','7','8','9'}; unsigned char code table1[]={'A','B','C'}; unsigned char code table2[]={'D','E','F'}; unsigned char code table3[]={'G','H','I'}; unsigned char code table4[]={'J','K','L'}; unsigned char code table5[]={'M','O','N'}; unsigned char code table6[]={'O','P','Q','R'}; unsigned char code table7[]={'S','T','U','V'}; unsigned char code table8[]={'W','X','Y','Z'}; unsigned char num; unsigned int flag=0; void DelayMs(unsigned int xms) { unsigned int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } /*------------------------ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } --------------------------*/ /*------------------------------------------------ ?????ü?????? ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { // while(LCD_Check_Busy()); DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ ???????????? ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { //while(LCD_Check_Busy()); DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ ???????? ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } /*------------------------------------------------ ????×?·??®???? ------------------------------------------------*/ /*------------------ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } while (*s) { LCD_Write_Data( *s); s ++; } } -----------------------*/ /*------------------------------------------------ ????×?·????? ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ ?????????? ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); LCD_Write_Com(0x01); LCD_Write_Com(0x06); DelayMs(5); LCD_Write_Com(0x0C); } /*------------------------------------------------ °??ü?¨?è??????·????¨?è?ü?? ------------------------------------------------*/ unsigned char KeyScan(void) { unsigned char cord_h,cord_l; KeyPort=0x0f; cord_h=KeyPort&0x0f; if(cord_h!=0x0f) { DelayMs(10); if((KeyPort&0x0f)!=0x0f) { num++; cord_h=KeyPort&0x0f; KeyPort=cord_h|0xf0; cord_l=KeyPort&0xf0; while((KeyPort&0xf0)!=0xf0); return(cord_h+cord_l); } }return(0xff); } /*------------------------------------------------ °??ü?????í??????·????¨?ü?? ------------------------------------------------*/ unsigned char KeyPro(void) { switch(KeyScan()) { case 0x7e:return 0;break;//0 case 0x7d:return 1;break;//1 case 0x7b:return 2;break;//2 case 0xbe:return 3;break;//4 case 0xbd:return 4;break;//5 case 0xbb:return 5;break;//6 case 0xde:return 6;break;//8 case 0xdd:return 7;break;//9 case 0xdb:return 8;break;//a case 0xe7:return 9;break;//f case 0x77:return 10;break;//3 case 0xb7:return 11;break;//7 case 0xd7:return 12;break;//b case 0xee:return 13;break;//c case 0xed:return 14;break;//d case 0xeb:return 15;break;//e default:return 0xff;break; } } void jian() { if(KeyPro()==9) { DelayMs(10); if(KeyPro()==9) { while(KeyPro()!=9); DelayMs(50); flag=1-flag; } } DelayMs(10); } unsigned char moni(unsigned char n) { unsigned char num1,num2; jian(); num1=(num-1)%3; num2=(num-1)%4; n=KeyPro(); if(flag==1){ switch(n) { case 0:return table[0];break; case 1:return table1[num1];break; case 2:return table2[num1];break; case 3:return table3[num1];break; case 4:return table4[num1];break; case 5:return table5[num1];break; case 6:return table6[num2];break; case 7:return table7[num2];break; case 8:return table8[num2];break; default:return 0xff;break; } } else return table[n]; } void main() { unsigned char j,k,str,m; LCD_Init(); LCD_Write_Com(0x0F); while(1) { KeyScan(); m=KeyPro(); str=moni(m); if(m!=0xff) { if((k==0)&&(j==0)) LCD_Clear(); LCD_Write_Char(0+k,0+j,str); k++; if(k==16) { k=0;j++; if(j==2) { j=0; } } } } } [/mw_shl_code]

自强不息,厚德载物 我有我精彩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-13 16:59:16 | 显示全部楼层
先分别调通,最后组合到一块
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-9-16
在线时间
0 小时
 楼主| 发表于 2015-10-13 17:26:07 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
你的意思是把各个模块调通还是什么?
如果是把各个模块调通,我每个模块用的是教程的代码,只不过在连接各模块时又自己写了一些程序,所以单独调试应该是没问题的
谢谢你的提醒,我还是个菜鸟,希望你能给更多的指点
自强不息,厚德载物 我有我精彩
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-13 17:27:54 | 显示全部楼层
矩阵按键和LCD1602分别调通,要确定独立都没问题
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-9-16
在线时间
0 小时
 楼主| 发表于 2015-10-15 23:54:10 | 显示全部楼层
多谢龙之谷的提点,我已经将程序做了调整,现在可以运行了,下面附程序
[mw_shl_code=c,true]#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS = P2^4; sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 uchar code table[]={'1','2','3','4','5','6','7','8','9','0'}; uchar code table1[]={'A','B','C'}; uchar code table2[]={'D','E','F'}; uchar code table3[]={'G','H','I'}; uchar code table4[]={'J','K','L'}; uchar code table5[]={'M','O','N'}; uchar code table6[]={'O','P','Q','R'}; uchar code table7[]={'S','T','U','V'}; uchar code table8[]={'W','X','Y','Z'}; uchar num1,num2,num3,num4,num5,num6,num7,num8,key=15; uint flag=0; void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void LCD_Write_Com(uchar com) { // while(LCD_Check_Busy()); //???ò???? delayms(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } void LCD_Write_Data(uchar Data) { //while(LCD_Check_Busy()); delayms(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; void LCD_Clear(void) { LCD_Write_Com(0x01); delayms(5); } void LCD_Write_Char(uchar x,uchar y,uchar Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } void LCD_Init(void) { LCD_Write_Com(0x38); delayms(5); LCD_Write_Com(0x38); delayms(5); LCD_Write_Com(0x38); delayms(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); LCD_Write_Com(0x01); LCD_Write_Com(0x06); delayms(5); LCD_Write_Com(0x0C); } void matrixkeyscan() { uchar temp; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=10; break; case 0xde: key=2; if(flag==1) num2++; break; case 0xbe: key=1; if(flag==1) num1++; break; case 0x7e: key=0; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=11; break; case 0xdd: key=5; if(flag==1) num5++; break; case 0xbd: key=4; if(flag==1) num4++; break; case 0x7d: key=3; if(flag==1) num3++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) {  temp=P3; switch(temp) { case 0xeb: key=12; break; case 0xdb: key=8; if(flag==1) num8++; break; case 0xbb: key=7; if(flag==1) num7++; break; case 0x7b: key=6; if(flag==1) num6++; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: flag=1-flag; break; case 0xd7: key=14; break; case 0xb7: key=13; break; case 0x77: key=9; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } } uchar moni() { if(flag==1){ switch(key) { case 0:return table[0];break; case 1:return table1[(num1-1)%3];break; case 2:return table2[(num2-1)%3];break; case 3:return table3[(num3-1)%3];break; case 4:return table4[(num4-1)%3];break; case 5:return table5[(num5-1)%3];break; case 6:return table6[(num6-1)%4];break; case 7:return table7[(num7-1)%4];break; case 8:return table8[(num8-1)%4];break; case 9:return table[9];break; default:return 0xff;break; } } else if(key<=9) return table[key]; else return 0xff; } void main() { uchar j,k,str; LCD_Init(); LCD_Write_Com(0x0F); while(1) { matrixkeyscan(); str=moni(); if(str!=0xff) { if((k==0)&&(j==0)) LCD_Clear(); LCD_Write_Char(0+k,0+j,str); k++; if(k==16) { k=0;j++; if(j==2) { j=0; } } } key=15; } } [/mw_shl_code]

自强不息,厚德载物 我有我精彩
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-16 22:36:41 | 显示全部楼层
帮顶。。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表