wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

代碼調試高手進!LCD1602液晶屏無顯示

[復制鏈接]
跳轉到指定樓層
樓主
10黑幣
做的關于LCD1602仿手機顯示字符的實驗。
步驟:1、在keil里編譯無誤代碼生成hex文件  2、將hex文件導入proteus原理圖中
原理圖如下:

正常的情況是下圖這種,LCD屏有顯示且按鍵有輸入:


下面是我的代碼(為圖方便,把代碼一股腦寫在一塊了),編譯是沒問題的,但導出的hex導入proteus里,LCD液晶屏不顯示,檢查不出程序哪里出了問題,請各位大佬幫忙看一看:

  1. //-----------------------------------------------------------------
  2. //  名稱: 鍵盤矩陣掃描程序(4*3)
  3. //-----------------------------------------------------------------
  4. #include <reg51.h>
  5. #include <intrins.h>
  6. #define INT8U   unsigned char
  7. #define INT16U  unsigned int
  8. #define KEY_PORT P1        //鍵盤端口定義
  9. INT8U KeyNo = 0xFF;        //當前按鍵序號,有效范圍為0-15,0xFF表示無按鍵
  10. extern void delay_ms(INT16U);
  11. //-----------------------------------------------------------------
  12. // 判斷鍵盤矩陣是否有鍵按下
  13. //-----------------------------------------------------------------
  14. INT8U KeyMatrix_Down()
  15. {
  16.         //高4位輸出,低4位輸入,高4位先置零,放入4行
  17.         KEY_PORT = 0x0F; delay_ms(1); //高4位置零,放入4行
  18.         return KEY_PORT != 0x0F ? 1:0;
  19. }

  20. //-----------------------------------------------------------------
  21. // 4*3鍵盤矩陣掃描
  22. //-----------------------------------------------------------------
  23. void Keys_Scan()
  24. {
  25.         //按鍵后00001111將變成0000XXXX,X中1個位0,3個仍為1
  26.         //判斷按鍵發生于0~3列中的哪一列
  27.         switch (KEY_PORT)
  28.         {        case 0x0E: KeyNo = 0; break;
  29.                 case 0x0D: KeyNo = 1; break;
  30.                 case 0x0B: KeyNo = 2; break;
  31.         }
  32.         KEY_PORT=0xF0; delay_ms(1); //
  33.         //按鍵后11110000將變成XXXX0000,X中1個位0,3個仍為1
  34.         //對0~3行分別附加起始值0,4,8,12
  35.         switch (KEY_PORT)
  36.         {        //下面第一行可省略
  37.         case 0xE0: KeyNo += 0; break;
  38.         case 0xD0: KeyNo += 3; break;
  39.         case 0xB0: KeyNo += 6; break;
  40.         case 0x70: KeyNo += 9;
  41.         }
  42. }
  43. //-----------------------------------------------------------------
  44. //  名稱: 1602LCD顯示仿手機鍵盤按鍵字符
  45. //-----------------------------------------------------------------
  46. //  說明: 按下仿手機矩陣鍵盤按鍵時,對應按鍵字符顯示在1602LCD上
  47. //
  48. //-----------------------------------------------------------------
  49. //#include "LCD1602-4bit.h"

  50. #include <reg51.h>
  51. #include <intrins.h>
  52. #include <string.h>
  53. #define INT8U  unsigned char
  54. #define INT16U unsigned int

  55. sbit SPK = P3^7;
  56. //12個鍵盤按鍵字符總表
  57. //注意串空間應設為6字節,因為最長串為5,設為5時會使部分長串無法附帶串結束標志'\0'
  58. INT8U code Keypad_Chars[12][6] =
  59. {        "1 ",        "2ABC",        "3DEF",
  60.         "4GHI",        "5JKL",        "6MNO",
  61.         "7PQRS","8TUV",        "9WXYZ",
  62.         "*",        "0+",        "#"
  63. };
  64. extern INT8U KeyNo;                //鍵值
  65. INT8U Inner_Idx=0;        //同一按鍵的內部字符索引
  66. INT8U tSpan=0;                //同鍵位連續按鍵的時間間隔
  67. INT8U Buffer_Index=0; //英文/數字輸入緩沖索引
  68. char  Input_Buffer[16]; //輸入緩沖空間
  69. INT8U ENG_TEL=1;                //輸入內容切換標識(ENG:英文輸入,TEL:電話輸入)
  70. extern void delay_ms(INT16U ms);
  71. extern INT8U KeyMatrix_Down();
  72. extern void Keys_Scan();

  73. extern          void Initialize_LCD();                                        //LCD初始化
  74. extern void LCD_ShowString(INT8U r, INT8U c,char *str);//在LCD上顯示字符串*/


  75. #define LCD_PORT P2                //液晶端口(P2高4位)
  76. //LCD引腳定義
  77. sbit RS = P2^0;                        //LCD寄存器選擇
  78. sbit RW = P2^1;                        //LCD讀寫控制
  79. sbit EN = P2^2;                        //LCD使能控制
  80. /*//LCD相關函數
  81. void delay_ms(INT16U x);                                //延時函數
  82. void LCD_Busy_Wait();                                        //忙等待
  83. void Write_LCD_Data(INT8U dat);                        //向LCD寫數據
  84. void Write_LCD_Command(INT8U cmd);                //寫LCD指令
  85. void Initialize_LCD();                                        //LCD初始化
  86. void LCD_ShowString(INT8U r, INT8U c,char *str);//在LCD上顯示字符串*/  
  87. //-----------------------------------------------------------------
  88. //        名稱: LCD1602液晶驅動程序
  89. //-----------------------------------------------------------------
  90. //#include "LCD1602-4bit.h"          
  91. #define delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();}
  92. //-----------------------------------------------------------------
  93. // 延時函數
  94. //-----------------------------------------------------------------
  95. void delay_ms(INT16U x)
  96. {
  97.         INT8U t; while(x--) for(t = 0; t < 120; t++);
  98. }

  99. //-----------------------------------------------------------------
  100. // 液晶忙等待
  101. //-----------------------------------------------------------------
  102. void LCD_Busy_Wait()
  103. {
  104.         INT8U  LCD_Status;                //液晶狀態字節變量
  105.         do
  106.         {
  107.         LCD_PORT=0xFF;
  108.         RS=0; RW=1;
  109.         EN=1; delay5us(); LCD_Status=P2; EN=0;
  110.         }while (LCD_Status & 0x80);                        //液晶忙繼續循環
  111. }
  112. //-----------------------------------------------------------------
  113. // 寫液晶命令
  114. //-----------------------------------------------------------------
  115. void Write_LCD_Command(INT8U cmd)
  116. {        LCD_Busy_Wait();
  117.         RS=0; RW=0;                                                           //選擇命令寄存器,準備寫
  118.         EN=0; _nop_(); _nop_(); LCD_PORT=cmd; //數據送到液晶屏端口
  119.         delay5us(); EN=1; delay5us(); EN=0;           //寫入后禁止液晶屏
  120. }

  121. //-----------------------------------------------------------------
  122. // 向液晶寫數據
  123. //-----------------------------------------------------------------
  124. void Write_LCD_Data(INT8U dat)
  125. {        LCD_Busy_Wait();
  126.         RS=1; RW=0;
  127.         EN=0; LCD_PORT=dat; delay5us();
  128.         EN=1; delay5us(); EN=0;
  129. }
  130. //-----------------------------------------------------------------
  131. // 液晶初始化
  132. //-----------------------------------------------------------------
  133. void Initialize_LCD()
  134. {        Write_LCD_Command(0x38); delay_ms(1);        //置功能,8位,雙行,5*7
  135.         Write_LCD_Command(0x06); delay_ms(1);        //字符進入模式:屏幕不動,字符后移
  136.         Write_LCD_Command(0x0C); delay_ms(1);        //顯示開,關光標
  137.         Write_LCD_Command(0x01); delay_ms(1);        //清屏
  138. }

  139. //-----------------------------------------------------------------
  140. // 在指定位置顯示字符串
  141. //-----------------------------------------------------------------
  142. void LCD_ShowString(INT8U r, INT8U c,char *str)
  143. {
  144.         INT8U i=0;
  145.     INT8U code DDRAM[] = {0x80,0xC0};         //液晶屏上下兩行的DDRAM首地址
  146.         Write_LCD_Command(DDRAM[r] |c);         //設置顯示起始位置
  147.         while (str[i] && i < 16) Write_LCD_Data(str[i++]);//輸出顯示字符
  148. }
  149. //-----------------------------------------------------------------
  150. // 蜂鳴器
  151. //-----------------------------------------------------------------
  152. void Beep()
  153. {
  154.         INT8U i; for(i=0;i<60;i++){SPK=!SPK; delay_ms(1);}
  155.         SPK=1;delay_ms(100);
  156. }

  157. //-----------------------------------------------------------------
  158. // 定時器0跟蹤同位按鍵的時間間隔
  159. //-----------------------------------------------------------------
  160. void T0_INT() interrupt 1
  161. {
  162.         //重新設置50ms定時初值
  163.         TH0=-50000>>8; TL0=-50000&0xFF;
  164.         //tSpan最大值限制在41及以上即可
  165.         //不加限制時會使某次較長的延時累加超過255后,
  166.         //累加又從0開始,而程序判斷時它可能剛好還在40以內,
  167.         //從而導致較長的延時卻被誤斷為較短的延時
  168.         if(tSpan<50) tSpan++;else TR0=0;
  169. }

  170. //-----------------------------------------------------------------
  171. // 功能鍵處理 *(9):切換輸入,#(11)鍵清除內容
  172. //-----------------------------------------------------------------
  173. void Function_Key_Process()
  174. {
  175.         if(KeyNo==9)                                //輸入內容標識切換
  176.         {        ENG_TEL=!ENG_TEL;
  177.                 Inner_Idx=ENG_TEL?1:0;  //如果是輸入英文,內部索引為1,否則設為0               
  178.         }
  179.         Buffer_Index=0;                                //輸入緩沖索引歸0
  180.         Input_Buffer[0]='\0';                //將輸入緩沖設為空串
  181.         if(ENG_TEL)                LCD_ShowString(1,0,"ENG>        ");          //顯示輸入英文
  182.         else            LCD_ShowString(1,0,"TEL>        ");          //顯示輸入電話
  183.         while(KeyMatrix_Down());                                                  //等待釋放按鍵
  184. }

  185. //-----------------------------------------------------------------
  186. // 主程序
  187. //-----------------------------------------------------------------
  188. void main()
  189. {
  190.         INT8U Pre_KeyNo=-1;
  191.         IE=0x82;                                 //使能T0中斷
  192.         TMOD=0x01;                                 //T0工作于模式1(16位模式)
  193.         TH0=-50000>>8;                         //定時50ms
  194.         TL0=-50000&0xFF;
  195.         Initialize_LCD();        //液晶初始化
  196.         //顯示固定信息部分(初始顯示ENG>表示輸入英文字符序列)
  197.         LCD_ShowString(0,0," Mobile KeyPad ");
  198.         LCD_ShowString(1,0,"ENG>                ");
  199.         while(1)
  200.         {        //有鍵按下則掃描,否則不進行任何處理
  201.                 if(KeyMatrix_Down()) Keys_Scan();else continue;
  202.                 if(KeyNo==0xFF) continue;
  203.                 //功能鍵處理(9[*]:切換英文/數字,11[#]:清除所有輸入)
  204.                 if(KeyNo==9 || KeyNo == 11)
  205.                 {        Function_Key_Process(); Beep(); continue; }
  206.                 //如果是輸入數字則直接顯示
  207.                 if(!ENG_TEL) goto SHOW_MOBILE_KEY;
  208.                 //如果輸入的不是英文字母則繼續(英文字符在0~8號鍵,包括空格)
  209.                 if(KeyNo<0 || KeyNo>8) continue;
  210.                 //否則輸入的是英文字符序列,以下代碼將根據是否為同位按鍵進行相應處理
  211.                 if(Pre_KeyNo != KeyNo)         //按下新按鍵
  212.                 {        Pre_KeyNo = KeyNo;         //保存當前按鍵
  213.                         Inner_Idx = 1;                 //輸入英文時內部索引起點為1
  214.                 }
  215.                 else //否則按下的時相同位置按鍵
  216.                 {        //同位按鍵時間間隔在50ms*30=1.5s內則認為是連續按鍵
  217.                         if(tSpan<31)
  218.                         {        //連續按鍵時在鍵內循環遞增字符索引
  219.                                 if (++Inner_Idx == strlen(Keypad_Chars[KeyNo]))
  220.                                 Inner_Idx=1;
  221.                                 //因為是連續短按,故將每次顯示后遞增的輸入緩沖索引后退一格,
  222.                                 //以便替換此前輸入的字符
  223.                                 --Buffer_Index;
  224.                         } else Inner_Idx = 1; //否則按鍵內英文字符索引回歸起點索引1
  225.                 }
  226.                 tSpan=0; TR0=1;                         //時間間隔歸零,計時開始
  227.                 SHOW_MOBILE_KEY:                 //顯示按鍵字符
  228.                 if(Buffer_Index >= 12) continue; //輸入緩沖限制在12個字符以內
  229.                 //更新輸入緩沖字符串并送LCD顯示
  230.                 Input_Buffer[Buffer_Index++] = Keypad_Chars[KeyNo][Inner_Idx];
  231.                 Input_Buffer[Buffer_Index] = '\0';
  232.                 LCD_ShowString(1,4,Input_Buffer);
  233.                 Beep();                                         //輸出提示音
  234.                 while(KeyMatrix_Down()); //等待釋放按鍵
  235.         }
  236. }
