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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3464|回復(fù): 0
收起左側(cè)

單片機控制LCD1602液晶屏之模塊化編程

[復(fù)制鏈接]
ID:47177 發(fā)表于 2021-4-20 09:39 | 顯示全部樓層 |閱讀模式
這里將我寫的STC12C5A60S2控制LCD1602的程序共享一下,如有不足,敬請指出!
1.jpg
代碼結(jié)構(gòu)圖:
2.png
程序下載鏈接:https://download.csdn.net/download/yagnruinihao/16676666

Proteus仿真圖下載鏈接:https://download.csdn.net/download/yagnruinihao/16676677
————————————————
單片機測試程序:LCD1602測試.c
  1. #include <string.h>
  2. #include "common.h"
  3. #include "LCD1602.h"

  4. void main(void)
  5. {
  6.         unsigned char i ;
  7.         unsigned char  author[] = "Author:YangRui" ;
  8.         
  9.         LCD1602_Init();
  10.         for(i=0 ; i<strlen(author) ; i++)
  11.         {
  12.                 LCD1602_AddressWriteByte(LCD1602_ROW0,i,author[i]);
  13.         }
  14.         LCD1602_AddressWriteString(LCD1602_ROW1,0,"QQ:279729201") ;
  15.         while(1);
  16. }
