佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2216|回复: 18

手机keypad

[复制链接]
发表于 5-3-2012 11:42 AM | 显示全部楼层 |阅读模式
本帖最后由 Harry88 于 5-3-2012 12:57 PM 编辑

1.你要想做什么? 你的应用是什么? 我要做可以发sms的手机

2.你想要拿到什么效果
我现在还在first stage, 我用4x4的keypad,想要在1的button那里同时加入A,B,C(按2时,也可以同时加入D,E,F)
second stage 是把读取输入的character存进eprom.

3.你做了什么
电路好了,就剩下coding,可是一直有问题。


4.你遇到了什么问题。
coding 不对,我现做button1&2的来testing,不然很长很乱
  1. #include <18F4550.h>
  2. #fuses HS,NOWDT,NOLVP,NOPROTECT
  3. #use delay (clock=20M)
  4. #include "lcd.c"

  5. #define KA  PIN_B2
  6. #define KB  PIN_B3
  7. #define KC  PIN_B4
  8. #define KD  PIN_B5
  9. #define KV  PIN_C0

  10. #define next PIN_C1

  11. #define LCD_E  PIN_D0
  12. #define LCD_RS PIN_D1
  13. #define LCD_RW PIN_D2
  14. #define LCD_D4 PIN_D4
  15. #define LCD_D5 PIN_D5
  16. #define LCD_D6 PIN_D6
  17. #define LCD_D7 PIN_D7


  18. main()
  19. {
  20. set_tris_b(0x3F);
  21. set_tris_c(0xFF);
  22. output_b(0x00);
  23. output_c(0x00);
  24. lcd_init();

  25.         lcd_putc("\fPhone number :");
  26.         getnum();
  27. }

  28. ///////////////////////////////////////////////////////////

  29. getnum()
  30. {
  31.         int i;
  32.         i=1;
  33.         lcd_init();

  34.         while(input(next))
  35.         {        
  36.                 if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  37.                         lcd_gotoxy(i,2);
  38.                         lcd_putc("1");
  39.                         delay_ms(300);
  40.                         if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  41.                                 lcd_gotoxy(i,2);
  42.                                 lcd_putc("A");
  43.                                 delay_ms(300);
  44.                 i++;

  45.                 else if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  46.                         lcd_gotoxy(i,2);
  47.                         lcd_putc("2");
  48.                         delay_ms(300);
  49.                         if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  50.                                 lcd_gotoxy(i,2);
  51.                                 lcd_putc("D");
  52.                                 delay_ms(300);
  53.                 i++;
  54.         }
  55. }

  56. ///////////////////////////////////////////////////////////
复制代码



5.你用什么MCU?
PIC18

6.你用什么语言? ASM /C/PICBasic/Keil?Compiler 版本?
我用CSC c language因为比较简单

7.有源码吗? 如是抄来的请注明出处, 请放链接。
没有


8.有电路图吗?



9.你google 了吗? 你的搜索关键字是什么?
有,keypad coding in c, 不过没找到

10.是你自己的问题? 还是你帮人问的? 请说明。
我自己的,不要骂我哦,我有做功课的,不过我真的想不到,我有兴趣,不过就是programming差了点
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 5-3-2012 04:29 PM | 显示全部楼层
没有人理我的,我做到了
回复

使用道具 举报

发表于 5-3-2012 10:22 PM | 显示全部楼层
为什么要用U2?
回复

使用道具 举报

 楼主| 发表于 6-3-2012 01:37 AM | 显示全部楼层
本帖最后由 Harry88 于 6-3-2012 01:39 AM 编辑

回复 3# pic

正当我们按keypad时,时间是一个问题,比如说有些人会按得较快,有些人按得较慢
当我们重复按同粒button时,问题就会出现了
可能你想输入1,不过PIC太快,就读到111
为了解决这事,就用上了U2,当keypad被按时,DA(data available)会像push button一样high一下
我不会用internal timer feature,所以我就用U2咯(其实有这个feature吗?我不清楚哦,我还在学着)
比如我的program,button 1 要充当(1,A,B,C),U2就会使我更容易控制
U2 = mm74c923 keypad driver
回复