復制代碼
附上原理圖,可在proteus中打開
1602LCD顯示仿手機鍵盤按鍵字符.zip (16.37 KB, 下載次數: 15)


最佳答案

查看完整內容

給你改了,對比一下就知道哪里錯了。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:155507 發表于 2019-5-13 20:49 | 只看該作者
給你改了,對比一下就知道哪里錯了。



  1. //-----------------------------------------------------------------
  2. //  名稱: 鍵盤矩陣掃描程序(4*3)
  3. //-----------------------------------------------------------------
  4. #include <reg51.h>
  5. #include <intrins.h>
  6. #define INT8U   unsigned char
  7. #define INT16U  unsigned int
  8. #define KEY_PORT P1        //鍵盤端口定義
  9. INT8U KeyNo = 0xFF;        //當前按鍵序號,有效范圍為0-15,0xFF表示無按鍵
  10. extern void delay_ms(INT16U);
  11. //-----------------------------------------------------------------
  12. // 判斷鍵盤矩陣是否有鍵按下
  13. //-----------------------------------------------------------------
  14. INT8U KeyMatrix_Down()
  15. {
  16.         //高4位輸出,低4位輸入,高4位先置零,放入4行
  17.         KEY_PORT = 0x0F; delay_ms(1); //高4位置零,放入4行
  18.         return KEY_PORT != 0x0F ? 1:0;
  19. }

  20. //-----------------------------------------------------------------
  21. // 4*3鍵盤矩陣掃描
  22. //-----------------------------------------------------------------
  23. void Keys_Scan()
  24. {
  25.         //按鍵后00001111將變成0000XXXX,X中1個位0,3個仍為1
  26.         //判斷按鍵發生于0~3列中的哪一列
  27.         switch (KEY_PORT)
  28.         {
  29.         case 0x0E: KeyNo = 0; break;
  30.         case 0x0D: KeyNo = 1; break;
  31.         case 0x0B: KeyNo = 2; break;
  32.         }
  33.         KEY_PORT=0xF0; delay_ms(1); //
  34.         //按鍵后11110000將變成XXXX0000,X中1個位0,3個仍為1
  35.         //對0~3行分別附加起始值0,4,8,12
  36.         switch (KEY_PORT)
  37.         {        //下面第一行可省略
  38.         case 0xE0: KeyNo += 0; break;
  39.         case 0xD0: KeyNo += 3; break;
  40.         case 0xB0: KeyNo += 6; break;
  41.         case 0x70: KeyNo += 9;
  42.         }
  43. }
  44. //-----------------------------------------------------------------
  45. //  名稱: 1602LCD顯示仿手機鍵盤按鍵字符
  46. //-----------------------------------------------------------------
  47. //  說明: 按下仿手機矩陣鍵盤按鍵時,對應按鍵字符顯示在1602LCD上
  48. //
  49. //-----------------------------------------------------------------
  50. //#include "LCD1602-4bit.h"

  51. #include <reg51.h>
  52. #include <intrins.h>
  53. #include <string.h>
  54. #define INT8U  unsigned char
  55. #define INT16U unsigned int

  56. sbit SPK = P3^7;
  57. //12個鍵盤按鍵字符總表
  58. //注意串空間應設為6字節,因為最長串為5,設為5時會使部分長串無法附帶串結束標志'\0'
  59. INT8U code Keypad_Chars[12][6] =
  60. {
  61.         "1 ",        "2ABC",        "3DEF",
  62.         "4GHI",        "5JKL",        "6MNO",
  63.         "7PQRS","8TUV",        "9WXYZ",
  64.         "*",        "0+",        "#"
  65. };
  66. extern INT8U KeyNo;       //鍵值
  67. INT8U Inner_Idx=0;        //同一按鍵的內部字符索引
  68. INT8U tSpan=0;            //同鍵位連續按鍵的時間間隔
  69. INT8U Buffer_Index=0;     //英文/數字輸入緩沖索引
  70. char  Input_Buffer[16];   //輸入緩沖空間
  71. INT8U ENG_TEL=1;          //輸入內容切換標識(ENG:英文輸入,TEL:電話輸入)
  72. extern void delay_ms(INT16U ms);
  73. extern INT8U KeyMatrix_Down();
  74. extern void Keys_Scan();

  75. extern void Initialize_LCD();                                        //LCD初始化
  76. extern void LCD_ShowString(INT8U r, INT8U c,char *str);  //在LCD上顯示字符串*/


  77. #define LCD_PORT P2                //液晶端口(P2高4位)
  78. //LCD引腳定義
  79. sbit RS = P3^2;                        //LCD寄存器選擇
  80. sbit RW = P3^3;                        //LCD讀寫控制
  81. sbit EN = P3^4;                        //LCD使能控制
  82. /*//LCD相關函數
  83. void delay_ms(INT16U x);                          //延時函數
  84. void LCD_Busy_Wait();                             //忙等待
  85. void Write_LCD_Data(INT8U dat);                   //向LCD寫數據
  86. void Write_LCD_Command(INT8U cmd);                //寫LCD指令
  87. void Initialize_LCD();                            //LCD初始化
  88. void LCD_ShowString(INT8U r, INT8U c,char *str);  //在LCD上顯示字符串*/  
  89. //-----------------------------------------------------------------
  90. //        名稱: LCD1602液晶驅動程序
  91. //-----------------------------------------------------------------
  92. //#include "LCD1602-4bit.h"         
  93. #define delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();}
  94. //-----------------------------------------------------------------
  95. // 延時函數
  96. //-----------------------------------------------------------------
  97. void delay_ms(INT16U x)
  98. {
  99.         INT8U t;  while(x--) for(t = 0; t < 120; t++);
  100. }

  101. //-----------------------------------------------------------------
  102. // 液晶忙等待
  103. //-----------------------------------------------------------------
  104. /*
  105. void LCD_Busy_Wait()
  106. {
  107.         INT8U  LCD_Status;                //液晶狀態字節變量
  108.         do
  109.         {
  110.                 LCD_PORT=0xFF;
  111.                 RS=0; RW=1;
  112.                 EN=1; delay5us(); LCD_Status=P2; EN=0;
  113.         }while (LCD_Status & 0x80);               //液晶忙繼續循環
  114. } */
  115. //-----------------------------------------------------------------
  116. // 寫液晶命令
  117. //-----------------------------------------------------------------
  118. void Write_LCD_Command(INT8U cmd)
  119. {
  120.         //LCD_Busy_Wait();
  121.         EN = 0;          //使能清零       
  122.         RS=0; RW=0;                                                           //選擇命令寄存器,準備寫
  123.         EN=0; _nop_(); _nop_();
  124.     //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  125.         LCD_PORT=cmd;      //數據送到液晶屏端口
  126.         delay_ms(1);
  127.         EN=1;   //寫入時序
  128.         delay_ms(1); EN=0;        //寫入后禁止液晶屏
  129.         LCD_PORT= cmd << 4; //寫入低四位
  130.         EN=1;   //寫入時序
  131.         delay_ms(1); EN=0;
  132.        
  133. }

  134. //-----------------------------------------------------------------
  135. // 向液晶寫數據
  136. //-----------------------------------------------------------------
  137. void Write_LCD_Data(INT8U dat)
  138. {
  139.         //LCD_Busy_Wait();
  140.         EN = 0;          //使能清零
  141.         RS=1; RW=0;
  142.         EN=0;
  143.         LCD_PORT=dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  144.         delay_ms(1);
  145.         EN=1;   //寫入時序
  146.         delay_ms(1); EN=0;
  147.         LCD_PORT= dat << 4; //寫入低四位
  148.         EN=1;   //寫入時序
  149.         delay_ms(1); EN=0;

  150. }
  151. //-----------------------------------------------------------------
  152. // 液晶初始化
  153. //-----------------------------------------------------------------
  154. void Initialize_LCD()
  155. {
  156.         //Write_LCD_Command(0x38); delay_ms(1);        //置功能,8位,雙行,5*7
  157.         Write_LCD_Command(0x32); delay_ms(1);        //將8位總線轉為4位總線
  158.         Write_LCD_Command(0x28); delay_ms(1);        // 在四位線下的初始化
  159.         Write_LCD_Command(0x06); delay_ms(1);        //字符進入模式:屏幕不動,字符后移
  160.         Write_LCD_Command(0x0C); delay_ms(1);        //顯示開,關光標
  161.         Write_LCD_Command(0x01); delay_ms(1);        //清屏
  162. }

  163. //-----------------------------------------------------------------
  164. // 在指定位置顯示字符串
  165. //-----------------------------------------------------------------
  166. void LCD_ShowString(INT8U r, INT8U c,char *str)
  167. {
  168.         INT8U i=0;
  169.         INT8U code DDRAM[] = {0x80,0xC0};         //液晶屏上下兩行的DDRAM首地址
  170.         Write_LCD_Command(DDRAM[r] |c);         //設置顯示起始位置
  171.         while (str[i] && i < 16) Write_LCD_Data(str[i++]);//輸出顯示字符
  172. }
  173. //-----------------------------------------------------------------
  174. // 蜂鳴器
  175. //-----------------------------------------------------------------
  176. void Beep()
  177. {
  178.         INT8U i; for(i=0;i<60;i++){SPK=!SPK; delay_ms(1);}
  179.         SPK=1;delay_ms(100);
  180. }

  181. //-----------------------------------------------------------------
  182. // 定時器0跟蹤同位按鍵的時間間隔
  183. //-----------------------------------------------------------------
  184. void T0_INT() interrupt 1
  185. {
  186.         //重新設置50ms定時初值
  187.         TH0=-50000>>8; TL0=-50000&0xFF;
  188.         //tSpan最大值限制在41及以上即可
  189.         //不加限制時會使某次較長的延時累加超過255后,
  190.         //累加又從0開始,而程序判斷時它可能剛好還在40以內,
  191.         //從而導致較長的延時卻被誤斷為較短的延時
  192.         if(tSpan<50) tSpan++;else TR0=0;
  193. }

  194. //-----------------------------------------------------------------
  195. // 功能鍵處理 *(9):切換輸入,#(11)鍵清除內容
  196. //-----------------------------------------------------------------
  197. void Function_Key_Process()
  198. {
  199.         if(KeyNo==9)                         //輸入內容標識切換
  200.         {        ENG_TEL=!ENG_TEL;
  201.                 Inner_Idx=ENG_TEL?1:0;  //如果是輸入英文,內部索引為1,否則設為0               
  202.         }
  203.         Buffer_Index=0;                      //輸入緩沖索引歸0
  204.         Input_Buffer[0]='\0';                //將輸入緩沖設為空串
  205.         if(ENG_TEL)     LCD_ShowString(1,0,"ENG>        ");          //顯示輸入英文
  206.         else            LCD_ShowString(1,0,"TEL>        ");          //顯示輸入電話
  207.         while(KeyMatrix_Down());                                     //等待釋放按鍵
  208. }

  209. //-----------------------------------------------------------------
  210. // 主程序
  211. //-----------------------------------------------------------------
  212. void main()
  213. {
  214.         INT8U Pre_KeyNo=-1;
  215.         IE=0x82;                               //使能T0中斷
  216.         TMOD=0x01;                             //T0工作于模式1(16位模式)
  217.         TH0=-50000>>8;                         //定時50ms
  218.         TL0=-50000&0xFF;
  219.         Initialize_LCD();        //液晶初始化
  220.         //顯示固定信息部分(初始顯示ENG>表示輸入英文字符序列)
  221.         LCD_ShowString(0,0," Mobile KeyPad ");
  222.         LCD_ShowString(1,0,"ENG>                ");
  223.         while(1)
  224.         {        //有鍵按下則掃描,否則不進行任何處理
  225.                 if(KeyMatrix_Down()) Keys_Scan();else continue;
  226.                 if(KeyNo==0xFF) continue;
  227.                 //功能鍵處理(9[*]:切換英文/數字,11[#]:清除所有輸入)
  228.                 if(KeyNo==9 || KeyNo == 11)
  229.                 {        Function_Key_Process(); Beep(); continue; }
  230.                 //如果是輸入數字則直接顯示
  231.                 if(!ENG_TEL) goto SHOW_MOBILE_KEY;
  232.                 //如果輸入的不是英文字母則繼續(英文字符在0~8號鍵,包括空格)
  233.                 if(KeyNo<0 || KeyNo>8) continue;
  234.                 //否則輸入的是英文字符序列,以下代碼將根據是否為同位按鍵進行相應處理
  235.                 if(Pre_KeyNo != KeyNo)         //按下新按鍵
  236.                 {        Pre_KeyNo = KeyNo;         //保存當前按鍵
  237.                         Inner_Idx = 1;                 //輸入英文時內部索引起點為1
  238.                 }
  239.                 else //否則按下的時相同位置按鍵
  240.                 {        //同位按鍵時間間隔在50ms*30=1.5s內則認為是連續按鍵
  241.                         if(tSpan<31)
  242.                         {        //連續按鍵時在鍵內循環遞增字符索引
  243.                                 if (++Inner_Idx == strlen(Keypad_Chars[KeyNo]))
  244.                                 Inner_Idx=1;
  245.                                 //因為是連續短按,故將每次顯示后遞增的輸入緩沖索引后退一格,
  246.                                 //以便替換此前輸入的字符
  247.                                 --Buffer_Index;
  248.                         } else Inner_Idx = 1; //否則按鍵內英文字符索引回歸起點索引1
  249.                 }
  250.                 tSpan=0; TR0=1;                         //時間間隔歸零,計時開始
  251.                 SHOW_MOBILE_KEY:                 //顯示按鍵字符
  252.                 if(Buffer_Index >= 12) continue; //輸入緩沖限制在12個字符以內
  253.                 //更新輸入緩沖字符串并送LCD顯示
  254.                 Input_Buffer[Buffer_Index++] = Keypad_Chars[KeyNo][Inner_Idx];
  255.                 Input_Buffer[Buffer_Index] = '\0';
  256.                 LCD_ShowString(1,4,Input_Buffer);
  257.                 Beep();                                         //輸出提示音
  258.                 while(KeyMatrix_Down()); //等待釋放按鍵
  259.         }
  260. }