復(fù)制代碼
/*################LCD1602.h  ################*/  
  1. #ifndef __LCD1602_H__
  2. #define __LCD1602_H__

  3. #include "common.h"

  4. //硬件接口定義,與硬件電路相對應(yīng)
  5. sbit LCD1602_RS_Bit = P2^6;//LCD1602的RS端口,高電平表示數(shù)據(jù)、低電平表示命令
  6. sbit LCD1602_RW_Bit = P2^5;//LCD1602的RW端口,高電平表示讀操作、低電平表示寫操作
  7. sbit LCD1602_EN_Bit = P2^7;//LCD1602的EN端口,高電平表示讀狀態(tài)或讀數(shù)據(jù)、高脈沖表示寫指令或?qū)憯?shù)據(jù)
  8. #define LCD1602_DATA_PORT P0//LCD1602的數(shù)據(jù)口D0~D7,其中Px^0端口接DB0,Px^7端口接DB7,其他接口以此類推

  9. /* RS與RW的設(shè)置:
  10.     RS          Rw  
  11.     0           0   ---->寫命令
  12.     0           1   ---->讀狀態(tài)
  13.     1           0   ---->寫數(shù)據(jù)
  14.     1           1   ---->讀數(shù)據(jù)         
  15. */
  16. //LCD1602的RS端口選擇
  17. #define LCD1602_DATA_OPERATION                1//數(shù)據(jù)模式
  18. #define LCD1602_COMMAND_OPERATION        0//命令模式

  19. //LCD1602的RW端口選擇
  20. #define LCD1602_READ_OPERATION                1//讀操作
  21. #define LCD1602_WRITE_OPERATION                0//寫操作

  22. //LCD1602的EN端口選擇
  23. #define LCD1602_ENABLE                                1//允許操作LCD1602
  24. #define LCD1602_DISABLE                                0//禁止操作LCD1602

  25. //顯示模式:16X2個字符, 5X7點陣,8位數(shù)據(jù)口
  26. #define LCD1602_DEFAULT_DISPALY_MODE        0x38

  27. /*
  28. ====================================================
  29. LCD1602設(shè)置:顯示允許或禁止、光標(biāo)顯示或禁止、光標(biāo)閃爍或禁止  
  30. ====================================================
  31. /*  
  32. 0   0   0   0   1   D   C   B     
  33.                     |   |   |------光標(biāo)閃爍  : 1-->允許 ; 0-->禁止  
  34.                     |   |----------光標(biāo)顯示         : 1-->允許 ; 0-->禁止  
  35.                     |-------------液晶屏顯示 : 1-->允許 ; 0-->禁止   
  36.       
  37. */
  38. #define LCD1602_DISPLAY_ENABLE                        0X04                                 //允許液晶顯示
  39. #define LCD1602_DISPLAY_DISABLE                        (0X04 & (~(0x01<<2)))//禁止液晶顯示

  40. #define LCD1602_CURSOR_DISPLAY_ENABLE        0X02                                 //允許光標(biāo)顯示
  41. #define LCD1602_CURSOR_DISPLAY_DISABLE        (0X02 & (~(0x01<<1)))//禁止光標(biāo)顯示

  42. #define LCD1602_CURSOR_BLINK_ENABLE         0X01                                 //允許光標(biāo)閃爍
  43. #define LCD1602_CURSOR_BLINK_DISABLE         (0X01 & (~(0x01<<0)))//禁止光標(biāo)閃爍

  44. //默認(rèn)設(shè)置:lcd顯示,光標(biāo)不顯示,光標(biāo)不閃爍
  45. #define LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE 0x08                                          | \
  46.                                                                                 LCD1602_DISPLAY_ENABLE                         | \
  47.                                                                                 LCD1602_CURSOR_DISPLAY_DISABLE  | \
  48.                                                                                 LCD1602_CURSOR_BLINK_DISABLE

  49. /*
  50. ====================================================
  51. LCD1602設(shè)置:指針加一或減一、光標(biāo)位置加一或減一
  52. ====================================================
  53. 0   0   0   0   0   1   N   S  
  54.                         |   |-----  屏幕移動:1-->允許 ; 0-->禁止
  55.                         |---------  N=1:讀或者寫一個字符后地址指針加1,且光標(biāo)加1  
  56.                                     N=0:讀或者寫一個字符后地址指針減1,且光標(biāo)減1  
  57.                         當(dāng)S=1時 :  
  58.                             若N=1,整屏幕左移  
  59.                               N=0,整屏幕右移   
  60.                             以達(dá)到光標(biāo)不移動,而整個屏幕移動的效果  
  61. */                    
  62.                                                                         
  63. #define LCD1602_POINT_AND_CURSOR_PLUS        0X02                                 //指針加一、光標(biāo)加一
  64. #define LCD1602_POINT_AND_CURSOR_MINUS        (0X02 & (~(0X01<<1)))//指針減一、光標(biāo)減一

  65. #define LCD1602_SCREEN_MOVE_ENABLE                0x01                                 //允許屏幕移動
  66. #define LCD1602_SCREEN_MOVE_DISABLE                (0x01 & (~(0X01<<0)))//禁止屏幕移動

  67. //默認(rèn)設(shè)置:光標(biāo)和指針加一,屏幕不移動
  68. #define LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE 0X04                                 | \
  69.                                                                                         LCD1602_POINT_AND_CURSOR_PLUS| \
  70.                                                                                         LCD1602_SCREEN_MOVE_DISABLE

  71. //行位置參數(shù),注意行地址從0開始                                                                                       
  72. #define LCD1602_ROW0        0                        //第0行
  73. #define LCD1602_ROW1        1                        //第1行               
  74. #define LCD1602_MIN_ROW        LCD1602_ROW0//行數(shù)的最小值,為LCD1602_ROW0,即0*/
  75. #define LCD1602_MAX_ROW        LCD1602_ROW1//行數(shù)的最大值,為LCD1602_ROW1,即1*/

  76. //列位置參數(shù),注意列地址從0開始
  77. #define LCD1602_ROW_LENGHT        0x28        //每一行的長度為0x28,即40
  78. #define LCD1602_MIN_COLUMN        0                //列數(shù)的最小值,為0
  79. #define LCD1602_MAX_COLUMN        (LCD1602_ROW_LENGHT-1)//列數(shù)的最大值,為39

  80. //每一行的起始地址*/
  81. #define LCD1602_ROW0_ADDRESS_START        0x80                //第0行起始地址
  82. #define LCD1602_ROW1_ADDRESS_START        (0x80+0x40)        //第1行起始地址

  83. /*每一行的結(jié)束地址*/
  84. #define LCD1602_ROW0_ADDRESS_END (LCD1602_ROW0_ADDRESS_START+LCD1602_ROW_LENGHT)//第0行結(jié)束地址
  85. #define LCD1602_ROW1_ADDRESS_END (LCD1602_ROW1_ADDRESS_START+LCD1602_ROW_LENGHT)//第1行結(jié)束地址

  86. //命令集指令
  87. #define LCD1602_CLEAN_ALL_DISPALY                0x01//清屏指令
  88. #define LCD1602_CURSOR_RETURN_TO_ORIGIN        0x02//光標(biāo)歸位指令


  89. /*****************外部接口函數(shù)******************/
  90. //LCD1602初始化函數(shù)
  91. extern void LCD1602_Init(void) ;

  92. //清屏操作
  93. extern void LCD1602_CleanAll(void) ;

  94. //光標(biāo)歸位操作
  95. extern void LCD1602_CursorHoming(void);

  96. //LCD1602地址寫字節(jié)操作
  97. extern  char LCD1602_AddressWriteByte(unsigned char Row,unsigned char Column,unsigned char DataValue);

  98. //LCD1602地址寫字符串操作
  99. extern char LCD1602_AddressWriteString(unsigned char Row,unsigned char Column,unsigned char *String);

  100. //寫命令操作
  101. extern void LCD1602_WriteCommand(unsigned char CommandValue);

  102. //寫數(shù)據(jù)操作
  103. extern void LCD1602_WriteData(unsigned char DataValue);
  104. /**********************************************/

  105. #endif        /*__LCD1602_H__*/