使用道具 举报

 楼主| 发表于 6-3-2012 01:51 AM | 显示全部楼层
  1. #include <18F4550.h>
  2. #fuses HS,NOWDT,NOLVP,NOPROTECT
  3. #use delay (clock=20M)
  4. #include "lcd.c"

  5. #define KA  PIN_B2
  6. #define KB  PIN_B3
  7. #define KC  PIN_B4
  8. #define KD  PIN_B5
  9. #define KV  PIN_C0

  10. #define next PIN_C1

  11. #define LCD_E  PIN_D0
  12. #define LCD_RS PIN_D1
  13. #define LCD_RW PIN_D2
  14. #define LCD_D4 PIN_D4
  15. #define LCD_D5 PIN_D5
  16. #define LCD_D6 PIN_D6
  17. #define LCD_D7 PIN_D7

  18. ///////////////////////////////////////////////////////////

  19. void getnum()
  20. {
  21.         int i;
  22.         i=1;
  23.         lcd_init();

  24.         while(input(next))
  25.         {        
  26.                 if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  27.                         {{lcd_gotoxy(i,2);
  28.                         lcd_putc("1");
  29.                         delay_ms(300);}
  30.                         if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  31.                                 {lcd_gotoxy(i,2);
  32.                                 lcd_putc("A");
  33.                                 delay_ms(300);}
  34.                 i++;}

  35.                 else if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  36.                         {{lcd_gotoxy(i,2);
  37.                         lcd_putc("2");
  38.                         delay_ms(300);}
  39.                         if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
  40.                                 {lcd_gotoxy(i,2);
  41.                                 lcd_putc("D");
  42.                                 delay_ms(300);}
  43.                 i++;}
  44.         }
  45. }

  46. ///////////////////////////////////////////////////////////

  47. void main()
  48. {
  49. set_tris_b(0x3F);
  50. set_tris_c(0xFF);
  51. output_b(0x00);
  52. output_c(0x00);
  53. lcd_init();

  54.         lcd_putc("\fPhone number :");
  55.         getnum();
  56. }
复制代码
这就是coding啦,就加几个{ } ,void 和把void main搬下去
这个是testing coding,可以自己加东西进去
我不明白的就是为什么那个void getnum 要在void main的上面
回复

使用道具 举报

发表于 6-3-2012 03:01 PM | 显示全部楼层
回复  pic

正当我们按keypad时,时间是一个问题,比如说有些人会按得较快,有些人按得较慢
当我们重复 ...
Harry88 发表于 6-3-2012 01:37 AM


楼主应该在做个LOOP在按键的时候,当按键按下LOOP就会启动这样就不回出现因为按太久而重复scan。
回复

使用道具 举报

Follow Us
 楼主| 发表于 6-3-2012 03:07 PM | 显示全部楼层
问题2:
用以上的circuit,和coding,proteous display跟我要的一样
可是我却得到

在第二排,有一条线不能显示出来,为什么呢?
会有什么原因造成呢?
我起初以为我的lcd坏,可是换了另一个lcd也是同样问题
回复

使用道具 举报

发表于 6-3-2012 10:21 PM | 显示全部楼层
本帖最后由 pic 于 6-3-2012 10:36 PM 编辑

回复 5# Harry88
参考:
【教学】PIC 连接4x4 Keypad , 显示在 16x2 LCD   
http://cforum2.cari.com.my/viewthread.php?tid=2711797

那个源码, 可以轻易的改去你要的效果。不需要U2
按键下去不放, 不会重复, 一次一个键, 按键后要放手。
不过注意, 上面的源码只是针对CCS C。

