找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2513|回复: 6
收起左侧

单片机电话拨号显示系统的程序设计 保存到数组里的电话号码如何退格?

[复制链接]
ID:959883 发表于 2021-8-28 15:50 | 显示全部楼层 |阅读模式
设计一模拟电话拨号时的电话键盘及显示装置,把电话键盘拨出的电话号码及其他信息,显示在LCD显示屏上。电话键盘共12个键,除了0~9的10个数字键外,还有
“*”键用于删除最后输入的1位号码的功能;“#”键用于清除显示屏上所有的数字显示。此外还要求每按下一个键,蜂鸣器要发出声响,以表示按下该键。显示信息共2行,第1行为设计者信息,第2行显示所拨的电话号码。  
   本例的电话拨号键盘采用4×3矩阵键盘,共12个键。拨号号码显示采用LCD 1602 液晶显示模块。因此涉及了单片机与4×3矩阵式键盘以及与16×2的液晶显示屏的接口设计,还有各种驱动程序的编制。液晶显示屏采用LCD1602 (即Proteus中的LM016L)。


目前其他功能都实现了,只有*键的退格功能还没加上去,大家一起来讨论一下如何实现吧
单片机源程序如下:
  1. #include<reg51.h>        
  2. #include"lcd.h"

  3. #define GPIO_KEY P1        //按键
  4. sbit beep=P1^5;            //蜂鸣器地址
  5. unsigned char KeyValue;    //用来存放读取到的键值
  6. unsigned char KeyState;    //用来存放按键状态

  7. unsigned char PuZh[]="   XXX   Design ";  // 设计者信息
  8. unsigned char  dat[]="1234567890";
  9. unsigned char  clear[]="           ";
  10. unsigned char tel[11];     //用来存放输入的电话号码
  11. unsigned char head[]="TEL:";


  12. void Delay10ms();          //延时50us
  13. void KeyDown();                         //检测按键函数
  14. void Int0Init();           //中断函数
  15. void start();              //初始界面



  16. int N;   //输入的电话号码位数
  17. int i;   
  18. /*******************************************************************************
  19. * 函 数 名         : main
  20. * 函数功能                   : 主函数
  21. * 输    入         : 无
  22. * 输    出         : 无
  23. *******************************************************************************/
  24. void main()
  25. {
  26.   Int0Init(); // 设置外部中断 0
  27.   
  28.         LcdInit();  //显示屏初始化
  29.         start();    //初始界面
  30. //        int a=0;
  31.         KeyState=0;
  32.         
  33.         while(1)
  34.         {
  35.                 KeyDown();
  36.                         
  37.                 if(KeyState)
  38.                 {
  39.                         KeyState=0;
  40.                         
  41.                         while(1)                                          //进入显示循环
  42.                 {        
  43.                                                         while(1)
  44.                                         {                                                               
  45.                                                 LcdWriteCom(0x80+0x40+5);          //显示第一位
  46.                                                            KeyValue =tel[0];
  47.                                                      LcdWriteData(dat[KeyValue]);                 
  48.                                                                  Delay10ms();
  49.                                                            if(N==0)                          
  50.                                                            break;
  51.                                                 LcdWriteCom(0x80+0x40+6);          //显示第二位
  52.                                                            KeyValue =tel[1];
  53.                                                                  LcdWriteData(dat[KeyValue]);        
  54.                                                                  Delay10ms();
  55.                                                                  if(N==1)
  56.                                                                  break;
  57.                                                 LcdWriteCom(0x80+0x40+7);         //第三位
  58.                  KeyValue =tel[2];                                                
  59.                                                                  LcdWriteData(dat[KeyValue]);         
  60.                                                                  Delay10ms();
  61.                                                                  if(N==2)
  62.                                                                  break;
  63.                                           LcdWriteCom(0x80+0x40+8);         //4
  64.                                                                  KeyValue =tel[3];
  65.                                                      LcdWriteData(dat[KeyValue]);
  66.                                                                  Delay10ms();
  67.                                                                  if(N==3)
  68.                                                                  break;
  69.                                           LcdWriteCom(0x80+0x40+9);         //5
  70.                                                                  KeyValue =tel[4];
  71.                                                            LcdWriteData(dat[KeyValue]);
  72.                                                                  Delay10ms();
  73.                                                                  if(N==4)
  74.                                                                  break;
  75.                                     LcdWriteCom(0x80+0x40+10);         //6
  76.                                                                  KeyValue =tel[5];
  77.                                                            LcdWriteData(dat[KeyValue]);         
  78.                                                                  Delay10ms();
  79.                                                                  if(N==5)
  80.                                                                  break;
  81.                                           LcdWriteCom(0x80+0x40+11);         //7
  82.                                                                  KeyValue =tel[6];
  83.                                                      LcdWriteData(dat[KeyValue]);         
  84.                                                                  Delay10ms();
  85.                                                                  if(N==6)
  86.                                                                  break;
  87.                                           LcdWriteCom(0x80+0x40+12);         //8
  88.                                                                  KeyValue =tel[7];
  89.                                                      LcdWriteData(dat[KeyValue]);         
  90.                                                                  Delay10ms();
  91.                                                                  if(N==7)
  92.                                                                  break;
  93.                                                 LcdWriteCom(0x80+0x40+13);         //9
  94.                                                                  KeyValue =tel[8];
  95.                                                            LcdWriteData(dat[KeyValue]);         
  96.                                                                  Delay10ms();
  97.                                                                  if(N==8)
  98.                                                                  break;
  99.                                                                  
  100.                                           LcdWriteCom(0x80+0x40+14);         //10
  101.                                                                  KeyValue =tel[9];
  102.                                                            LcdWriteData(dat[KeyValue]);         
  103.                                                                  Delay10ms();
  104.                                                                  if(N==9)
  105.                                                                  break;
  106.                                           LcdWriteCom(0x80+0x40+15);         //11
  107.                                                                  KeyValue =tel[10];
  108.                                                            LcdWriteData(dat[KeyValue]);         
  109.                                                                  Delay10ms();
  110.                                                                  if(N==10)
  111.                                                                  break;
  112.                      
  113. //          LcdWriteCom(0x80+0x40+a+5);         //
  114. //                                                           KeyValue=tel[N];
  115. //                 LcdWriteData(dat[KeyValue]);         
  116. //                                                                 Delay10ms();
  117. //                                                                 
  118. //                                                                 if(N==a)
  119. //                                                                 {a++;
  120. //                                                                         break;}
  121.                                        
  122.                                 }
  123.                                        
  124.                                         if(GPIO_KEY!=0xf0)                 //按键再次按下退出循环
  125.                                                         {        Delay10ms();if(GPIO_KEY!=0xf0) break;}
  126.           }
  127.         N++;               
  128.     }
  129.         }
  130. }
  131. /*******************************************************************************
  132. * 函 数 名         : KeyDown
  133. * 函数功能                   : 检测有按键按下并读取键值
  134. * 输    入         : 无
  135. * 输    出         : 无
  136. *******************************************************************************/
  137. void KeyDown(void)
  138. {
  139.         char a;
  140.         GPIO_KEY=0x0f;
  141.         if(GPIO_KEY!=0x0f)
  142.         {
  143.                 Delay10ms();
  144.                 if(GPIO_KEY!=0x0f)
  145.                 {
  146.                         KeyState=1;
  147.                         //测试列
  148.                         GPIO_KEY=0X0F;
  149. //                         Delay10ms();
  150.                         switch(GPIO_KEY)
  151.                         {
  152.                                 case(0X07):        KeyValue=0;break;
  153.                                 case(0X0b):        KeyValue=1;break;
  154.                                 case(0X0d): KeyValue=2;break;
  155.                
  156.                         }
  157.                         //测试行
  158.                         GPIO_KEY=0XF0;
  159.                         Delay10ms();
  160.                         switch(GPIO_KEY)
  161.                         {
  162.                                 case(0X70):        KeyValue=KeyValue;break;
  163.                                 case(0Xb0):        KeyValue=KeyValue+3;break;
  164.                                 case(0Xd0): KeyValue=KeyValue+6;break;
  165.                                 case(0Xe0):        KeyValue=KeyValue+9;break;
  166.                         }
  167.                         //LcdWriteData(dat[KeyValue]);
  168.                         tel[N]=KeyValue;
  169.                         
  170.                         if(KeyValue==11)  //清屏
  171.                 {
  172.                         N=0;                              
  173.       for (a = 0; a < 11; a++)
  174.       tel[a] = '\0' ;            //清空数组                              

  175.                         LcdWriteCom(0x01);
  176.                         start();
  177.                 }
  178. //                if(KeyValue==10)  //退格
  179. //                {
  180. //                        
  181. //                        
  182. //                }
  183.                
  184.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  185.                         {
  186.                                 Delay10ms();
  187.                                 a++;
  188.                         }
  189.                         a=0;
  190.                 }
  191.         }
  192. }
  193. /*******************************************************************************
  194. * 函 数 名         : start()
  195. * 函数功能                   : 显示初始界面
  196. * 输    入         : 无
  197. * 输    出         : 无
  198. *******************************************************************************/
  199. void start()
  200. {
  201.         for(i=0;i<16;i++)
  202.         {
  203.                 LcdWriteData(PuZh[i]);        //设计者信息
  204.         }
  205.         LcdWriteCom(0x80+0x40);
  206.         for(i=0;i<4;i++)
  207.         {
  208.                 LcdWriteData(head[i]);        
  209.         }
  210. }
  211. /*******************************************************************************
  212. * 函 数 名         : Delay10ms
  213. * 函数功能                   : 延时函数,延时10ms
  214. * 输    入         : 无
  215. * 输    出         : 无
  216. *******************************************************************************/
  217. void Delay10ms(void)   //误差 0us
  218. {
  219.     unsigned char a,b,c;
  220.     for(c=1;c>0;c--)
  221.         for(b=38;b>0;b--)
  222.             for(a=130;a>0;a--);
  223. }

  224. /****************************************************************
  225. ***************
  226. * 函 数 名 : Int1Init()
  227. * 函数功能 : 设置外部中断 1
  228. * 输 入 : 无
  229. * 输 出 : 无
  230. *****************************************************************
  231. **************/
  232. void Int0Init()
  233. {
  234. //设置 INT0
  235. IT0=1;//跳变沿出发方式(下降沿)
  236. EX0=1;//打开 INT0 的中断允许。
  237. EA=1;//打开总中断
  238. }

  239. /****************************************************************
  240. ***************
  241. * 函 数 名 : Int0() interrupt 0
  242. * 函数功能 : 外部中断 0 的中断函数
  243. * 输 入 : 无
  244. * 输 出 : 无
  245. *****************************************************************
  246. **************/
  247. void Int0() interrupt 0 //外部中断 0 的中断函数
  248. {
  249.                 Delay10ms();
  250.                 if(GPIO_KEY!=0x0f)  //如果有按键按下
  251.                 {
  252.                         beep=~beep;         //蜂鸣器发声
  253.             Delay10ms();
  254.                
  255.                 }
  256. }