復(fù)制代碼

/*################ LCD1602.c################*/
  1. /***************************************************************************
  2. 模    塊:LCD1602.c  
  3. 說    明:LCD1602驅(qū)動程序
  4. 版    本:Version3.0                2021/01/01 06:00
  5. 編譯環(huán)境:Keil_C51  V9.55
  6. 主控芯片:STC12C5A60S2          @11.0592MHZ
  7.                  STC89C52RC     @11.0592MHZ
  8.                  AT89C51                @11.0592MHZ        @Proteus8.9仿真
  9. 作    者:楊瑞
  10. 聯(lián)系方式:【 QQ 】279729201
  11.                  【郵箱】279729201@qq.com            
  12.                           yangrui90s@163.com
  13.                  【電話】13630279531
  14.                  
  15. 修改記錄:
  16. =================
  17.         2021/01/01 06:06
  18.         記錄:
  19.                 1.規(guī)范部分函數(shù)。
  20.                 2.取消Delay80usForLcd1602(),調(diào)用函數(shù)Delay_SomeNop(10)代替消Delay80usForLcd1602()函數(shù)。
  21.                 3.增加ST89C52RC @11.0592MHZ 和AT89C51 @11.0592MHZ @Proteus8.9仿真測試,經(jīng)測試此代碼
  22.                   均可適用。
  23. =================
  24. =================
  25.         2017/01/6 12:08
  26.         記錄:
  27.                 1.增加中文注釋。
  28.                 2.修改函數(shù)名稱模式,由"模塊名稱"(大寫)+"_"+功能函數(shù)名稱構(gòu)成,例如lcd1602ReadStatus修改為LCD1602_ReadStatus.
  29.                 3.修改延時函數(shù),將Delay1msForLcd1602函數(shù)修改為Delay80usForLcd1602函數(shù)。注意,這兩個函數(shù)都是
  30.                   由STC-ISP生成,Delay80usForLcd1602函數(shù)由STC-ISP V6.85Q的“軟件延時計算器”針對STC-Y3指令集
  31.                   @11.0592MHZ自動生成。經(jīng)過測試,延時59us可能會出現(xiàn)只書寫部分內(nèi)容的情況,延時60us正好可以。
  32.                   為了安全,也可以將此延時修改的更長。
  33. =================
  34. =================
  35.         2014/04/31 20:09
  36.         記錄:
  37.                 1.解決大工程中,因未安裝LCD1602而導(dǎo)致的工程卡死在函數(shù)
  38.                 lcd1602CheckBusy()的問題,將
  39.                 do{
  40.                                 ;
  41.                 }while( (lcd1602ReadStatus()) & 0x80));
  42.                 修改為
  43.                 do{
  44.                         i++;
  45.                 }while( ((lcd1602ReadStatus()) & 0x80)  && (i<10));
  46.                 因為在未安裝LCD1602時,通過"讀狀態(tài)"函數(shù)lcd1602ReadStatus()讀回來的永遠(yuǎn)是0xff,
  47.                 如果采用第一種算法,會導(dǎo)致程序"卡死",不夠“安全”。
  48. =================
  49. =================
  50.         2014/02/24 23:44
  51.         記錄:
  52.                 1.增加函數(shù)lcd1602AddressWriteString(...)
  53. =================
  54. =================
  55.         2014/02/24 15:00
  56.         記錄:
  57.                 1.增加函數(shù)delay1msForLcd1602()
  58.                   STC12C5A60S2單片機操作速度快比傳統(tǒng)8051快,某些操作延時必須足夠。
  59. =================
  60. ***************************************************************************/

  61. #include <string.h>
  62. #include "lcd1602.h"

  63. /*外部接口函數(shù)在lcd1602.h中聲明*/
  64. /*****************內(nèi)部函數(shù)******************/
  65. unsigned char LCD1602_ReadStatus(void) ;
  66. void LCD1602_CheckBusy(void) ;
  67. /**********************************************/

  68. /******************************************************************
  69. - 函數(shù)名稱:LCD1602_ReadStatus
  70. - 功能描述:讀取LCD1602狀態(tài)值
  71. - 函數(shù)屬性:內(nèi)部函數(shù)
  72. - 參數(shù)說明:無
  73. - 返回說明:LCD1602的狀態(tài)值
  74. ******************************************************************/
  75. unsigned char LCD1602_ReadStatus(void)
  76. {
  77.         unsigned char StatusCode ;

  78.         LCD1602_EN_Bit = LCD1602_DISABLE ;                        //禁止操作LCD1602
  79.         LCD1602_RS_Bit = LCD1602_COMMAND_OPERATION ;//命令模式
  80.         LCD1602_RW_Bit = LCD1602_READ_OPERATION ;        //讀操作

  81.         LCD1602_DATA_PORT = 0xff ;
  82.         Delay_SomeNop(10);                                                        //注意:這里延時不能少,否則不會有效果
  83.         LCD1602_EN_Bit = LCD1602_ENABLE ;                        //允許操作LCD1602
  84.         Delay_SomeNop(10);                                                        //注意:這里延時不能少,否則不會有效果
  85.         
  86.         StatusCode = LCD1602_DATA_PORT ;                        //讀取狀態(tài)值*/
  87.         LCD1602_EN_Bit = LCD1602_DISABLE ;                        //禁止操作LCD1602

  88.         return StatusCode ;
  89. }

  90. /******************************************************************
  91. - 函數(shù)名稱:LCD1602_CheckBusy
  92. - 功能描述:判斷LCD1602是否忙碌:若忙碌則等待;若空閑則執(zhí)行任務(wù)
  93. - 函數(shù)屬性:內(nèi)部函數(shù)
  94. - 參數(shù)說明:無
  95. - 返回說明:無
  96. - 注           :當(dāng)LCD1602_DATA_PORT[7]等于1,表示LCD1602忙碌,則需要等待一會兒
  97.              當(dāng)LCD1602_DATA_PORT[7]等于0,表示LCD1602空閑,則可以繼續(xù)執(zhí)行后面的任務(wù)
  98. - 補    充:這里的“10”是經(jīng)過測試的,測試中,利用串口打印i的值為1,這里寫10已經(jīng)足夠大了。
  99. ******************************************************************/
  100. void LCD1602_CheckBusy(void)
  101. {
  102.         unsigned char  i=0;
  103.         
  104.         do{
  105.                 i++;
  106.         }while( ((LCD1602_ReadStatus()) & 0x80) && (i<10));
  107. }

  108. /******************************************************************
  109. - 函數(shù)名稱:LCD1602_WriteCommand
  110. - 功能描述:LCD1602寫命令
  111. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  112. - 參數(shù)說明:CommandValue,需要發(fā)送給LCD1602的指令值
  113. - 返回說明:無
  114. ******************************************************************/
  115. void LCD1602_WriteCommand(unsigned char CommandValue)
  116. {
  117.         LCD1602_CheckBusy();
  118.         
  119.         LCD1602_EN_Bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  120.         LCD1602_RS_Bit = LCD1602_COMMAND_OPERATION ;/*命令模式*/
  121.         LCD1602_RW_Bit = LCD1602_WRITE_OPERATION ;        /*寫操作*/

  122.         LCD1602_DATA_PORT = CommandValue ;                        /*發(fā)送指令值*/
  123.         //Delay_SomeNop(10);
  124.         LCD1602_EN_Bit = LCD1602_ENABLE ;                        /*允許操作LCD1602*/
  125.         //Delay_SomeNop(10);

  126.         LCD1602_EN_Bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  127. }

  128. /******************************************************************
  129. - 函數(shù)名稱:LCD1602_WriteData
  130. - 功能描述:LCD1602寫數(shù)據(jù)
  131. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  132. - 參數(shù)說明:DataValue,需要發(fā)送給LCD1602的數(shù)據(jù)
  133. - 返回說明:無
  134. ******************************************************************/
  135. void LCD1602_WriteData(unsigned char   DataValue)
  136. {        
  137.         LCD1602_CheckBusy() ;
  138.         
  139.         LCD1602_EN_Bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  140.         LCD1602_RS_Bit = LCD1602_DATA_OPERATION ;        /*數(shù)據(jù)模式*/
  141.         LCD1602_RW_Bit = LCD1602_WRITE_OPERATION ;        /*寫操作*/

  142.         LCD1602_DATA_PORT = DataValue;                                /*發(fā)送數(shù)據(jù)*/
  143.         //Delay_SomeNop(10);
  144.         LCD1602_EN_Bit = LCD1602_ENABLE ;                        /*允許操作LCD1602*/
  145.         //Delay_SomeNop(10);

  146.         LCD1602_EN_Bit = LCD1602_DISABLE ;                         /*禁止操作LCD1602*/  
  147. }

  148. /******************************************************************
  149. - 函數(shù)名稱:LCD1602_CleanAll
  150. - 功能描述:清除屏幕顯示
  151. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  152. - 參數(shù)說明:無
  153. - 返回說明:無
  154. - 注           :清除屏幕顯示,光標(biāo)歸位(左上角),地址計數(shù)器AC設(shè)為0
  155. ******************************************************************/
  156. void LCD1602_CleanAll(void)
  157. {
  158.         LCD1602_WriteCommand(LCD1602_CLEAN_ALL_DISPALY);
  159. }

  160. /******************************************************************
  161. - 函數(shù)名稱:LCD1602_CursorHoming
  162. - 功能描述:光標(biāo)歸位
  163. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  164. - 參數(shù)說明:無
  165. - 返回說明:無
  166. - 注           :光標(biāo)歸為,當(dāng)屏幕移動顯示時,lcd1602顯示所有數(shù)據(jù)后,
  167.                          調(diào)用此函數(shù),屏幕顯示的所有東西都會歸位。光標(biāo)在第一
  168.                      個位置(0x80)。
  169. ******************************************************************/
  170. void LCD1602_CursorHoming(void)
  171. {
  172.         LCD1602_WriteCommand(LCD1602_CURSOR_RETURN_TO_ORIGIN);
  173. }

  174. /******************************************************************
  175. - 函數(shù)名稱:LCD1602_Init
  176. - 功能描述:LCD1602初始化
  177. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  178. - 參數(shù)說明:無
  179. - 返回說明:無
  180. - 注           :設(shè)置(1)顯示模式
  181.            (2)液晶顯示允許或禁止、光標(biāo)顯示允許或禁止、光標(biāo)閃爍允許或禁止
  182.                    (3)地址指針加一或減一、光標(biāo)指針加一或減一、屏幕左移或右移
  183.                   
  184.                    可通過修改LCD1602.H中的LCD1602_DEFAULT_DISPALY_MODE、LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE、
  185.                    LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE達(dá)到不同的顯示效果。
  186. ******************************************************************/
  187. void LCD1602_Init(void)
  188. {
  189.         LCD1602_CleanAll();
  190.         LCD1602_WriteCommand(LCD1602_DEFAULT_DISPALY_MODE);
  191.         LCD1602_WriteCommand(LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE);
  192.         LCD1602_WriteCommand(LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE);

  193.         /*可忽略,在LCD1602_CleanAll()中隱含了該功能*/
  194.         LCD1602_CursorHoming();
  195. }

  196. /******************************************************************
  197. - 函數(shù)名稱:LCD1602_AddressWriteByte
  198. - 功能描述:在LCD1602的Row行Column列寫入數(shù)DataValue
  199. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  200. - 參數(shù)說明:Row-->行地址,有效值為LCD1602_ROW0或LCD1602_ROW1
  201.                          Column-->列地址,有效值為0~39之間的整數(shù)
  202.                          DataValue-->需要寫入的數(shù)據(jù)。
  203. - 返回說明:0(成功)或者-1(失敗)
  204. - 注           :1.行地址和列地址都是從0開始的。
  205.                    需要在LCD1602的第0行第2列顯示阿里伯?dāng)?shù)字5,調(diào)用方式為
  206.                            LCD1602_AddressWriteByte(LCD1602_ROW0,2,‘5’);
  207.                          2.在DEBUG模式下,會對入?yún)⑦M(jìn)行有效性判斷,協(xié)助分析。調(diào)試后期可通過
  208.                            屏蔽common.h中的"#define DEBUG  1"減小目標(biāo)文件的大小。   
  209. ******************************************************************/
  210. char  LCD1602_AddressWriteByte(unsigned char Row,unsigned char Column,unsigned char DataValue)
  211. {
  212.         #ifdef DEBUG
  213.                 if((Column< LCD1602_MIN_COLUMN)|| (Column > LCD1602_MAX_COLUMN)|| \
  214.                    ( (Row != LCD1602_ROW0) &&(Row != LCD1602_ROW1)))
  215.                         return  -1 ;
  216.         #endif
  217.         
  218.         if(LCD1602_ROW0 == Row)         //注意這里==的兩邊順序,技巧!
  219.                 LCD1602_WriteCommand(LCD1602_ROW0_ADDRESS_START+Column) ;
  220.         else if(LCD1602_ROW1 == Row)//注意這里==的兩邊順序,技巧!
  221.                 LCD1602_WriteCommand(LCD1602_ROW1_ADDRESS_START+Column) ;
  222.         LCD1602_WriteData(DataValue);

  223.         return 0;
  224. }

  225. /******************************************************************
  226. - 函數(shù)名稱:LCD1602_AddressWriteString
  227. - 功能描述:從LCD1602的Row行Column列開始寫入字符串String
  228. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  229. - 參數(shù)說明:Row-->行地址,有效值為LCD1602_ROW0或LCD1602_ROW1
  230.                          Column-->列地址,有效值為0~39之間的整數(shù)
  231.                          String-->需要寫入的字符串。
  232. - 返回說明:0(成功)或者-1(失敗)
  233. - 注           :行地址和列地址都是從0開始的。

  234.                         想在LCD1602的第0行第2列顯示"test",調(diào)用方式為
  235.                         LCD1602_AddressWriteString(LCD1602_ROW0,2,"test");
  236.            
  237.                         這里使用的是strlen,而不是sizeof。

  238.                         在DEBUG模式下,會對入?yún)⑦M(jìn)行有效性判斷,協(xié)助分析。調(diào)試后期可通過
  239.                         屏蔽common.h中的"#define DEBUG  1"減小目標(biāo)文件的大小。
  240. ******************************************************************/
  241. char  LCD1602_AddressWriteString(unsigned char Row,unsigned char Column,unsigned char *String)
  242. {
  243.         unsigned char length = strlen(String) ;
  244.         
  245.         #ifdef DEBUG
  246.                 if(Column< LCD1602_MIN_COLUMN|| (Column+strlen(String)-1) > LCD1602_MAX_COLUMN|| \
  247.                    ( (Row != LCD1602_ROW0) &&(Row != LCD1602_ROW1)))
  248.                         return -1 ;
  249.         #endif

  250.         if(LCD1602_ROW0 == Row)                //注意這里==的兩邊順序,技巧!
  251.                 LCD1602_WriteCommand(LCD1602_ROW0_ADDRESS_START+Column) ;
  252.         else if(LCD1602_ROW1 == Row)//注意這里==的兩邊順序,技巧!
  253.                 LCD1602_WriteCommand(LCD1602_ROW1_ADDRESS_START+Column) ;
  254.         
  255.         while(length--)
  256.                 LCD1602_WriteData(*String++);
  257.         return 0;
  258. }