如果你要模拟电话按键的输入,可能你有发送SMS,
2-> A -> B -> C ->
那么你就要toggle 你的键的输出, 还有时间的对应。
下面给你参考

  1. BYTE CONST SMS_ZERO[2] =  {'0', 0x00};
  2. BYTE CONST SMS_ONE[2] =   { '1', 0x00,};
  3. BYTE CONST SMS_TWO[5] =   {'A', 'B', 'C', '2', 0x00};
  4. BYTE CONST SMS_THREE[5] = {'D', 'E', 'F', '3', 0x00};
  5. BYTE CONST SMS_FOUR[5] =  {'G', 'H', 'I', '4', 0x00};
  6. BYTE CONST SMS_FIVE[5] =  {'J', 'K', 'L', '5', 0x00};
  7. BYTE CONST SMS_SIX[5]  =  {'M', 'N', 'O', '6', 0x00};
  8. BYTE CONST SMS_SEVEN[6] = {'P', 'Q', 'R', 'S', '7', 0x00};
  9. BYTE CONST SMS_EIGHT[5] = {'T', 'U', 'V', '8', 0x00};
  10. BYTE CONST SMS_NINE[6]  = {'W', 'X', 'Y', 'Z', '9', 0x00};
复制代码
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 7-3-2012 12:19 AM | 显示全部楼层
回复 8# pic


   需要点时间来消化
回复

使用道具 举报

 楼主| 发表于 8-3-2012 12:54 PM | 显示全部楼层
问题3:
我想问的是我们的coding会被存进rom还是flash memory 里?
我才学pic,我之前用assembly language的
都会initiate ROM address先,比如ORG $B600,可是现在我看不到有任何类似的coding
为什么我会这样问呢?
因为我要读取用户输入的资料,我不知道要如何开始,我要把他们输入的东西放进flash memory
回复

使用道具 举报

发表于 8-3-2012 02:04 PM | 显示全部楼层
本帖最后由 pic 于 8-3-2012 02:10 PM 编辑
我想问的是我们的coding会被存进rom还是flash memory 里?
Harry88 发表于 8-3-2012 12:54 PM

PIC MCU 的hex 是存在Flash memory


我才学pic,我之前用assembly language的
都会initiate ROM address先,比如ORG $B600,可是现在我看不到有任何类似的coding
为什么我会这样问呢?

我假设你是用CCS C, compiler 已经帮你处理了。


因为我要读取用户输入的资料,我不知道要如何开始,我要把他们输入的东西放进flash memory

建议存在 EEprom 里。

下面是以前(2006)写的GSM car alarm, 把电话号码写入去EEprom 的部分, 编译器是CCS C
你稍微参考一下,重点放在  
write_eeprom (Address, data);
data= Read_EEPROM (Address);
有一个概念就可以了

  1. // 假设电话号码是 +601225701234 (有些电话有country code, area code,ext,电话号码有可能 10号码, 用不完的空间填上 '\0' )
  2. int TelNoPreset[20]={'+','6','0','1','2','2','5','7','0','1','2','3','4','\0',' \0','\0','\0','\0','\0','\0'};

  3. // Save Tel No to EEprom
  4. void SaveTelNo(int TelNoIndex)
  5. {
  6.    int BaseAdd,pos;
  7.    int fTerminate=0;

  8.    BaseAdd=(TelNoIndex-1)*20;

  9.    for(pos=0;pos<20;pos++)
  10.    {
  11.       if(TelNoPreset[pos]==0)fTerminate=1;
  12.       if(fTerminate)
  13.       {
  14.          TelNoPreset[pos]=0;
  15.       }
  16.       else
  17.       {
  18.          // Only accept +,0~9
  19.          if(!isamong(TelNoPreset[pos],"+0123456789"))
  20.          {
  21.             TelNoPreset[pos]=0;
  22.          }
  23.       }
  24.       // write 20 bytes of string data to EEprom
  25.       write_eeprom (pos+BaseAdd, TelNoPreset[pos]);
  26.    }
  27. }

  28. int LoadTelNo(int TelNoIndex)
  29. {
  30.    int BaseAdd,pos;
  31.    BaseAdd=(TelNoIndex-1)*20;

  32.   // clear data
  33.    for(pos=0;pos<20;pos++)
  34.    {
  35.          TelNoPreset[pos]= 0;
  36.    }
  37.    //////////////////////////////
  38.    // Load complete number
  39.    for(pos=0;pos<20;pos++)
  40.    {
  41.          TelNoPreset[pos]= Read_EEPROM (pos+BaseAdd);
  42.    }

  43.   return 1;// Success
  44. }
