找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2036|回复: 5
收起左侧

求救各位大神,单片机程序缺失显示函数,如何补上 求思路

[复制链接]
ID:661927 发表于 2019-12-12 15:21 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include <string.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit RS=P2^0;
  6. sbit RW=P2^1;
  7. sbit EN=P2^2;
  8. sbit SPK=P2^7;

  9. uchar code KeyPad_Chars[12][6]={"1 ","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ","*","0+","#"};//初始化键盘字库
  10. uchar code Line1[]=" LJL'S Cellphone";//固定字符串
  11. uchar code Line2[]="Your Key:       ";
  12. uchar KeyNo=-1;                        //键位0~11
  13. uchar Inner_Idx=0;                //同键位内部切换
  14. uchar tSpan=0;                        //同键位连续按键时间间隔

  15. /**********************毫秒延时************************************/
  16. void DelayMS(uint ms)        
  17. {
  18.         uchar i;
  19.         while(ms--)
  20.         {
  21.                 for(i=0;i<110;i++);
  22.         }
  23. }

  24. /************************忙检测***********************************/
  25. uchar Busy_Waiting()
  26. {
  27.         uchar lcd_status;
  28.         RS=0;
  29.         RW=1;
  30.         EN=1;
  31.         DelayMS(1);
  32.         lcd_status=P0;
  33.         EN=0;
  34.         return lcd_status;
  35. }

  36. /************************写数据***********************************/
  37. void Write_LCD_DATA(uchar dat)
  38. {
  39.         while((Busy_Waiting()&&0x80)==0x80);
  40.         RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
  41. }

  42. /************************写指令********************************/
  43. void Write_LCD_Command(uchar cmd)
  44. {
  45.         while((Busy_Waiting()&0x80)==0x80);
  46.         RS=0;
  47.         RW=0;
  48.         EN=0;
  49.         P0=cmd;EN=1;DelayMS(1);EN=0;
  50. }

  51. /*****************初始化***********************************/
  52. void Init_LCD()
  53. {
  54.         Write_LCD_Command(0x38);
  55.         DelayMS(1);
  56.         Write_LCD_Command(0x01);
  57.         DelayMS(1);
  58.         Write_LCD_Command(0x06);
  59.         DelayMS(1);
  60.         Write_LCD_Command(0x0c);
  61.         DelayMS(1);
  62. }

  63. /**********************键盘扫描************************************/
  64. void Keys_Scan()
  65. {
  66.         P1=0x0f;                        //高四位置0
  67.         DelayMS(1);
  68.         switch(P1)                        //判断列
  69.         {
  70.                 case 0x0e: KeyNo=0;break;
  71.                 case 0x0d: KeyNo=1;break;
  72.                 case 0x0b: KeyNo=2;
  73.         }
  74.         P1=0xf0;                        //第四位置0
  75.         DelayMS(1);
  76.         switch(P1)                         //根据行数加KN
  77.         {
  78.                 case 0xe0: KeyNo+=0;break;
  79.                 case 0xd0: KeyNo+=3;break;
  80.                 case 0xb0: KeyNo+=6;break;
  81.                 case 0x70: KeyNo+=9;
  82.         }
  83. }

  84. /**********************蜂鸣器**************************************/
  85. void Beep()
  86. {
  87.         SPK=1;
  88.         DelayMS(400);
  89.         SPK=0;
  90. }



  91. /**********************主程序**************************************/
  92. void main()
  93. {
  94.         uchar i,Pre_KeyNo=-1;
  95.         IE=0x82;
  96.         TMOD=0x01;
  97.         TH0=-50000/256;
  98.         TL0=-50000%256;
  99.         P0=P2=0xff;
  100.         SPK=0;
  101.         DelayMS(10);
  102.         Init_LCD();                        //初始化
  103.         Set_LCD_POS(0);                //显示第一行
  104.         for(i=0;i<16;i++)
  105.                 Write_LCD_DATA(Line1[i]);
  106.         Set_LCD_POS(0x40);         //显示第二行
  107.         for(i=0;i<16;i++)
  108.                 Write_LCD_DATA(Line2[i]);
  109.         while(1)
  110.         {
  111.                 P1=0xf0;
  112.                 if(P1!=0xf0)Keys_Scan();//按键检测
  113.                 else continue;
  114.                 if(Pre_KeyNo!=KeyNo)         //新按键判断
  115.                 {
  116.                         Pre_KeyNo=KeyNo;
  117.                         tSpan=0;                        //间隔请0
  118.                         Inner_Idx=0;                   //按键内部切换清0
  119.                         TR0=1;                                   //启动定时器
  120.                 }
  121.                 else                                          //如为同一按键
  122.                 {
  123.                         if(tSpan<=40)
  124.                                 Inner_Idx=(Inner_Idx+1)%strlen(KeyPad_Chars[KeyNo]);        //显示下一个
  125.                                 else
  126.                                         Inner_Idx=0;
  127.                                 tSpan=0;
  128.                 }
  129.                 Set_LCD_POS(0x4b);
  130.                 Write_LCD_DATA(KeyPad_Chars[KeyNo][Inner_Idx]);         //显示按键
  131.                 Beep();
  132.                 DelayMS(100);
  133.         }
  134. }