复制代码

全部资料51hei下载地址:
LCD1602显示矩阵键盘键值1.7z (26.78 KB, 下载次数: 8)

回复

使用道具 举报

ID:161164 发表于 2021-8-28 16:36 | 显示全部楼层
for (a = 0; a < 10; a++)
      tel[a] =  tel[a+1] ;
      
tel[10]='\0'
回复

使用道具 举报

ID:959883 发表于 2021-8-28 16:57 | 显示全部楼层
lkc8210 发表于 2021-8-28 16:36
for (a = 0; a < 10; a++)
      tel[a] =  tel[a+1] ;
      

会出现乱码
IMG_5201.JPG
回复

使用道具 举报

ID:213173 发表于 2021-8-29 14:45 | 显示全部楼层
楼主这个3*4矩阵键盘不可以按4*4矩阵键盘代码套用,因为蜂鸣器占用了P1.5,所以读P1矩阵键盘状态时要把P1.5状态屏蔽。否则会乱套。 无标题.jpg

测试程序 仿真.zip (111.86 KB, 下载次数: 9)

回复

使用道具 举报

ID:161164 发表于 2021-8-29 16:38 | 显示全部楼层

对不起,没看全你的代码就回覆了

重看一次你的代码
你的基本逻辑是按多下显示多少位
退格这动作与你的基本逻辑有很大的冲突
如要加入退格就要大改你的代码
回复

使用道具 举报

ID:959883 发表于 2021-8-30 12:42 | 显示全部楼层
lkc8210 发表于 2021-8-29 16:38
对不起,没看全你的代码就回覆了

重看一次你的代码

请问如何改
回复

使用道具 举报

ID:161164 发表于 2021-8-30 14:04 | 显示全部楼层

有点复杂
dat[]="1234567890 "//在第10位加空格(Space)
tel里先放一堆10(对应dat[]里的空格)
每次按键,把对应键值(0~9)放进tel[N],并N++
如果按键不是0~9, 就不要放进tel,不要动N
如果按键是11, 就tel[--N] = 10;

再显示一遍tel[0]到tel[10]
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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