复制代码
回复

使用道具 举报

 楼主| 发表于 8-3-2012 07:47 PM | 显示全部楼层
回复 11# pic

谢谢PIC,你说的EEPROM是不是在没电源后就会消失data那种?
因为我想做一个能发sms的东西类似电话,不过我不要用电话,我要用GSM来玩
当我要发SMS时,我就输入电话号码和SMS内容
然后reset之后又可以SMS其他号码给别人
就是说我的号码和SMS内容是活的,不像那些coding是要通过compiler burn进PIC的
我以前用HC11玩security door system,
coding就存进$B600而用户输入的密码就会被输入$B0000,然后输入的密码就会被拿来跟coding里的密码作比较

就如上面的,我的keypad就是用来输入电话号码和SMS资料进pic,然后发送(如果用HC11来说,我就是想把资料放进$B0000)
回复

使用道具 举报

发表于 8-3-2012 09:29 PM | 显示全部楼层
本帖最后由 pic 于 8-3-2012 09:32 PM 编辑
你说的EEPROM是不是在没电源后就会消失data那种?
Harry88 发表于 8-3-2012 07:47 PM

EEProm, 掉电后, 资料还是会继续保存最少100年的。
看来, ROM, RAM , EProm, EEprom 你是傻傻搞不清楚, 建议去google 复习一下。


PIC MCU 有三种储存, Flash memory, RAM, EEprom
Flash memory -- 是 储存program 的位置, 可以用Programmer/ Burner 烧入, 一些PIC MCU也可以通过程序写入, bootloader 就是一个很好的例子。 Flash Memory 能够被写入的次数是1000~100,000次。

RAM - 在RAM 的资料, 在掉电后会消失。

EEprom -  也是Flash memory, 但是是用来储存 User data, 不可以存Program。
能够重复写入的寿命是 1,000,000 次。


因为我想做一个能发sms的东西类似电话,不过我不要用电话,我要用GSM来玩
当我要发SMS时,我就输入电话号码和SMS内容
然后reset之后又可以SMS其他号码给别人
就是说我的号码和SMS内容是活的,不像那些coding是要通过compiler burn进PIC的

当然是要活的啊。。你要发的message 是你键入的。。
你的电话号码, 你如果愿意, 你可以储存在EEProm, 下次叫出来用, (这个不是在你compile 后burn 进去, 然后就不可以改的。)

我以前用HC11玩security door system,
coding就存进$B600而用户输入的密码就会被输入$B0000,然后输入的密码就会被拿来跟coding里的密码作比较
就如上面的,我的keypad就是用来输入电话号码和SMS资料进pic,然后发送(如果用HC11来说,我就是想把资料放进$B0000)

这有什么难度呢? 呵呵呵。。。
估计你的$B0000, 实际就是EEprom 吧。。


请问你, 这是你公司要你做的? 对吗?因为你已经毕业了。。这个不是学校作业了。。
回复

使用道具 举报

 楼主| 发表于 8-3-2012 10:20 PM | 显示全部楼层
回复 13# pic

