查看: 2217|回复: 18
|
手机keypad
[复制链接]
|
|
本帖最后由 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,不然很长很乱
- #include <18F4550.h>
- #fuses HS,NOWDT,NOLVP,NOPROTECT
- #use delay (clock=20M)
- #include "lcd.c"
- #define KA PIN_B2
- #define KB PIN_B3
- #define KC PIN_B4
- #define KD PIN_B5
- #define KV PIN_C0
- #define next PIN_C1
- #define LCD_E PIN_D0
- #define LCD_RS PIN_D1
- #define LCD_RW PIN_D2
- #define LCD_D4 PIN_D4
- #define LCD_D5 PIN_D5
- #define LCD_D6 PIN_D6
- #define LCD_D7 PIN_D7
- main()
- {
- set_tris_b(0x3F);
- set_tris_c(0xFF);
- output_b(0x00);
- output_c(0x00);
- lcd_init();
- lcd_putc("\fPhone number :");
- getnum();
- }
- ///////////////////////////////////////////////////////////
- getnum()
- {
- int i;
- i=1;
- lcd_init();
- while(input(next))
- {
- if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- lcd_gotoxy(i,2);
- lcd_putc("1");
- delay_ms(300);
- if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- lcd_gotoxy(i,2);
- lcd_putc("A");
- delay_ms(300);
- i++;
- else if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- lcd_gotoxy(i,2);
- lcd_putc("2");
- delay_ms(300);
- if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- lcd_gotoxy(i,2);
- lcd_putc("D");
- delay_ms(300);
- i++;
- }
- }
- ///////////////////////////////////////////////////////////
复制代码
5.你用什么MCU?
PIC18
6.你用什么语言? ASM /C/PICBasic/Keil?Compiler 版本?
我用CSC c language因为比较简单
7.有源码吗? 如是抄来的请注明出处, 请放链接。
没有
8.有电路图吗?
有
9.你google 了吗? 你的搜索关键字是什么?
有,keypad coding in c, 不过没找到
10.是你自己的问题? 还是你帮人问的? 请说明。
我自己的,不要骂我哦,我有做功课的,不过我真的想不到,我有兴趣,不过就是programming差了点 |
|
|
|
|
|
|
|
楼主 |
发表于 5-3-2012 04:29 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 5-3-2012 10:22 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
- #include <18F4550.h>
- #fuses HS,NOWDT,NOLVP,NOPROTECT
- #use delay (clock=20M)
- #include "lcd.c"
- #define KA PIN_B2
- #define KB PIN_B3
- #define KC PIN_B4
- #define KD PIN_B5
- #define KV PIN_C0
- #define next PIN_C1
- #define LCD_E PIN_D0
- #define LCD_RS PIN_D1
- #define LCD_RW PIN_D2
- #define LCD_D4 PIN_D4
- #define LCD_D5 PIN_D5
- #define LCD_D6 PIN_D6
- #define LCD_D7 PIN_D7
- ///////////////////////////////////////////////////////////
- void getnum()
- {
- int i;
- i=1;
- lcd_init();
- while(input(next))
- {
- if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- {{lcd_gotoxy(i,2);
- lcd_putc("1");
- delay_ms(300);}
- if(input(KV)&&!input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- {lcd_gotoxy(i,2);
- lcd_putc("A");
- delay_ms(300);}
- i++;}
- else if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- {{lcd_gotoxy(i,2);
- lcd_putc("2");
- delay_ms(300);}
- if(input(KV)&&input(KA)&&!input(KB)&&!input(KC)&&!input(KD))
- {lcd_gotoxy(i,2);
- lcd_putc("D");
- delay_ms(300);}
- i++;}
- }
- }
- ///////////////////////////////////////////////////////////
- void main()
- {
- set_tris_b(0x3F);
- set_tris_c(0xFF);
- output_b(0x00);
- output_c(0x00);
- lcd_init();
- lcd_putc("\fPhone number :");
- getnum();
- }
复制代码 这就是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。 |
|
|
|
|
|
|
|
楼主 |
发表于 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 你的键的输出, 还有时间的对应。
下面给你参考
- BYTE CONST SMS_ZERO[2] = {'0', 0x00};
- BYTE CONST SMS_ONE[2] = { '1', 0x00,};
- BYTE CONST SMS_TWO[5] = {'A', 'B', 'C', '2', 0x00};
- BYTE CONST SMS_THREE[5] = {'D', 'E', 'F', '3', 0x00};
- BYTE CONST SMS_FOUR[5] = {'G', 'H', 'I', '4', 0x00};
- BYTE CONST SMS_FIVE[5] = {'J', 'K', 'L', '5', 0x00};
- BYTE CONST SMS_SIX[5] = {'M', 'N', 'O', '6', 0x00};
- BYTE CONST SMS_SEVEN[6] = {'P', 'Q', 'R', 'S', '7', 0x00};
- BYTE CONST SMS_EIGHT[5] = {'T', 'U', 'V', '8', 0x00};
- BYTE CONST SMS_NINE[6] = {'W', 'X', 'Y', 'Z', '9', 0x00};
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 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);
有一个概念就可以了
- // 假设电话号码是 +601225701234 (有些电话有country code, area code,ext,电话号码有可能 10号码, 用不完的空间填上 '\0' )
- int TelNoPreset[20]={'+','6','0','1','2','2','5','7','0','1','2','3','4','\0',' \0','\0','\0','\0','\0','\0'};
- // Save Tel No to EEprom
- void SaveTelNo(int TelNoIndex)
- {
- int BaseAdd,pos;
- int fTerminate=0;
- BaseAdd=(TelNoIndex-1)*20;
- for(pos=0;pos<20;pos++)
- {
- if(TelNoPreset[pos]==0)fTerminate=1;
- if(fTerminate)
- {
- TelNoPreset[pos]=0;
- }
- else
- {
- // Only accept +,0~9
- if(!isamong(TelNoPreset[pos],"+0123456789"))
- {
- TelNoPreset[pos]=0;
- }
- }
- // write 20 bytes of string data to EEprom
- write_eeprom (pos+BaseAdd, TelNoPreset[pos]);
- }
- }
- int LoadTelNo(int TelNoIndex)
- {
- int BaseAdd,pos;
- BaseAdd=(TelNoIndex-1)*20;
- // clear data
- for(pos=0;pos<20;pos++)
- {
- TelNoPreset[pos]= 0;
- }
- //////////////////////////////
- // Load complete number
- for(pos=0;pos<20;pos++)
- {
- TelNoPreset[pos]= Read_EEPROM (pos+BaseAdd);
- }
- return 1;// Success
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 9-3-2012 01:40 PM
|
显示全部楼层
其实, 可以知道你整个FYP的概念吗?什么应用? (我知道你要发SMS, 但是为什么要发?几时发? 怎样发?具体一点的)
是针对那些笨笨的女佣和小孩的用品,家长出门时,就事先把自己的电话号码和sms内容存入这个东西
然后之后我会在加入几个pushbutton,比如:
button1:买菜
button2:有人来
button3:孩子生病
当然这些button会以图片来分别
就这样咯,不过电话号码和sms内容是要活的,不然就没人要了
你的4x4keypad我还是弄到有问题,迟些再慢慢研究了,现在我比较想搞好如何把东西存入RAM和那个AT command了
真的很怕来不及,毕不了业 |
|
|
|
|
|
|
|
发表于 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 次。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|