復制代碼

評分

參與人數 1黑幣 +8 收起 理由
劃船須劃水 + 8 很給力!

查看全部評分

回復

使用道具 舉報

板凳
ID:149451 發表于 2019-5-14 07:24 | 只看該作者
大致看了下,你的lcd1602驅動貌似是并口的,但proteus圖示是4線式(穿行數據輸入)程序同時控制端也用的是P2口,有點亂

評分

參與人數 1黑幣 +2 收起 理由
劃船須劃水 + 2 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:536476 發表于 2019-5-14 09:07 | 只看該作者
w1179benp 發表于 2019-5-14 07:24
大致看了下,你的lcd1602驅動貌似是并口的,但proteus圖示是4線式(穿行數據輸入)程序同時控制端也用的是P ...

大佬,所以說有什么解決辦法么
回復

使用道具 舉報

5#
ID:514919 發表于 2019-5-14 14:52 | 只看該作者
#include "STC15.H" #include "lcd1602.h" #include "ds1302.h" //#include"clock.h" SYSTEMTIME timer; /*************************************** main() ***************************************/ void main() {         P0M1=0;P0M0=0;         P1M1=0;P1M0=0;         P2M1=0;P2M0=0;         P3M1=0;P3M0=0;         lcd_initial();         ds1302_init();         while(1)         {                                     Ds1302_Read_Time(&timer);                    LCD_Write_Char(5,1,timer.Hour/10 + '0');        //ê±                         LCD_Write_Char(6,1,timer.Hour%10 + '0');                          LCD_Write_Char(8,1,timer.Minute/10 + '0');        //·Ö                         LCD_Write_Char(9,1,timer.Minute%10 + '0');                          LCD_Write_Char(11,1,timer.Second/10 + '0');        //Ãë                         LCD_Write_Char(12,1,timer.Second%10 + '0');                                    LCD_Write_Char(7,0,timer.Year/10  + '0');        //Äê                         LCD_Write_Char(8,0,timer.Year%10 + '0');                          LCD_Write_Char(10,0,timer.Month/10 + '0');        //ÔÂ                         LCD_Write_Char(11,0,timer.Month%10 + '0');                          LCD_Write_Char(13,0,timer.Day /10 + '0');        //èÕ                         LCD_Write_Char(14,0,timer.Day %10 + '0');         } },有個類似的程序,可以看看
回復

