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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 7692 | 評論數: 7 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-5-13 20:49

正文摘要:

做的關于LCD1602仿手機顯示字符的實驗。 步驟:1、在keil里編譯無誤代碼生成hex文件  2、將hex文件導入proteus原理圖中 原理圖如下:

回復

ID:162037 發表于 2023-6-19 14:39
#define LCD_PORT P2                //液晶端口(P2高4位)這里宏定義錯了,應該是:#define LCD_PORT P0                //液晶端口(P0高4位)
ID:55211 發表于 2019-5-16 00:22
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. }

復制代碼
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');         } },有個類似的程序,可以看看
ID:536476 發表于 2019-5-14 09:07
w1179benp 發表于 2019-5-14 07:24
大致看了下,你的lcd1602驅動貌似是并口的,但proteus圖示是4線式(穿行數據輸入)程序同時控制端也用的是P ...

大佬,所以說有什么解決辦法么
ID:149451 發表于 2019-5-14 07:24
大致看了下,你的lcd1602驅動貌似是并口的,但proteus圖示是4線式(穿行數據輸入)程序同時控制端也用的是P2口,有點亂

評分

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

查看全部評分

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 很給力!

查看全部評分

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
a级片在线免费| 一区二区三区四区高清精品免费观看 | 日韩欧美一区二区在线观看| 国产成人永久免费视频| 丰满爆乳一区二区三区| jizzjizz日本少妇| 中文字幕丰满人伦在线| 午夜激情福利视频| 欧美一区二区三区少妇| 美女的胸无遮挡在线观看| 久久国产精品美女| 亚洲人亚洲人色久| 久久国产精品亚洲77777| 国产亲近乱来精品视频| 国产精品嫩草影院av蜜臀| 亚洲激情校园春色| 精品成人一区二区三区四区| 先锋在线资源一区二区三区| 91传媒在线免费观看| 欧美成人中文字幕| 日韩美女视频免费在线观看| 555www成人网| 国产精品久久久久久久9999| 日本精品性网站在线观看| 亚洲一区二区三区免费看| 奇米网一区二区| 伊人免费视频| 麻豆国产在线| 桃乃木香奈和黑人aⅴ在线播放| av在线免费一区| 日韩激情毛片| 一区二区三区日韩| 国产日韩视频在线观看| 日本黄色网址大全| 欧美色图中文字幕| 日韩一区精品| 国产午夜亚洲精品理论片色戒| 欧美激情一区二区三区久久久| jizzzz日本| 九九热视频精品在线观看| 免费一级欧美在线大片| 亚洲欧洲国产日韩| 91亚洲国产成人精品性色| 国产精品情侣呻吟对白视频| 九色在线91| a中文字幕www| 蜜桃精品噜噜噜成人av| 日韩在线视频国产| 日韩不卡视频在线| 尤物tv在线精品| 色妞色视频一区二区三区四区| 动漫性做爰视频| 国产盗摄一区二区| 亚洲一区二区三区爽爽爽爽爽| 国产高清在线不卡| 日韩欧美三级视频| av在线私库| 国产精品一区在线观看你懂的| 欧美精品videofree1080p| 国产午夜在线一区二区三区| 黄页视频在线观看| 国产精品18久久久久久久网站| 日本不卡高字幕在线2019| 性欧美一区二区| 嫩草精品影院| 岛国精品一区二区| 日韩三级视频中文字幕| 欧美久久久久久一卡四| 日韩一级片大全| 久久9999免费视频| 国产毛片精品国产一区二区三区| 国产精品麻豆一区二区| 日韩精品一区国产麻豆| 9.1在线观看免费| 青青操在线观看视频| 另类一区二区| 91麻豆高清视频| 欧美成人在线网站| 三上悠亚免费在线观看| 无码人妻丰满熟妇啪啪网站| av成人动漫| 日本中文字幕一区二区视频 | 亚洲成人三级| 欧美丝袜激情| 精品久久久久久久久久ntr影视| 成年人视频大全| 成人亚洲成人影院| 奇米精品一区二区三区四区| 国产精品久久久久7777婷婷| 一道本无吗一区| 亚洲专区**| 亚洲人成网站色ww在线| 久久久无码精品亚洲国产| 成人精品国产亚洲| 精品国产一二三| 久草视频手机在线| 亚洲电影二区| 最近2019好看的中文字幕免费 | 先锋av在线资源| 99久久777色| 欧美一区二区三区不卡| 国产又粗又猛又爽视频| 97久久亚洲| 亚洲aa在线观看| 天天摸在线视频| 精品欧美一区二区在线观看| 中文字幕 日韩有码| 日韩成人av影视| 日韩网站在线免费观看| 亚洲成人一区在线观看| 97精品国产97久久久久久| 原谅我中文字幕| 欧美一区影院| 欧美中在线观看| 性生活黄色大片| 国内精品福利| 99在线国产| 国产精品你懂的在线观看| 成人黄色777网| 日本黄色片一级片| 91大神在线资源观看无广告| 成人av在线资源网站| 日韩精品视频在线免费观看| 久久一区二区三区视频| 91精品啪在线观看国产爱臀| 8x福利精品第一导航| 一区二区三区四区免费| 99国产精品久久久久久久 | 一区二区免费| 亚洲精品写真福利| 国产三级三级看三级| 国产在线三区| 欧美日韩一区高清| 国产污视频在线看| 猛男gaygay欧美视频| 国产精品精品久久久| 私人玩物在线观看| 亚洲欧美激情插| 欧美xxxxx精品| 99re6热只有精品免费观看| 8x海外华人永久免费日韩内陆视频| 五月婷婷综合久久| 99久久精品久久久久久清纯| 88av.com| 亚洲伊人精品酒店| 国产精品入口日韩视频大尺度| 户外露出精品视频国产| 国产精品久久久久久久久免费丝袜| 久久99爱视频| 欧美顶级毛片在线播放| 国产一区二区三区奇米久涩| 在线播放av网站| 中文字幕久热精品视频在线| 午夜小视频在线播放| 久久青草欧美一区二区三区| 老司机av网站| 久久av超碰| 欧美人与物videos另类| 黄色片免费在线观看| 日韩视频第一页| freesex欧美| 欧美色另类天堂2015| 无码人妻av免费一区二区三区 | 日本国产在线播放| av成人在线看| 91青草视频久久| 91在线不卡| 久久人人爽人人爽人人片av高清| 成年黄网站在线观看免费| 制服丝袜亚洲精品中文字幕| 性猛交富婆╳xxx乱大交天津| 久久久av毛片精品| 国产精品6666| 国产激情视频一区二区在线观看 | 91久久精品一区| 狠狠色一日本高清视频| 亚洲精品国产拍免费91在线| 人与牲动交xxxxbbb| 日韩一卡二卡三卡四卡| 欧美色图综合网| 精品久久人人做人人爰| 国产精品视频一区二区三区麻豆| 欧美丰满一区二区免费视频| 精品一区二区在线欧美日韩| 欧美一区二区视频在线观看| 91在线资源| 亚洲人成网站777色婷婷| 69免费视频| 久久亚洲精品中文字幕冲田杏梨| 亚洲性猛交富婆| 日韩理论片在线| 97国产精品久久久| 欧美性jizz18性欧美| 欧美乱大交xxxxx另类| 亚洲国产一区自拍| 好男人社区在线视频| 国产精品极品尤物在线观看 | 男的操女的网站| 欧美韩国日本一区| 可以免费观看的毛片| 91精品中文字幕一区二区三区| 九九热在线免费视频| 美日韩在线视频| 国产精品原创| 野外做受又硬又粗又大视频√| 日韩在线欧美| 青青青视频在线免费观看| 久久久亚洲欧洲日产国码αv| 中文字幕视频网站| 色爱区综合激月婷婷| www成人免费观看网站| 97国产精品人人爽人人做| 肉色欧美久久久久久久免费看| 丰满的少妇愉情hd高清果冻传媒| 亚洲国产高清一区二区三区| 中文字幕另类日韩欧美亚洲嫩草| √…a在线天堂一区| 狂野欧美激情性xxxx| 欧美激情第一页xxx| 3d欧美精品动漫xxxx无尽| 性生活免费在线观看| 99精品在线观看视频| 日韩欧美伦理电影院| 97欧美精品一区二区三区| 久久伊人国产| 国产肉体xxxx裸体784大胆| 国产精品久久久久久久免费观看| 亚洲精品久久久久久国| 欧美日本在线播放| 1024国产在线| 蜜臀久久99精品久久久酒店新书| 成人久久视频在线观看| 国产麻豆剧果冻传媒视频杜鹃| 777精品视频| 亚洲男人都懂第一日本| 久草免费新视频| 精品国产人成亚洲区| 国内老司机av在线| 一级黄色特级片| 亚洲美女区一区| 在线小视频网址| 少妇无码av无码专区在线观看| 一区二区三区在线免费观看| 亚洲小说区图片区都市| 欧美日韩国产一二三区| 97精品在线观看| 日韩中文字幕1| 999www成人| 激情久久综合网| 日韩av最新在线观看| 日韩在线看片| 国产又猛又黄又爽| 777久久精品一区二区三区无码 | 美女100%一区| 精品国产xxx| 91久久久在线| 国产经典欧美精品| japanese在线| 少妇一级淫免费放| 欧美日韩国产区| 欧美gv在线| 国产对白videos麻豆高潮| 操人视频在线观看欧美| 欧美一区激情| 日日干夜夜爽| 久久久久久久久久网| 红桃视频成人在线观看| 久久精品女人天堂av免费观看| 日产精品久久久久| 久久久久国产精品免费| 国产亚洲毛片在线| 九九99九九精彩| 五月天开心婷婷| 国产一区二区三区在线播放免费观看| 神马久久影院| 韩日电影在线观看| 日本黄xxxxxxxxx100| 色哟哟国产精品| vam成人资源在线观看| 国产精品无码天天爽视频| 久久精品日韩精品| 亚洲高清视频中文字幕| 久久伊人国产| 熟妇人妻中文av无码| 日韩国产成人无码av毛片| 欧美性生活大片免费观看网址| 精品91福利视频| 蝴蝶中文综合娱乐网| 中国丰满人妻videoshd| 欧美变态凌虐bdsm| 国产精品大片| 狠狠操在线视频| 无码人妻精品中文字幕 | 免费高清在线观看免费| 亚洲乱码国产乱码精品精天堂| 亚洲人成免费网站| 中文字幕一区二区三区域| 全黄一级裸体片| 91视频在线免费观看| 久久久久久久久久久99999| 亚洲伊人av| 国产日本久久| 国产色噜噜噜91在线精品| 亚洲综合一区二区三区| 国产精品乱子乱xxxx| 欧美一区二区三区四| 在线午夜影院| 亚洲美女偷拍久久| 咪咪色在线视频| 国产成人福利短视频app| 亚洲一本二本| 欧美精品情趣视频| 欧美黄片一区二区三区| 日韩在线伦理| 欧美亚洲尤物久久| 九一精品久久久| 污污网站在线| 中文字幕免费观看一区| 中文字幕一区二区三区在线乱码 | 91久久嫩草影院一区二区| 在线免费观看一级片| 99精品中文字幕在线不卡 | 欧美美女性视频| 黄色av网址在线免费观看| 欧美韩国日本综合| 国产又粗又猛又爽又黄的网站| 麻豆传媒mv| 91视视频在线直接观看在线看网页在线看| 久久久福利视频| 一个人免费播放在线视频看片 | 妖精视频一区二区三区免费观看| 综合网中文字幕| 日本少妇毛茸茸高潮| 波多野结衣欧美| 欧美精品日韩www.p站| 丰满人妻一区二区三区四区| 成人a'v在线播放| 欧美一区二区三区图| 亚洲欧美激情另类| 99在线观看免费视频精品观看| 91中文字幕在线| 国产秒拍福利视频露脸| 精品写真视频在线观看| 亚洲一区二区三区涩| 国产bdsm| 亚洲人成网站影音先锋播放| 国产色视频在线播放| 婷婷开心激情网| 亚洲中午字幕| 久久精品五月婷婷| 成人网免费视频| 国产精品国产精品国产专区不蜜| 日韩欧美在线播放视频| 成年人在线视频免费观看| 日韩欧美在线播放| 欧美做受喷浆在线观看| 精品美女一区| 乱亲女秽乱长久久久| 999av视频| 日韩专区欧美专区| 一区二区三区国| 青青青免费视频在线2| 精品久久久久久久久国产字幕 | 无码粉嫩虎白一线天在线观看| 新欧美整片sss第一页| 色视频欧美一区二区三区| 亚洲做受高潮无遮挡| 久久亚洲精品中文字幕| 欧美成人免费全部观看天天性色| 国产日产亚洲系列最新| 国产精品综合色区在线观看| 欧美日韩精品久久久免费观看| 成人黄动漫网站| 福利视频第一区| 国产亚洲精品久久久久久豆腐| 91国在线产| 91原创在线视频| 国产三级日本三级在线播放| japanese色国产在线看视频| 亚洲精品久久久久久下一站| 欧美日韩在线视频播放| 午夜亚洲激情| 日韩国产小视频| 成人片在线看| 国产亚洲欧美一区| 六月丁香综合网| 成人短视频下载| 天天色天天干天天色| 国产亚洲精aa在线看| 日本久久久a级免费| 视频在线你懂的| 亚洲精品欧美二区三区中文字幕| 四虎永久免费在线观看| 美女毛片一区二区三区四区| 99久久久久国产精品免费| 影音先锋可以看的网站| 911精品产国品一二三产区| 日日骚av一区二区| 美女久久久精品| 欧美成人精品欧美一级乱|