久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2500|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线中文字幕亚洲 | 亚洲品质自拍视频网站 | 91精品国产乱码久久久久久久久 | 在线视频亚洲 | 黄色小视频大全 | 欧美三级视频 | 亚洲国产成人精品女人久久久野战 | 亚洲国产成人精品久久久国产成人一区 | 午夜天堂精品久久久久 | 一区二区三区四区日韩 | 奇米四色影视 | 福利视频网站 | 99亚洲精品| 免费av在线 | 国产亚洲精品综合一区 | 欧美一级片黄色 | 一级片免费视频 | 久久精品视频网站 | 国产精品v | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 日韩高清一区 | 成人网在线看 | 欧美精品一区二区在线观看 | 99精品久久 | 国产精品永久久久久 | 国产精品美女久久久av超清 | 精品视频在线播放 | 超碰在线97国产 | 国产精品久久久久久久久久久久冷 | 国产精品日韩欧美一区二区三区 | 福利视频三区 | 色婷婷九月 | 99久久婷婷国产综合精品 | 国产在线a | 天天干天天操天天看 | 欧美国产视频 | 亚洲欧洲精品一区 | 亚洲国产精品久久 | 一级无毛片| 伊人网在线综合 | 久久国产精品偷 |