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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1428|回復: 4
打印 上一主題 下一主題
收起左側

幫忙看看下面的程序為什么按按鍵出不來數字

[復制鏈接]
跳轉到指定樓層
樓主
#include <reg52.h>                           //主函數
#define  uint unsigned int           //宏定義
#define  uchar unsigned char
//#define data P0                           //數據口
//sbit LCD_RS =P2^7;                   //并行數據命令選擇控制
//sbit LCD_RW =P2^6;                   //并行讀寫控制
//sbit LCD_EN =P2^5;                   //并行使能信號
//sbit LCD_PSB=P2^4;                   //并行串行選擇
int   keyscan();
uint  key_keys;                    //定義按鍵值                                  
void delayms(uint xms)               //延時函數
{
        uint i,j;
        for(i=xms;i>0;i--);
                for(j=110;j>0;j--);       
}

/**********主函數**********/
void main()                                          
{

        while(1)
        {
                key_keys=keyscan();
        }
}

/******按鍵控制函數******/
int keyscan()                                  
{
        uchar temp;
    static keys;                    //keys定義成為一個靜態全局變量                        
        P1=0xfe;                        //(寫)1111 1110將第一行線置低電平,其余行線全為高電平
        temp=P1;                               //(讀)將P3口當前的狀態賦給臨時變量temp
        temp=temp&0xf0;                        //判斷temp的高四位是否有0
        if(temp!=0xf0)                        //說明有第一行的按鍵被按下
        {
                delayms(5);            //按鍵去抖延時
                temp=P1;                    //進行再一次判斷
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xee : keys=1;break;        //1110 1110
                                case 0xde : keys=2;break;   //1101 1110
                                case 0xbe : keys=3;break;        //1011 1110
                                case 0x7e : keys=4;break;        //0111 1110
                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
                }
        }

        P1=0xfd;                                  //1111 1101將第二行線置低電平,其余行線全為高電平
        temp=P1;                                  //將P3口當前的狀態賦給臨時變量temp
        temp=temp&0xf0;                          //判斷temp的高四位是否有0
        if(temp!=0xf0)                          //說明有第一行的按鍵被按下
        {
                delayms(5);                  //按鍵去抖延時
                temp=P1;                          //進行再一次判斷
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xed : keys=5;break;   //1110 1101
                                case 0xdd : keys=6;break;   //1101 1101
                                case 0xbd : keys=7;break;   //1011 1101
                                case 0x7d : keys=8;break;   //0111 1101

                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
            }
         }

        P1=0xfb;                                  //1111 1011將第三行線置低電平,其余行線全為高電平
        temp=P1;                                  //將P3口當前的狀態賦給臨時變量temp
        temp=temp&0xf0;                          //判斷temp的高四位是否有0
        if(temp!=0xf0)                          //說明有第一行的按鍵被按下
        {
                delayms(5);                  //按鍵去抖延時
                temp=P1;                          //進行再一次判斷
                temp=temp&0xf0;
                if(temp!=0xf0)
                {       
                        temp=P1;
                        switch(temp)
                        {
                                case 0xed : keys=9;break;   //1110 1011
                                case 0xdd : keys=0;break;   //1101 1011
//                                case 0xbd : key==;break;   
//                                case 0x7d : write_data(0x01);break;   //0111 1101


                        }                       
                        while(temp!=0xf0)
                        {
                                temp=P1;
                                temp=temp&0xf0;
                        }
            }
                return keys;

         }