在HC11里面$B0000是RAM,$B600是ROM.
我还是个学生,这是fyp来的,pic我没动过,就为了这个fyp,所以我学了
不过我老实说,我只会简单的,太难的不会,就比如以上的电路图,我会用U2是因为当用HC11时,它真的需要用到。我不知道那个call出来的h file是可以改的
以前我以为读大学是很本事,可是现在最后一年了,我学到的,能用到的,能明白的,就只有一点点,平时都是在这里看贴才学到东西的。
那个home security system,是我的第二个作品,虽然你可能觉得很简单,不过对我来说,能做到它,我是多么的开心!连续几天吃好的,走shopping来奖励自己,因为我们的老师,可以说就是混饭吃的,整班就只有四个人做到,每天就只会说ini pun tak tau ah?
我的fyp,是我自己选的题目,因为它对我来说很新,我想挑战它,我的sv也有做过,不过他做不到,我没有问过他一个问题,因为他说过:我只是来guild你和makesure你follow schedule做完你的东西,有时假假要问他,他就叫你去读书,说大家都是这样的,要自己学。

比如上面那个keypad coding,都是自己一点一点慢慢摸,慢慢改,花了整个星期才弄到的,不过就是还有一条线不会显示,不知道为什么。当然你们看到可能回笑,因为我的coding是笨笨的那种。之前还想过pm你,问你要不要教我,不过还是算了,我没有钱交补习费

我问过我的senior,他说coding是进ROM,然后我的number和sms进flash memory,所以我才会被搞乱
其实简单的说,现在我的电话号码和msg其实要进去RAM才对,就是断电后不见的那种
回复

使用道具 举报

发表于 9-3-2012 12:32 PM | 显示全部楼层
在HC11里面$B0000是RAM,$B600是ROM.
我还是个学生,这是fyp来的,pic我没动过,就为了这个fyp,所以我学了
Harry88 发表于 8-3-2012 10:20 PM

哦。。还是学生啊。。

不过我老实说,我只会简单的,太难的不会,就比如以上的电路图,我会用U2是因为当用HC11时,它真的需要用到。我不知道那个call出来的h file是可以改的

其实, 就算HC11 也不需要U2 的。。
我们用U2, 是当MCU I/O 不够, 或不想处理那些debouncing 的问题时才用。
其实, 你上面用U2的coding, 还可以简化的, 你应该从B0~B3 接去 U2 的data out, 程序会更简短。。

以前我以为读大学是很本事,可是现在最后一年了,我学到的,能用到的,能明白的,就只有一点点,平时都是在这里看贴才学到东西的。那个home security system,是我的第二个作品,虽然你可能觉得很简单,不过对我来说,能做到它,我是多么的开心!连续几天吃好的,走shopping来奖励自己,因为我们的老师,可以说就是混饭吃的,整班就只有四个人做到,每天就只会说ini pun tak tau ah?
我的fyp,是我自己选的题目,因为它对我来说很新,我想挑战它,我的sv也有做过,不过他做不到,我没有问过他一个问题,因为他说过:我只是来guild你和makesure你follow schedule做完你的东西,有时假假要问他,他就叫你去读书,说大家都是这样的,要自己学。

在大学, 是学习一些待人处事,怎样做逻辑性的思考, 怎样解决问题, 观念性的。。


比如上面那个keypad coding,都是自己一点一点慢慢摸,慢慢改,花了整个星期才弄到的,不过就是还有一条线不会显示,不知道为什么。

你的LCD, 我还是认为是质量问题。 可能, 你买的那批货, 就是有问题的。。

当然你们看到可能回笑,因为我的coding是笨笨的那种。
我不会笑。。这些是学习的过程

之前还想过pm你,问你要不要教我,不过还是算了,我没有钱交补习费

确实, 我收费的。。只是免费教一堂课。我也是要吃饭糊口的~~

我问过我的senior,他说coding是进ROM,然后我的number和sms进flash memory,所以我才会被搞乱

