找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1501|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

幫忙看看下面的程序?yàn)槭裁窗窗存I出不來(lái)數(shù)字

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

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

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

/******按鍵控制函數(shù)******/
int keyscan()                                  
{
        uchar temp;
    static keys;                    //keys定義成為一個(gè)靜態(tài)全局變量                        
        P1=0xfe;                        //(寫)1111 1110將第一行線置低電平,其余行線全為高電平
        temp=P1;                               //(讀)將P3口當(dāng)前的狀態(tài)賦給臨時(shí)變量temp
        temp=temp&0xf0;                        //判斷temp的高四位是否有0
        if(temp!=0xf0)                        //說(shuō)明有第一行的按鍵被按下
        {
                delayms(5);            //按鍵去抖延時(shí)
                temp=P1;                    //進(jìn)行再一次判斷
                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口當(dāng)前的狀態(tài)賦給臨時(shí)變量temp
        temp=temp&0xf0;                          //判斷temp的高四位是否有0
        if(temp!=0xf0)                          //說(shuō)明有第一行的按鍵被按下
        {
                delayms(5);                  //按鍵去抖延時(shí)
                temp=P1;                          //進(jìn)行再一次判斷
                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口當(dāng)前的狀態(tài)賦給臨時(shí)變量temp
        temp=temp&0xf0;                          //判斷temp的高四位是否有0
        if(temp!=0xf0)                          //說(shuō)明有第一行的按鍵被按下
        {
                delayms(5);                  //按鍵去抖延時(shí)
                temp=P1;                          //進(jìn)行再一次判斷
                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口當(dāng)前的狀態(tài)賦給臨時(shí)變量temp
//        temp=temp&0xf0;                          //判斷temp的高四位是否有0
//        if(temp!=0xf0)                          //說(shuō)明有第一行的按鍵被按下
//        {
//                delayms(10);                  //按鍵去抖延時(shí)
//                temp=P1;                          //進(jìn)行再一次判斷
//                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()
//{
//       
//
//
//}
///*寫指令數(shù)據(jù)到LCD*/       
///*RS=H,RW=L,E=高脈沖,D0-D7=指令碼*/
//void write_cmd(uchar cmd)                               
//{       
//        LCD_RS=0;                                                           //寫
//        LCD_RW=0;                                                           //指令
//        LCD_EN=0;                                                           //選中數(shù)據(jù)
//        P1=cmd;
//        delayms(5);                                                  
//        LCD_EN=1;                                                           //寫入數(shù)據(jù)
//        delayms(5);
//        LCD_EN=0;         
//}
///*寫顯示數(shù)據(jù)到LCD*/
///*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)*/
//void write_dat(uchar dat)                               
//{       
//        LCD_RS=1;                                                           //寫
//        LCD_RW=0;                                                           //數(shù)據(jù)
//        LCD_EN=0;                                                           //選中數(shù)據(jù)
//        P1=dat;
//        delayms(5);
//        LCD_EN=1;                                                           //寫入數(shù)據(jù)
//        delayms(5);
//        LCD_EN=0;
//}
//
//

Build target '計(jì)算機(jī)'
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 "計(jì)算機(jī)"...
"計(jì)算機(jī)" - 0 Error(s), 1 Warning(s).




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

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-12-6 15:19 | 只看該作者
    static keys;                    //keys定義成為一個(gè)靜態(tài)全局變量  

少了個(gè) int 吧?  而且,你確定需要用 int 來(lái)傳參么? 從你的代碼里真沒(méi)看出 int的必要性……
回復(fù)

使用道具 舉報(bào)

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

少了個(gè) int 吧?  而且,你確 ...

不是,變成static int keys;還是不行,而且不用int用a1  keyscan 定義函數(shù)有錯(cuò)誤

回復(fù)

使用道具 舉報(bào)

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

1, 我不明白, 既然 這個(gè) keys 是用來(lái)return 的,為什么,要static
2, 雖然你的代碼極端混亂,但是我沒(méi)看出用int的必要。
3, 不用int,不是應(yīng)該用char么?  a1 是什么鬼?
回復(fù)

使用道具 舉報(bào)

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

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

  9. uchar KeyValue;                    //定義鍵值                                 

  10. void delayms(uint xms)               //延時(shí)函數(shù)
  11. {
  12.         uint i,j;
  13.         for(i=xms;i>0;i--)//;
  14.                 for(j=110;j>0;j--);
  15. }
  16. /*寫指令數(shù)據(jù)到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;                                                           //選中數(shù)據(jù)
  23.         P0=cmd;
  24.         delayms(1);                                                   
  25.         LCD_EN=1;                                                           //寫入數(shù)據(jù)
  26.         delayms(1);
  27.         LCD_EN=0;         
  28. }
  29. /*寫顯示數(shù)據(jù)到LCD*/
  30. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)*/
  31. void write_dat(uchar dat)                                
  32. {        
  33.         LCD_RS=1;                                                           //寫
  34.         LCD_RW=0;                                                           //數(shù)據(jù)
  35.         LCD_EN=0;                                                           //選中數(shù)據(jù)
  36.         P0=dat;
  37.         delayms(1);
  38.         LCD_EN=1;                                                           //寫入數(shù)據(jù)
  39.         delayms(1);
  40.         LCD_EN=0;
  41. }
  42. void init_LCD()
  43. {
  44.         write_cmd(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  45.         write_cmd(0x01);//顯示清零,數(shù)據(jù)指針清零
  46.         write_cmd(0x0c);//設(shè)置開(kāi)顯示,不顯光標(biāo)
  47.         write_cmd(0x06);//設(shè)置寫一個(gè)字符后地址指針加1
  48. }
  49. /******按鍵掃描函數(shù)******/
  50. void keyscan()
  51. {
  52.         static uchar count=0;//消抖計(jì)數(shù)
  53.         static bit sign=0;//按鍵狀態(tài)標(biāo)志
  54.         P1=0xf0;
  55.         if(P1!=0xf0)                                //檢測(cè)有按鍵按下
  56.         {
  57.                 if(++count>=5 && sign==0)
  58.                 {                       
  59.                         sign=1;//按鍵狀態(tài)標(biāo)志置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;                                //按鍵狀態(tài)標(biāo)志清0
  83.                 count=0;                                //消抖計(jì)數(shù)清0
  84.         }
  85. }

  86. /**********主函數(shù)**********/
  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. }


復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表