//        P1=0xf7;                                  //1111 0111將第四行線置低電平,其余行線全為高電平
//        temp=P1;                                  //將P3口當前的狀態賦給臨時變量temp
//        temp=temp&0xf0;                          //判斷temp的高四位是否有0
//        if(temp!=0xf0)                          //說明有第一行的按鍵被按下
//        {
//                delayms(10);                  //按鍵去抖延時
//                temp=P1;                          //進行再一次判斷
//                temp=temp&0xf0;
//                if(temp!=0xf0)
//                {       
//                        temp=P1;
//                        switch(temp)
//                        {
//                                case 0xe7 : key=+;break;   
//                                case 0xd7 : key=-;break;   
//                                case 0x77 : key=/;break;   
//                                case 0xb7 : key=*;break;  
//                        }                       
//                        while(temp!=0xf0)
//                        {
//                                temp=P1;
//                                temp=temp&0xf0;
//                        }
//            }
//         }
}
//void yunshuang()
//{
//       
//
//
//}
///*寫指令數據到LCD*/       
///*RS=H,RW=L,E=高脈沖,D0-D7=指令碼*/
//void write_cmd(uchar cmd)                               
//{       
//        LCD_RS=0;                                                           //寫
//        LCD_RW=0;                                                           //指令
//        LCD_EN=0;                                                           //選中數據
//        P1=cmd;
//        delayms(5);                                                  
//        LCD_EN=1;                                                           //寫入數據
//        delayms(5);
//        LCD_EN=0;         
//}
///*寫顯示數據到LCD*/
///*RS=H,RW=L,E=高脈沖,D0-D7=數據*/
//void write_dat(uchar dat)                               
//{       
//        LCD_RS=1;                                                           //寫
//        LCD_RW=0;                                                           //數據
//        LCD_EN=0;                                                           //選中數據
//        P1=dat;
//        delayms(5);
//        LCD_EN=1;                                                           //寫入數據
//        delayms(5);
//        LCD_EN=0;
//}
//
//

Build target '計算機'
compiling main.c...
MAIN.C(140): warning C291: not every exit path returns a value
linking...
Program Size: data=14.0 xdata=0 code=323
creating hex file from "計算機"...
"計算機" - 0 Error(s), 1 Warning(s).




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-12-6 15:19 | 只看該作者
    static keys;                    //keys定義成為一個靜態全局變量  

少了個 int 吧?  而且,你確定需要用 int 來傳參么? 從你的代碼里真沒看出 int的必要性……
回復

使用道具 舉報

板凳
ID:986164 發表于 2021-12-6 16:43 | 只看該作者
188610329 發表于 2021-12-6 15:19
static keys;                    //keys定義成為一個靜態全局變量  

少了個 int 吧?  而且,你確 ...

不是,變成static int keys;還是不行,而且不用int用a1  keyscan 定義函數有錯誤

回復

使用道具 舉報

地板
ID:624769 發表于 2021-12-6 16:58 | 只看該作者
xzxdbb 發表于 2021-12-6 16:43
不是,變成static int keys;還是不行,而且不用int用a1  keyscan 定義函數有錯誤

1, 我不明白, 既然 這個 keys 是用來return 的,為什么,要static
2, 雖然你的代碼極端混亂,但是我沒看出用int的必要。
3, 不用int,不是應該用char么?  a1 是什么鬼?
回復

使用道具 舉報