在PIC MCU, 其实正确是叫
Flash Program Memory
EEprom Data Memory
Data Memory (RAM)

其实简单的说,现在我的电话号码和msg其实要进去RAM才对,就是断电后不见的那种   

其实, 可以知道你整个FYP的概念吗?什么应用? (我知道你要发SMS, 但是为什么要发?几时发? 怎样发?具体一点的)
回复

使用道具 举报

 楼主| 发表于 9-3-2012 01:40 PM | 显示全部楼层
其实, 可以知道你整个FYP的概念吗?什么应用? (我知道你要发SMS, 但是为什么要发?几时发? 怎样发?具体一点的)

是针对那些笨笨的女佣和小孩的用品,家长出门时,就事先把自己的电话号码和sms内容存入这个东西
然后之后我会在加入几个pushbutton,比如:
button1:买菜
button2:有人来

button3:孩子生病
当然这些button会以图片来分别

就这样咯,不过电话号码和sms内容是要活的,不然就没人要了

你的4x4keypad我还是弄到有问题,迟些再慢慢研究了,现在我比较想搞好如何把东西存入RAM和那个AT command了
真的很怕来不及,毕不了业
回复

使用道具 举报


ADVERTISEMENT

发表于 9-3-2012 02:32 PM | 显示全部楼层
家长出门时,就事先把自己的电话号码和sms内容存入这个东西
Harry88 发表于 9-3-2012 01:40 PM

你要存入RAM 哦。。 掉电或reset 后怎么办? 女佣/小孩会set 回去那些电话号码?

看来, RAM 和EEprom 的功能,你可能还是没有搞懂。
回复

使用道具 举报

 楼主| 发表于 9-3-2012 05:58 PM | 显示全部楼层
回复 17# pic


RAM=能读能写入多次,不过一断电就不见了ROM=要用compiler burn 进去,只能读
PROM=只可以修改写入一次的ROM(要用compiler burn 进去)
EPROM=可重复修改写入的ROM(要用compiler burn 进去)
EEPROM=可重复修改写入的ROM(不须用compiler burn 进去)


有错吗?
回复

使用道具 举报

发表于 9-3-2012 11:40 PM | 显示全部楼层
本帖最后由 pic 于 9-3-2012 11:45 PM 编辑
RAM=能读能写入多次,不过一断电就不见了
ROM=要用compiler burn 进去,只能读
PROM=只可以修改写入一次的ROM(要用compiler burn 进去)
EPROM=可重复修改写入的ROM(要用compiler burn 进去)
EEPROM=可重复修改写入的ROM(不须用compiler burn 进去)

上面只是储存技术, 不要和compiler 混为一谈。
RAM, 又分SRAM, DRAM等等
ROM - Read only Memory, 是出厂时就做好, 不能写, 只能读。
PROM- 能写一次, 好像早期的 16Cxxx 系列的MCU,OTP (one time programing) 只是能烧一次
EPROM - 能写多次, 但是不超过100次吧, 要檫除, 需要用UV 灯照射10~15分钟。
EEprom- 能读写多次, 不需要UV 擦除, 有很长的寿命,1,000,000 (1M)~ 10,000,000 (10M)
Flash memory- 类似EEProm, 但是速度,容量, 比eeprom 好, 更便宜


重复之前说的:
PIC MCU 有三种储存, Flash memory, RAM, EEprom
Flash Program memory -- 是 储存program 的位置, 可以用Programmer/ Burner 烧入,
一些PIC MCU的 Flash Program Memory, 比如16F877A,也可以通过程序写入, bootloader 就是一个很好的例子。
Flash Memory 能够被写入的次数是1000~100,000次。

RAM - 在RAM 的资料, 在掉电后会消失。

EEprom -  也是Flash memory 的技术, 但是是用来储存 User data, 不可以存Program。
能够重复写入的寿命是 1,000,000 次。
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 18-4-2024 10:39 PM , Processed in 0.070681 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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