使用道具 舉報

6#
ID:155507 發表于 2019-5-15 23:52 | 只看該作者
4線式LCD程序同時控制端也用的是P2口

  1. //-----------------------------------------------------------------
  2. //  名稱: 鍵盤矩陣掃描程序(4*3)
  3. //-----------------------------------------------------------------
  4. #include <reg51.h>
  5. #include <intrins.h>
  6. #define INT8U   unsigned char
  7. #define INT16U  unsigned int
  8. #define KEY_PORT P1        //鍵盤端口定義
  9. INT8U KeyNo = 0xFF;        //當前按鍵序號,有效范圍為0-15,0xFF表示無按鍵
  10. extern void delay_ms(INT16U);
  11. //-----------------------------------------------------------------
  12. // 判斷鍵盤矩陣是否有鍵按下
  13. //-----------------------------------------------------------------
  14. INT8U KeyMatrix_Down()
  15. {
  16.         //高4位輸出,低4位輸入,高4位先置零,放入4行
  17.         KEY_PORT = 0x0F; delay_ms(1); //高4位置零,放入4行
  18.         return KEY_PORT != 0x0F ? 1:0;
  19. }

  20. //-----------------------------------------------------------------
  21. // 4*3鍵盤矩陣掃描
  22. //-----------------------------------------------------------------
  23. void Keys_Scan()
  24. {
  25.         //按鍵后00001111將變成0000XXXX,X中1個位0,3個仍為1
  26.         //判斷按鍵發生于0~3列中的哪一列
  27.         switch (KEY_PORT)
  28.         {
  29.         case 0x0E: KeyNo = 0; break;
  30.         case 0x0D: KeyNo = 1; break;
  31.         case 0x0B: KeyNo = 2; break;
  32.         }
  33.         KEY_PORT=0xF0; delay_ms(1); //
  34.         //按鍵后11110000將變成XXXX0000,X中1個位0,3個仍為1
  35.         //對0~3行分別附加起始值0,4,8,12
  36.         switch (KEY_PORT)
  37.         {        //下面第一行可省略
  38.         case 0xE0: KeyNo += 0; break;
  39.         case 0xD0: KeyNo += 3; break;
  40.         case 0xB0: KeyNo += 6; break;
  41.         case 0x70: KeyNo += 9;
  42.         }
  43. }
  44. //-----------------------------------------------------------------
  45. //  名稱: 1602LCD顯示仿手機鍵盤按鍵字符
  46. //-----------------------------------------------------------------
  47. //  說明: 按下仿手機矩陣鍵盤按鍵時,對應按鍵字符顯示在1602LCD上
  48. //
  49. //-----------------------------------------------------------------
  50. //#include "LCD1602-4bit.h"

  51. #include <reg51.h>
  52. #include <intrins.h>
  53. #include <string.h>
  54. #define INT8U  unsigned char
  55. #define INT16U unsigned int

  56. sbit SPK = P3^7;
  57. //12個鍵盤按鍵字符總表
  58. //注意串空間應設為6字節,因為最長串為5,設為5時會使部分長串無法附帶串結束標志'\0'
  59. INT8U code Keypad_Chars[12][6] =
  60. {
  61.         "1 ",        "2ABC",        "3DEF",
  62.         "4GHI",        "5JKL",        "6MNO",
  63.         "7PQRS","8TUV",        "9WXYZ",
  64.         "*",        "0+",        "#"
  65. };
  66. extern INT8U KeyNo;       //鍵值
  67. INT8U Inner_Idx=0;        //同一按鍵的內部字符索引
  68. INT8U tSpan=0;            //同鍵位連續按鍵的時間間隔
  69. INT8U Buffer_Index=0;     //英文/數字輸入緩沖索引
  70. char  Input_Buffer[16];   //輸入緩沖空間
  71. INT8U ENG_TEL=1;          //輸入內容切換標識(ENG:英文輸入,TEL:電話輸入)
  72. extern void delay_ms(INT16U ms);
  73. extern INT8U KeyMatrix_Down();
  74. extern void Keys_Scan();

  75. extern void Initialize_LCD();                                        //LCD初始化
  76. extern void LCD_ShowString(INT8U r, INT8U c,char *str);  //在LCD上顯示字符串*/
  77. //是4線式(穿行數據輸入)程序
  78. //程序同時控制端也用的是P2口
  79. #define LCD_PORT P2                //液晶端口(P2高4位)
  80. //LCD引腳定義
  81. sbit RS = P2^0;                        //LCD寄存器選擇
  82. sbit RW = P2^1;                        //LCD讀寫控制
  83. sbit EN = P2^2;                        //LCD使能控制
  84. //sbit RS = P3^2;                        //LCD寄存器選擇
  85. //sbit RW = P3^3;                        //LCD讀寫控制
  86. //sbit EN = P3^4;                        //LCD使能控制
  87. /*//LCD相關函數
  88. void delay_ms(INT16U x);                          //延時函數
  89. void LCD_Busy_Wait();                             //忙等待
  90. void Write_LCD_Data(INT8U dat);                   //向LCD寫數據
  91. void Write_LCD_Command(INT8U cmd);                //寫LCD指令
  92. void Initialize_LCD();                            //LCD初始化
  93. void LCD_ShowString(INT8U r, INT8U c,char *str);  //在LCD上顯示字符串*/  
  94. //-----------------------------------------------------------------
  95. //        名稱: LCD1602液晶驅動程序
  96. //-----------------------------------------------------------------
  97. //#include "LCD1602-4bit.h"         
  98. #define delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();}
  99. //-----------------------------------------------------------------
  100. // 延時函數
  101. //-----------------------------------------------------------------
  102. void delay_ms(INT16U x)
  103. {
  104.         INT8U t;  while(x--) for(t = 0; t < 120; t++);
  105. }

  106. //-----------------------------------------------------------------
  107. // 液晶忙等待
  108. //-----------------------------------------------------------------
  109. /*
  110. void LCD_Busy_Wait()
  111. {
  112.         INT8U  LCD_Status;                //液晶狀態字節變量
  113.         do
  114.         {
  115.                 LCD_PORT=0xFF;
  116.                 RS=0; RW=1;
  117.                 EN=1; delay5us(); LCD_Status=P2; EN=0;
  118.         }while (LCD_Status & 0x80);               //液晶忙繼續循環
  119. } */
  120. //-----------------------------------------------------------------
  121. // 寫液晶命令
  122. //-----------------------------------------------------------------
  123. void Write_LCD_Command(INT8U cmd)
  124. {
  125.         INT8U  Temp1, Temp2;
  126.         //LCD_Busy_Wait();
  127.         EN = 0;          //使能清零       
  128.         RS=0; RW=0;                                                           //選擇命令寄存器,準備寫
  129.         EN=0; _nop_(); _nop_();
  130.         //由于4位的接線是接到LCD_PORT口的高四位,所以傳送高四位不用改
  131.         Temp1 = LCD_PORT&0x0f;
  132.         Temp2= (cmd&0xf0);
  133.         LCD_PORT= (Temp2|Temp1);      //數據送到液晶屏端口
  134.         delay_ms(1);
  135.         EN=1;   //寫入時序
  136.         delay_ms(1); EN=0;        //寫入后禁止液晶屏
  137.         Temp2= (cmd << 4);
  138.         Temp2&=0xf0;
  139.         LCD_PORT= (Temp2|Temp1); //寫入低四位
  140.         EN=1;   //寫入時序
  141.         delay_ms(1); EN=0;

  142.        
  143. }

  144. //-----------------------------------------------------------------
  145. // 向液晶寫數據
  146. //-----------------------------------------------------------------
  147. void Write_LCD_Data(INT8U dat)
  148. {
  149.         INT8U  Temp1, Temp2;
  150.         //LCD_Busy_Wait();
  151.         EN = 0;          //使能清零
  152.         RS=1; RW=0;
  153.         EN=0;
  154.         Temp1 = LCD_PORT&0x0f;
  155.         Temp2= (dat&0xf0);  //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  156.         LCD_PORT=(Temp2|Temp1);    //數據送到液晶屏端口
  157.         delay_ms(1);
  158.         EN=1;   //寫入時序
  159.         delay_ms(1); EN=0;
  160.         Temp2= (dat << 4);
  161.         Temp2&=0xf0;
  162.         LCD_PORT = (Temp2|Temp1); //寫入低四位
  163.         EN=1;   //寫入時序
  164.         delay_ms(1); EN=0;

  165.        
  166. }
  167. //-----------------------------------------------------------------
  168. // 液晶初始化
  169. //-----------------------------------------------------------------
  170. void Initialize_LCD()
  171. {
  172.         //Write_LCD_Command(0x38); delay_ms(1);        //置功能,8位,雙行,5*7
  173.         Write_LCD_Command(0x32); delay_ms(1);        //將8位總線轉為4位總線
  174.         Write_LCD_Command(0x28); delay_ms(1);        // 在四位線下的初始化
  175.         Write_LCD_Command(0x06); delay_ms(1);        //字符進入模式:屏幕不動,字符后移
  176.         Write_LCD_Command(0x0C); delay_ms(1);        //顯示開,關光標
  177.         Write_LCD_Command(0x01); delay_ms(1);        //清屏
  178. }

  179. //-----------------------------------------------------------------
  180. // 在指定位置顯示字符串
  181. //-----------------------------------------------------------------
  182. void LCD_ShowString(INT8U r, INT8U c,char *str)
  183. {
  184.         INT8U i=0;
  185.         INT8U code DDRAM[] = {0x80,0xC0};         //液晶屏上下兩行的DDRAM首地址
  186.         Write_LCD_Command(DDRAM[r] |c);         //設置顯示起始位置
  187.         while (str[i] && i < 16) Write_LCD_Data(str[i++]);//輸出顯示字符
  188. }
  189. //-----------------------------------------------------------------
  190. // 蜂鳴器
  191. //-----------------------------------------------------------------
  192. void Beep()
  193. {
  194.         INT8U i; for(i=0;i<60;i++){SPK=!SPK; delay_ms(1);}
  195.         SPK=1;delay_ms(100);
  196. }

  197. //-----------------------------------------------------------------
  198. // 定時器0跟蹤同位按鍵的時間間隔
  199. //-----------------------------------------------------------------
  200. void T0_INT() interrupt 1
  201. {
  202.         //重新設置50ms定時初值
  203.         TH0=-50000>>8; TL0=-50000&0xFF;
  204.         //tSpan最大值限制在41及以上即可
  205.         //不加限制時會使某次較長的延時累加超過255后,
  206.         //累加又從0開始,而程序判斷時它可能剛好還在40以內,
  207.         //從而導致較長的延時卻被誤斷為較短的延時
  208.         if(tSpan<50) tSpan++;else TR0=0;
  209. }

  210. //-----------------------------------------------------------------
  211. // 功能鍵處理 *(9):切換輸入,#(11)鍵清除內容
  212. //-----------------------------------------------------------------
  213. void Function_Key_Process()
  214. {
  215.         if(KeyNo==9)                         //輸入內容標識切換
  216.         {        ENG_TEL=!ENG_TEL;
  217.                 Inner_Idx=ENG_TEL?1:0;  //如果是輸入英文,內部索引為1,否則設為0               
  218.         }
  219.         Buffer_Index=0;                      //輸入緩沖索引歸0
  220.         Input_Buffer[0]='\0';                //將輸入緩沖設為空串
  221.         if(ENG_TEL)     LCD_ShowString(1,0,"ENG>        ");          //顯示輸入英文
  222.         else            LCD_ShowString(1,0,"TEL>        ");          //顯示輸入電話
  223.         while(KeyMatrix_Down());                                     //等待釋放按鍵
  224. }

  225. //-----------------------------------------------------------------
  226. // 主程序
  227. //-----------------------------------------------------------------
  228. void main()
  229. {
  230.         INT8U Pre_KeyNo=-1;
  231.         IE=0x82;                               //使能T0中斷
  232.         TMOD=0x01;                             //T0工作于模式1(16位模式)
  233.         TH0=-50000>>8;                         //定時50ms
  234.         TL0=-50000&0xFF;
  235.         Initialize_LCD();        //液晶初始化
  236.         //顯示固定信息部分(初始顯示ENG>表示輸入英文字符序列)
  237.         LCD_ShowString(0,0," Mobile KeyPad ");
  238.         LCD_ShowString(1,0,"ENG>                ");
  239.         while(1)
  240.         {        //有鍵按下則掃描,否則不進行任何處理
  241.                 if(KeyMatrix_Down()) Keys_Scan();else continue;
  242.                 if(KeyNo==0xFF) continue;
  243.                 //功能鍵處理(9[*]:切換英文/數字,11[#]:清除所有輸入)
  244.                 if(KeyNo==9 || KeyNo == 11)
  245.                 {        Function_Key_Process(); Beep(); continue; }
  246.                 //如果是輸入數字則直接顯示
  247.                 if(!ENG_TEL) goto SHOW_MOBILE_KEY;
  248.                 //如果輸入的不是英文字母則繼續(英文字符在0~8號鍵,包括空格)
  249.                 if(KeyNo<0 || KeyNo>8) continue;
  250.                 //否則輸入的是英文字符序列,以下代碼將根據是否為同位按鍵進行相應處理
  251.                 if(Pre_KeyNo != KeyNo)         //按下新按鍵
  252.                 {        Pre_KeyNo = KeyNo;         //保存當前按鍵
  253.                         Inner_Idx = 1;                 //輸入英文時內部索引起點為1
  254.                 }
  255.                 else //否則按下的時相同位置按鍵
  256.                 {        //同位按鍵時間間隔在50ms*30=1.5s內則認為是連續按鍵
  257.                         if(tSpan<31)
  258.                         {        //連續按鍵時在鍵內循環遞增字符索引
  259.                                 if (++Inner_Idx == strlen(Keypad_Chars[KeyNo]))
  260.                                 Inner_Idx=1;
  261.                                 //因為是連續短按,故將每次顯示后遞增的輸入緩沖索引后退一格,
  262.                                 //以便替換此前輸入的字符
  263.                                 --Buffer_Index;
  264.                         } else Inner_Idx = 1; //否則按鍵內英文字符索引回歸起點索引1
  265.                 }
  266.                 tSpan=0; TR0=1;                         //時間間隔歸零,計時開始
  267.                 SHOW_MOBILE_KEY:                 //顯示按鍵字符
  268.                 if(Buffer_Index >= 12) continue; //輸入緩沖限制在12個字符以內
  269.                 //更新輸入緩沖字符串并送LCD顯示
  270.                 Input_Buffer[Buffer_Index++] = Keypad_Chars[KeyNo][Inner_Idx];
  271.                 Input_Buffer[Buffer_Index] = '\0';
  272.                 LCD_ShowString(1,4,Input_Buffer);
  273.                 Beep();                                         //輸出提示音
  274.                 while(KeyMatrix_Down()); //等待釋放按鍵
  275.         }
  276. }