復(fù)制代碼
/*################common.h################*/
  1. #ifndef __COMMON_H__
  2. #define __COMMON_H__

  3. #include <reg51.h>

  4. #define DEBUG  1        //用于前期調(diào)試,后期可以屏蔽本行代碼,達(dá)到減少目標(biāo)文件大小的目標(biāo)


  5. /*****************外部接口函數(shù)******************/
  6. //延時(不精準(zhǔn)延時)函數(shù)
  7. void Delay_SomeNop(long  time);


  8. #endif /*__COMMON_H__*/
復(fù)制代碼
/*################common.c################*/


  1. #include <intrins.h>
  2. #include "common.h"

  3. /******************************************************************
  4. - 函數(shù)名稱:Delay_SomeNop
  5. - 功能描述:延時函數(shù)(不精準(zhǔn)延時)
  6. - 函數(shù)屬性:外部函數(shù),供用戶調(diào)用
  7. - 參數(shù)說明:time需要延時時間                 
  8. - 返回說明:無
  9. - 注           :無
  10. ******************************************************************/
  11. void Delay_SomeNop(long  time)
  12. {
  13.         while(time--)
  14.         {
  15.                 _nop_();
  16.         }
  17. }
復(fù)制代碼
版權(quán)聲明:本文為CSDN博主「刺客阿瑞」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yagnruinihao/article/details/18559309

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成年人视频免费在线观看 | 日韩一区二区三区精品 | 国产精品福利在线 | 日韩精品在线一区 | 我爱操 | 操夜夜| 国产日韩欧美中文 | 岛国av免费看 | 色婷婷久久久亚洲一区二区三区 | 91小视频在线 | 中文字幕 在线观看 | 精品av| 精品欧美一区二区精品久久久 | 国产电影一区二区在线观看 | 亚洲高清av | 在线激情视频 | 亚洲精品日韩在线 | 亚洲精品欧美一区二区三区 | 中文一区二区 | 久久国产精品久久国产精品 | 亚洲国产精品久久久 | 国产精品精品久久久久久 | 国产一区二区三区四区五区加勒比 | 久久久不卡网国产精品一区 | 欧美一区二区在线播放 | 91在线电影 | 亚洲成人免费电影 | 国产一级免费视频 | 久草欧美 | 中文字幕一区在线观看视频 | 亚洲欧美日韩精品久久亚洲区 | 99热都是精品 | 午夜精品一区二区三区在线观看 | 日本一区二区三区四区 | 在线观看一区 | 亚洲国产成人精品女人久久久 | 亚洲美女一区 | 日韩一区二区三区视频在线播放 | 国产国产精品久久久久 | 亚洲视频一区 | 欧美激情一区二区三区 |