复制代码

111111.png
111111.png
回复

使用道具 举报

ID:416239 发表于 2019-12-12 15:54 | 显示全部楼层
百度一个显示函数,然后在主函数里初始化一下
回复

使用道具 举报

ID:661927 发表于 2019-12-12 16:18 | 显示全部楼层
李泽训 发表于 2019-12-12 15:54
百度一个显示函数,然后在主函数里初始化一下

调用不了,显示函数前面定义有问题
回复

使用道具 举报

ID:275826 发表于 2019-12-12 18:43 | 显示全部楼层
把这个加在程序里
void Set_LCD_POS(uchar pos)
{
        Write_LCD_Command(pos|0x80);       
}
回复

使用道具 举报

ID:213173 发表于 2019-12-12 21:59 | 显示全部楼层
无标题.jpg
随便改的,不知是否与原作意思相同


  1. #include <reg52.h>
  2. #include <string.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit RS =P2^0;
  6. sbit RW =P2^1;
  7. sbit EN =P2^2;
  8. sbit SPK=P2^7;//蜂鸣器

  9. uchar code KeyPad_Chars[12][6]={
  10. "1 ","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ","*","0+","#"};//初始化键盘字库
  11. uchar code Line1[]=" LJL'S Cellphone";//固定字符串
  12. uchar code Line2[]="Your Key:       ";
  13. uchar KeyNo=-1;                                                        //键位0~11
  14. uchar Inner_Idx=0;                        //同键位内部切换
  15. uchar tSpan=0;                        //同键位连续按键时间间隔

  16. /**********************毫秒延时************************************/
  17. void DelayMS(uint ms)        
  18. {
  19.         uchar i;
  20.         while(ms--)
  21.         {
  22.                 for(i=0;i<110;i++);
  23.         }
  24. }

  25. /************************忙检测***********************************/
  26. uchar Busy_Waiting()
  27. {
  28.         uchar lcd_status;
  29.         RS=0;
  30.         RW=1;
  31.         EN=1;
  32.         DelayMS(1);
  33.         lcd_status=P0;
  34.         EN=0;
  35.         return lcd_status;
  36. }
  37. /************************写指令********************************/
  38. void Write_LCD_Command(uchar cmd)
  39. {
  40.         while((Busy_Waiting()&0x80)==0x80);
  41.         RS=0;
  42.         RW=0;
  43.         EN=0;
  44.         P0=cmd;
  45.         EN=1;
  46.         DelayMS(1);
  47.         EN=0;
  48. }
  49. /************************写数据***********************************/
  50. void Write_LCD_DATA(uchar dat)
  51. {
  52.         while((Busy_Waiting()&&0x80)==0x80);
  53.         RS=1;
  54.         RW=0;
  55.         EN=0;
  56.         P0=dat;
  57.         EN=1;
  58.         DelayMS(1);
  59.         EN=0;
  60. }
  61. /*****************初始化***********************************/
  62. void Init_LCD()
  63. {
  64.         Write_LCD_Command(0x38);
  65.         DelayMS(1);
  66.         Write_LCD_Command(0x01);
  67.         DelayMS(1);
  68.         Write_LCD_Command(0x06);
  69.         DelayMS(1);
  70.         Write_LCD_Command(0x0c);
  71.         DelayMS(1);
  72. }

  73. /**********************键盘扫描************************************/
  74. void Keys_Scan()
  75. {
  76.         P3=0x0f;                        //高四位置0
  77.         DelayMS(1);
  78.         switch(P3)                        //判断列
  79.         {
  80.                 case 0x0e: KeyNo=0;break;
  81.                 case 0x0d: KeyNo=1;break;
  82.                 case 0x0b: KeyNo=2;break;
  83.         }
  84.         P3=0xf0;                        //第四位置0
  85.         DelayMS(1);
  86.         switch(P3)                         //根据行数加KN
  87.         {
  88.                 case 0xe0: KeyNo+=0;break;
  89.                 case 0xd0: KeyNo+=3;break;
  90.                 case 0xb0: KeyNo+=6;break;
  91.                 case 0x70: KeyNo+=9;break;
  92.         }
  93. }

  94. /**********************蜂鸣器**************************************/
  95. void Beep()
  96. {
  97.         SPK=1;
  98.         DelayMS(400);
  99.         SPK=0;
  100. }

  101. /**********************主程序**************************************/
  102. void main()
  103. {
  104.         uchar i,Pre_KeyNo=-1;
  105.         IE=0x82;
  106.         TMOD=0x01;
  107.         TH0=-50000/256;
  108.         TL0=-50000%256;
  109.         P0=P2=0xff;
  110.         SPK=0;
  111.         DelayMS(10);
  112.         Init_LCD();                //初始化
  113. //        Set_LCD_POS(0);            //显示第一行
  114.         Write_LCD_Command(0x80);
  115.         for(i=0;i<16;i++)
  116.                 Write_LCD_DATA(Line1[i]);
  117. //        Set_LCD_POS(0x40);         //显示第二行
  118.         Write_LCD_Command(0x80+0x40);
  119.         for(i=0;i<16;i++)
  120.                 Write_LCD_DATA(Line2[i]);
  121.         while(1)
  122.         {
  123.                 P3=0xf0;
  124.                 if(P3!=0xf0)
  125.                         Keys_Scan();//按键检测
  126.                 else continue;
  127.                 if(Pre_KeyNo!=KeyNo)//新按键判断
  128.                 {
  129.                         Pre_KeyNo=KeyNo;
  130.                         tSpan=0;                        //间隔请0
  131.                         Inner_Idx=0;                   //按键内部切换清0
  132.                         TR0=1;                                   //启动定时器
  133.                 }
  134.                 else                                          //如为同一按键
  135.                 {
  136.                         if(tSpan<=40)
  137.                                 Inner_Idx=(Inner_Idx+1)%strlen(KeyPad_Chars[KeyNo]);//显示下一个
  138.                         else
  139.                         Inner_Idx=0;
  140.                         tSpan=0;
  141.                 }
  142. //                Set_LCD_POS(0x4b);
  143.                 Write_LCD_Command(0x80+0x40+0x09);
  144.                 Write_LCD_DATA(KeyPad_Chars[KeyNo][Inner_Idx]);//显示按键
  145.                 Beep();
  146.                 DelayMS(100);
  147.         }
  148. }
复制代码




回复

使用道具 举报

ID:661927 发表于 2019-12-12 23:11 | 显示全部楼层
谢谢大佬,我加进去试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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