復制代碼
回復

使用道具 舉報

7#
ID:55211 發表于 2019-5-16 00:22 | 只看該作者
回復

使用道具 舉報

8#
ID:162037 發表于 2023-6-19 14:39 | 只看該作者
#define LCD_PORT P2                //液晶端口(P2高4位)這里宏定義錯了,應該是:#define LCD_PORT P0                //液晶端口(P0高4位)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
久久xxxx| 在线免费看av不卡| 亚洲免费伊人电影| 疯狂做受xxxx高潮欧美日本| 欧美一级日韩一级| 欧美激情奇米色| 国产精品嫩草在线观看| 青青草精品视频在线| 拔插拔插华人永久免费| 国产精品不卡av| 天堂网在线观看视频| 可以直接看的av网址站| 你懂的免费在线观看| 日韩精品99| 97久久视频| 国产91丝袜在线播放| 欧美日韩亚洲国产一区| 久久777国产线看观看精品| 国产一区二区在线观看免费播放| 可以在线看的av网站| 中文字幕av久久爽一区| 天天爱天天干天天操| 免费动漫网站在线观看| 国产在线视频你懂得| 国产拍欧美日韩视频二区| 色爱综合av| 美国一区二区三区在线播放| 成人免费小视频| 国产亚洲aⅴaaaaaa毛片| 国产伦精品一区二区三区照片91 | 毛片毛片毛片毛片毛| aa在线免费观看| 天天综合网久久综合网| 黄色毛片网站| 91av亚洲| 美女mm1313爽爽久久久蜜臀| 狠狠做深爱婷婷久久综合一区| 丰满的护士2在线观看高清| 国产探花在线观看| 欧美国产中文高清| 日本一区二区免费在线观看| 午夜精品久久久久久久99老熟妇| 天堂av网在线| 五月激激激综合网色播| 亚洲国产欧美日韩另类综合| 国产剧情一区二区三区| 美女久久久精品| 精品免费视频一区二区| 亚洲精品影院| www.国产高清| 国产在线一二| sihu成人| 6080亚洲理论片在线观看| 久久久综合网站| 欧美一区深夜视频| 久久福利小视频| 黄色免费视频| 一个人看的www片免费高清视频| jizz免费一区二区三区| 国产精品久久久久三级| 国产精品1234区| 国产又大又黄又粗| 神马亚洲视频| 噜噜噜在线观看免费视频日韩 | 精品久久国产字幕高潮| 亚洲综合大片69999| 日本精品一区在线| 久久久一区二区三区不卡| 大桥未久在线播放| a亚洲天堂av| 亚洲二区在线播放| 黄色小视频免费网站| 最近更新在线中文字幕一页| 国产在线看片免费视频在线观看| 国产精品一卡二卡在线观看| xvideos亚洲| 影音先锋资源av| 一起操在线视频| 婷婷av一区二区三区| 国产精品一区二区三区www| 国产精品你懂的在线欣赏| 国产精品久久久久影院日本| 999精品久久久| 日韩子在线观看| 91亚洲男人天堂| 国产欧美日韩精品丝袜高跟鞋| 污污的视频在线免费观看| 飘雪影院手机免费高清版在线观看| 亚洲国产国产亚洲一二三| 亚洲精品自拍偷拍| 3d动漫精品啪啪一区二区三区免费| 中文字幕一区二区三区人妻| 国产成人精品a视频| 色吧亚洲日本| 亚洲国产视频一区二区| 亚洲一区尤物| 星空影院最新电视剧免费观看| 日韩欧美网站| 在线观看视频亚洲| 五月婷六月丁香| 成人性生交大片免费看网站 | 欧美日韩一区二区在线| 亚洲欧美影院| 一线天自拍视频| 久久久久国产精品一区二区| 欧美极品在线视频| 一级片中文字幕| 日韩精品视频一区二区三区| 国产一区二区视频免费| 99热一区二区三区| 99久免费精品视频在线观78| 久久精品影视| 欧美老肥婆性猛交视频| 少妇影院在线观看| 欧美色网在线| 5月丁香婷婷综合| 亚洲第九十七页| 欧洲vodafonewi精品| 色97色成人| 国产亚洲欧美日韩美女| 国产精品18在线| 青青久久精品| 精品免费国产二区三区| 亚洲一区二区三区日韩| 17videosex性欧美| 日韩久久免费av| 欧美偷拍第一页| 在线成人动漫av| 久久久久久亚洲精品中文字幕| 久久国产视频一区| 人人香蕉久久| 国产精品久久久久免费a∨大胸| 免费精品一区二区| 亚洲精品欧美| 情事1991在线| 国产激情网址| 国产精品天干天干在观线| 天天干天天干天天干天天干天天干| 成人在线免费公开观看视频| 欧美色视频在线观看| 永久免费观看片现看| 成午夜精品一区二区三区软件| xvideos成人免费中文版| 欧美人禽zoz0强交| 亚洲va在线| 不卡av日日日| 成人欧美视频在线观看播放| 久久综合九色综合97婷婷女人| 中文字幕第17页| 国产激情欧美| 欧美在线一级视频| 色先锋影音av| 日韩中文字幕亚洲一区二区va在线| 国产福利精品av综合导导航| 一区二区视频在线观看免费的| 精品一区二区日韩| 精品久久久噜噜噜噜久久图片| 菠萝蜜视频国产在线播放| 中文字幕精品—区二区| 国产美女无遮挡永久免费| 99国产精品99久久久久久| 亚洲五月激情网| 牛牛影视久久网| 精品视频一区在线| 精品麻豆一区二区三区| 久久色精品视频| 免费黄漫在线观看| 欧美日韩一区二区不卡| 中文字幕+乱码+中文乱码www| 成人精品国产一区二区4080| 欧美极品在线观看| 国产精品成人一区二区艾草| 欧类av怡春院| 欧美成熟视频| 日韩欧美视频免费在线观看| 国产图片一区| 亚洲天堂第一区| 麻豆精品在线| 久久av日韩| 成人精品在线观看| 国产二区视频在线观看| 国产一区二区免费视频| av五月天在线| 香蕉视频一区| 久青草视频在线播放| 日韩在线资源| 欧美一级电影网站| 成人国产精品久久久网站| 亚洲尤物精选| 亚洲视频在线播放免费| 喷白浆一区二区| 一级特黄曰皮片视频| 激情六月婷婷综合| 免费看的黄色录像| 国产精品女主播在线观看| 国产乱码77777777| 天天综合网天天综合色| 久色视频网站| 亚洲人a成www在线影院| 精品伦理一区二区| 亚洲天堂成人网| 亚洲精品中文字幕乱码三区91| 国产精品色呦呦| 草草视频在线播放| 日韩视频免费观看高清完整版 | 日韩午夜电影| 久久精品国产亚洲av麻豆| 国产精品综合av一区二区国产馆| 精品91一区二区三区| 国产精品成人a在线观看| 一女三黑人理论片在线| 99精品欧美一区二区三区小说| 欧美亚洲精品天堂| 色88888久久久久久影院野外| 九色蝌蚪av新入口| 国产美女搞久久| 精品国产不卡一区二区| 精产国品一区二区三区| 成人a区在线观看| 国产精品无码在线播放| 欧美中文字幕亚洲一区二区va在线 | 亚洲色图日韩精品| 国产日韩欧美综合在线| 日韩成人一级| 欧美精品一级二级| 国产对白在线正在播放| 3d蒂法精品啪啪一区二区免费| 国产精品久久久久久久久久辛辛| 人人爽人人av| gogogo免费视频观看亚洲一| 亚洲人午夜射精精品日韩| 久久久久久久久久久国产| 国产亚洲欧美日韩高清| 欧美日韩一级二级三级| 四虎精品成人免费网站| 国产av不卡一区二区| 日韩va亚洲va欧美va久久| 99在线观看精品视频| 精品欧美一区二区久久| 久久影院午夜精品| 三级黄色片免费观看| 一区二区中文视频| 激情丁香婷婷| 成人18视频| 国产一区二区精品| 日本黄色免费视频| 茄子视频成人在线| 免费成人高清在线视频theav| 欧美人妻一区二区| 中文字幕亚洲综合| 成人中文字幕视频| 中文字字幕在线中文| 日韩精品一区在线| 草莓视频成人appios| 我和岳m愉情xxxⅹ视频| 91精品国产一区二区三区| 福利影院在线看| 国产呦小j女精品视频| 精品久久国产老人久久综合| japonensisjava老师可播放| 国产日韩在线视频| 精品亚洲国内自在自线福利| 一个人看的www在线免费观看| 久久伦理网站| 国产亚洲一区字幕| 亚洲一区在线日韩在线深爱| 一起操在线视频| 精品久久香蕉国产线看观看亚洲 | 国产精品视频永久免费播放| 国产日韩专区| www.jizz在线观看| 国产高清视频网站| 欧美色视频在线观看| 成人黄页网站视频| 亚洲熟女乱综合一区二区三区| 日韩精品综合一本久道在线视频| 日韩一二三区在线观看| 国产精品特级毛片一区二区三区| 国产精品扒开腿爽爽爽视频| 国产一区二区网址| 成人高清免费观看mv| 三叶草欧洲码在线| 欧美激情亚洲综合一区| 日产欧产美韩系列久久99| 五月婷婷导航| 人人澡人人澡人人看欧美| 久久久精品毛片| 91久久嫩草影院一区二区| www.久久精品| 中文字幕在线二区| 中文字幕无码日韩专区免费| 欧美成人小视频| 日本欧美大码aⅴ在线播放| 在线中文字日产幕| 亚洲另类欧美自拍| 亚洲美女少妇无套啪啪呻吟| 2020色愉拍亚洲偷自拍| 91色琪琪电影亚洲精品久久| 国产精品人人做人人爽人人添| 免费电影网站在线视频观看福利| 国产大片中文字幕| 玛丽玛丽电影原版免费观看1977| 最近中文字幕一区二区三区| 高清欧美日韩| 精品国语对白精品自拍视| 亚洲三区在线| 亚洲欧美国产制服动漫| 麻豆精品国产传媒mv男同| 污视频网站免费在线观看| 99精品视频免费看| 欧美日韩中文在线视频| 欧美极品美女电影一区| 国产日韩综合av| 97久久综合区小说区图片区| 91激情视频在线| 日韩一区二区av| 久久老女人爱爱| 日韩欧美网址| 国产黄色片在线播放| 99热这里是精品| 最新国产黄色网址| 国产精品劲爆视频| 欧美一级搡bbbb搡bbbb| 色综合久久av| 亚洲黄色小说网站| 精品色999| 一本大道香蕉8中文在线视频| 国产无遮挡又黄又爽又色| 96pao国产成视频永久免费| 天天射综合影视| 制服诱惑一区二区| 亚洲风情在线资源| 美女福利视频导航| 亚洲精品视频在线观看免费视频| 一区二区在线观看网站| 亚洲精品国产成人久久av盗摄 | xxxxxx国产精品视频| 国产午夜精品久久久久久久久| 爽爽窝窝午夜精品一区二区| 亚洲黄色在线免费观看| 人妻大战黑人白浆狂泄| 蜜桃精品久久久久久久免费影院| 日韩大片在线观看视频| 国产精品网友自拍| 99精品电影| 韩国成人漫画| 色中色在线视频| 天天干天天草天天射| 谁有免费的黄色网址| 欧美一区二区视频在线播放| 午夜精品久久17c| 欧美精选一区二区| 久久久99精品免费观看| 国产精品v欧美精品v日本精品动漫| 香蕉视频亚洲一级| 国产精品久久久久久精| 9.1成人看片免费版| 视频一区视频二区视频三区高| 欧美日韩国产成人在线观看| 欧美日韩免费区域视频在线观看| 国产美女精品一区二区三区| 91亚洲自偷观看高清| 国产激情在线观看| eeuss影院www在线观看免费| 国产特黄一级片| 国产午夜免费视频| 国产极品一区二区| 大肉大捧一进一出好爽视频| 九色一区二区| 午夜精品久久久久久久久久久久 | 欧美最猛黑人xxxxx猛交| 亚洲国产成人一区二区三区| 一区二区三区高清视频在线观看| 欧美在线导航| 亚洲精品一二三**| **欧美日韩在线观看| 春色校园综合激情亚洲| 久久久资源网| 天天色av.com| 天天看天天干| 成人欧美精品久久久久影院| 国产亚洲精久久久久久无码77777| 萌白酱视频在线| 久久天堂国产精品| 欧美激情视频三区| 中文字幕在线成人| 在线日韩欧美视频| 精品香蕉一区二区三区| 91精品国产欧美一区二区| 色综合久久九月婷婷色综合| 成人深夜视频在线观看| 久久久一二三| 国产伦精品一区二区三区免费| 亚洲一区二区毛片| 午夜一区不卡| 久久精品国产一区二区| www.色精品| 中文字幕第一区第二区| |精品福利一区二区三区| 亚洲成在人线免费|