5#
ID:213173 發表于 2021-12-6 21:43 | 只看該作者

  1. #include <reg52.h>                   //主函數
  2. #define  uint unsigned int           //宏定義
  3. #define  uchar unsigned char
  4. //#define data P0                      //數據口
  5. sbit LCD_RS =P2^7;                   //并行數據命令選擇控制
  6. sbit LCD_RW =P2^6;                   //并行讀寫控制
  7. sbit LCD_EN =P2^5;                   //并行使能信號
  8. //sbit LCD_PSB=P2^4;                   //并行串行選擇

  9. uchar KeyValue;                    //定義鍵值                                 

  10. void delayms(uint xms)               //延時函數
  11. {
  12.         uint i,j;
  13.         for(i=xms;i>0;i--)//;
  14.                 for(j=110;j>0;j--);
  15. }
  16. /*寫指令數據到LCD*/        
  17. /*RS=H,RW=L,E=高脈沖,D0-D7=指令碼*/
  18. void write_cmd(uchar cmd)                                
  19. {        
  20.         LCD_RS=0;                                                           //寫
  21.         LCD_RW=0;                                                           //指令
  22.         LCD_EN=0;                                                           //選中數據
  23.         P0=cmd;
  24.         delayms(1);                                                   
  25.         LCD_EN=1;                                                           //寫入數據
  26.         delayms(1);
  27.         LCD_EN=0;         
  28. }
  29. /*寫顯示數據到LCD*/
  30. /*RS=H,RW=L,E=高脈沖,D0-D7=數據*/
  31. void write_dat(uchar dat)                                
  32. {        
  33.         LCD_RS=1;                                                           //寫
  34.         LCD_RW=0;                                                           //數據
  35.         LCD_EN=0;                                                           //選中數據
  36.         P0=dat;
  37.         delayms(1);
  38.         LCD_EN=1;                                                           //寫入數據
  39.         delayms(1);
  40.         LCD_EN=0;
  41. }
  42. void init_LCD()
  43. {
  44.         write_cmd(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  45.         write_cmd(0x01);//顯示清零,數據指針清零
  46.         write_cmd(0x0c);//設置開顯示,不顯光標
  47.         write_cmd(0x06);//設置寫一個字符后地址指針加1
  48. }
  49. /******按鍵掃描函數******/
  50. void keyscan()
  51. {
  52.         static uchar count=0;//消抖計數
  53.         static bit sign=0;//按鍵狀態標志
  54.         P1=0xf0;
  55.         if(P1!=0xf0)                                //檢測有按鍵按下
  56.         {
  57.                 if(++count>=5 && sign==0)
  58.                 {                       
  59.                         sign=1;//按鍵狀態標志置1
  60.                         switch(P1)
  61.                         {
  62.                                 case(0Xe0):KeyValue = 1;break;
  63.                                 case(0Xd0):KeyValue = 2;break;
  64.                                 case(0Xb0):KeyValue = 3;break;
  65.                                 case(0X70):KeyValue = 4;break;
  66.                         }
  67.                         P1=0x0f;
  68.                         switch(P1)
  69.                         {
  70.                                 case(0X0e):KeyValue+= 0;break;
  71.                                 case(0X0d):KeyValue+= 4;break;
  72.                                 case(0X0b):KeyValue+= 8;break;
  73.                                 case(0X07):KeyValue+=12;break;
  74.                         }
  75.                         write_cmd(0x80);
  76.                         write_dat(KeyValue/10+'0');
  77.                         write_dat(KeyValue%10+'0');
  78.                 }
  79.         }
  80.         else                                                //鍵抬起
  81.         {
  82.                 sign=0;                                //按鍵狀態標志清0
  83.                 count=0;                                //消抖計數清0
  84.         }
  85. }

  86. /**********主函數**********/
  87. void main()
  88. {
  89.         init_LCD();
  90.         write_cmd(0x80);
  91.         write_dat(KeyValue/10+'0');
  92.         write_dat(KeyValue%10+'0');
  93.         while(1)
  94.         {
  95.                 keyscan();       
  96.                 delayms(5);
  97.         }
  98. }


復制代碼



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区视频在线免费观看 | 久久综合狠狠综合久久 | 一级片毛片 | 欧美色综合一区二区三区 | 欧美在线视频一区 | 亚洲网站在线观看 | 九九综合| 欧美午夜影院 | 亚洲一区导航 | 欧美一区二区三区视频 | 亚洲精品久 | 在线观看av不卡 | 亚洲成人精选 | 久久久久九九九九 | 四虎免费视频 | 男人天堂久久 | 夜夜草 | 亚洲精品一区二区三区在线 | 一区二区三区精品视频 | 美日韩免费视频 | 欧美一区二区三区的 | 欧美激情在线精品一区二区三区 | 国产精品自产拍在线观看蜜 | 影音先锋中文字幕在线观看 | 国产日韩欧美二区 | 亚洲成人av | 亚洲视频区 | 91精品国产乱码久久久久久 | 久草免费在线视频 | 久久精品色欧美aⅴ一区二区 | 成人av播放 | 日韩中文字幕在线免费 | a级免费黄色片 | 丝袜美腿一区二区三区动态图 | 成人在线视频网站 | 国内自拍第一页 | 97色在线观看免费视频 | 日韩免费一级 | 国产精品久久国产精品 | 中日韩毛片 | 国产精品久久久久久久免费观看 |