微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助单片机键盘显示(1602)

求助单片机键盘显示(1602)

时间:10-02 整理:3721RD 点击:
要在1602显示屏显示数字0-9  常用符号
程序有两个不知名程序,       
本来想用13号键选择数字模块,11号键光标左移,12右移,16键选择符号  1-9号键控制0-9数字和符号之类的
选择数字或符号模块时什么也没输出!求解

                       #include"reg52.h"
                           #define uint unsigned int
                           #define uchar unsigned char
                           /*LCD端口定义*/
                           sbit RS=P3^7;
                           sbit        RW=P3^6;
                           sbit E=P3^5;
                           sfr LCDData=0x80;                          
                           sfr keyport=0xa0;//键盘端口定义//
                uchar   key;        
               
                uint    q=0x80;//左右移位变量
                       
                            void Delay(uint i)                             //延时
                                                {
                                                while(i--);
                                                }                    
                           /*液晶驱动程序*/
                          void Write_Instruction(uchar x)                //字节命令
                         {
                         Delay(1000);
                         E=0;
                         RW=0;
                         RS=0;
                         LCDData=x;
                         E=1;
                         Delay(20);
                         E=0;
                         }
                         void Write_Data(uchar x)                        //字节数据写入数据
                         {
                         Delay(1000);
                         E=0;
                         RW=0;
                         RS=1;
                         E=1;
                         LCDData=x;
                         E=0;
                         }
                         void C1S(void)                                           //清屏
                           {
                           Write_Instruction(0x01);
                           }
                     void InitLCD(void)                          //初始化
                           {Write_Instruction(0x38);
                           Delay(200);
                           Write_Instruction(0x0e);
                           Delay(200);
                           Write_Instruction(0x06);
                           Delay(200);
                           }  
                         void Write_String(uchar x,uchar*p)                   //字符串写入
                           {
                           Write_Instruction(x);
                           while(*p!=0x00)
                           {
                           Write_Data(*p);
                           p++;
                           if(x++==0x8f)
                           {Write_Instruction(0xc0);
                           }}}                                               
                         


                           /*行列式键盘驱动程序*/
                            bit ReadKey(void)         //Reakey
                {
                bit dat;
                keyport=0xf0;  //键盘口高四位列线为1,低四位行线为0
                if(keyport==0xf0)
                {
                dat=0;//没有按键按下
                }
                else
                {
                dat=1; //当前有按键按下
                }
                return(dat);
                }

                uchar IdentifyKey(void)           //键盘驱动程序
                {
                uchar i=1,j=0xfe,m;
                while(j!=0x7f)
                {
                keyport=j;
                m=keyport&0xf0;
                switch(m)
                {
                case 0xe0:
                {
                i=i+0;
                j=0x7f;
                break;
                }
                case 0xd0:
                {i=i+4;
                j=0x7f;
                break;
                }
                case 0xb0:
                {i=i+8;
                j=0x7f;
                break;
                }
                case 0x70:
                {
                i=i+12;
                j=0x7f;
                break;
                }
                default:
                {
                i=i+1;
                j=(j<<1)+1;
                break;
                }
                }
                }
                return(i);
                }
                          
                 /*键盘与与液晶驱动应用 */
                           //显示按键结果程序
                           //i:1602液晶屏上的显示地址
                           //k:按键编号,1-16
                           void DisplayKey(uchar i,uchar k)
                           {
                           Write_Instruction(i);
                           Write_Data(k);
                          
                           }
                          
                          
                         void left ()                                //左移
                         {
          
          
                 Write_Instruction(0x10);
                            
                     q--;
                      if(q+1==0xc0)                                                                           
                         {          
                            q=0x8f;
                      Write_Instruction(0x8f);
         
                }
                }                        
                                                       
                          void right ()                         //右移
                                {
                                Write_Instruction(0x14);
                                q++;
                                if(q-1==0x8f)
                                {
                       
                                q=0xc0        ;
                                Write_Instruction(0xc0);
                                }}                                            
                                                  
                          
                                     
                void DisplayKey_point        (void)                         //数字模块
                {
                  放 if(ReadKey())//如果没有按键按下,则直接退出
                           {
                          
                           key=IdentifyKey();//识别按键编号
                           while(ReadKey());//等待按键释放
                           }
                    if(key==1){DisplayKey(q,0x31);}
                        if(key==2){DisplayKey(q,0x32);}               
                        if(key==3){DisplayKey(q,0x33);}
                    if(key==4){DisplayKey(q,0x34);}
                        if(key==5){DisplayKey(q,0x35);}
                    if(key==6){DisplayKey(q,0x36);}
                          if(key==7){DisplayKey(q,0x37);}       
                        if(key==8){DisplayKey(q,0x38);}
                        if(key==9){DisplayKey(q,0x39);}
                        if(key==10){DisplayKey(q,0x30);}         }
               
                          
                void DisplayKey_symbol        (void)                               //符号模块
                {
                         if(ReadKey())//如果没有按键按下,则直接退出
                           {
                          
                           key=IdentifyKey();//识别按键编号
                           while(ReadKey());//等待按键释放
                           }
                        if(key==1){DisplayKey(q,0x21);}
                        if(key==2){DisplayKey(q,0x2c);}
                        if(key==3){DisplayKey(q,0x2e);}
                        if(key==4){DisplayKey(q,0x28);}
                       
                }         
       
                          
                           //扫描键盘程序
                           void ScanKey(void)
                           {
                           if(ReadKey())//如果没有按键按下,则直接退出
                           {
                          
                           key=IdentifyKey();//识别按键编号
                           while(ReadKey());//等待按键释放
                         if(key==11)        //左移
                         {
                          left();
                         }
               
                          if(key==12)          //右移
                         {
                          right();
                         }
                          if (key==13)                          //选择数字模块
                        {
                           DisplayKey_point();
                            }
                         
                   if (key==16)                   //选择字符模块
                          {
                          
                          DisplayKey_symbol();
                          }         
                                                  
                         
                          
                           }}       
                         
                         
                         
                           /*主程序*/
                           void main(void)
                           {
                           C1S();
                           InitLCD();//初始化液晶
                          
               
                           while(1)
                           {
                           ScanKey();
                           Delay(0xffff);
                           }}

                          

等大神

程序太长,没时间看,先测试按键是否响应,响应按键后送个信号或显个数出来,一步一步的找原因

程序太长没时间看,不过我觉得,你是不是试着软件延时去抖动看看。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top