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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6033|回復: 2
收起左側

基于m128的LCD1602驅動(8線/4線)

[復制鏈接]
ID:80436 發表于 2015-5-21 23:52 | 顯示全部樓層 |閱讀模式



  1. //*************************************************
  2. // 文件名: 1602.h
  3. // 作用:    AVR的LCD1602 4/8線驅動
  4. // 作者:    seabisuit
  5. // 最新修改: 2011年6月22日
  6. // 說明:   使用GCC編程,1602提供4/8線驅動
  7. //     4線暫時高4位
  8. //*************************************************/
  9. #ifndef __1602_H_
  10. #define __1602_H_ 1
  11. //***頭文件調用***//
  12. #include <avr/io.h>
  13. #include <util/delay.h>
  14. #include <avr/portpins.h>
  15. #include <compat/deprecated.h>

  16. //***定義uchar***//
  17. #ifndef uchar
  18. #define uchar unsigned char
  19. #endif

  20. //***本頭文件增強功能設置***//
  21. #define _LCD_DEF    0 //使自定義功能實現,如不需要將其定義為0(#define _LCD_DEF 0)
  22. #define _LCD_BIT_IS_8 1 //定義4線或者8線

  23. /*控制針腳設置*/
  24. #define LCD_CZ PORTB
  25. #define LCD_CZDDR DDRB
  26. #define LCD_E 2
  27. #define LCD_RW 1
  28. #define LCD_RS 0
  29. #define LCDDATA PORTE
  30. #define LCDDDR DDRE
  31. #define LCDPIN PINE
  32. #define busy 7

  33. /*LCD命令定義*/
  34. #define E0()   cbi(LCD_CZ,LCD_E)
  35. #define E1()   sbi(LCD_CZ,LCD_E)
  36. #define RW0()    cbi(LCD_CZ,LCD_RW)
  37. #define RW1()    sbi(LCD_CZ,LCD_RW)
  38. #define RS0()    cbi(LCD_CZ,LCD_RS)
  39. #define RS1()    sbi(LCD_CZ,LCD_RS)
  40. #define nop()    asm("nop")

  41. /*基本功能函數聲明。*/
  42. void lcd_busy(void);//測試LCD忙碌狀態
  43. void lcd_wrcmd(uchar CMD,uchar wait);//LCD寫入指令
  44. void lcd_wrdata(uchar);//LCD寫入數據
  45. void lcd_xy(uchar,uchar);//lcd顯示定位
  46. void lcd_char(uchar,uchar,uchar);//lcd顯示字符
  47. void lcd_string(uchar,uchar,uchar *);//lcd顯示字符串
  48. void lcd_cls(void);//1602清顯示
  49. void lcd_init(void); //LCD初始化設定程序
  50. void lcd_def(void);//自定義字符串


  51. /********************************************************/
  52. /* 函數:void lcd_busy(void)                            */
  53. /* 功能:檢查LCD忙狀態                                  */
  54. /*busy為1時,忙,等待。busy為0時,閑,可寫指令與數據     */
  55. /*                                                      */
  56. /********************************************************/
  57. void lcd_busy(void)
  58. {
  59.    #if (_LCD_BIT_IS_8==1) //8位數據線

  60. uchar tmp;

  61. LCDDDR&=~1<<7;//設置為輸入
  62. E0();RS0();RW1();

  63. /*循環讀取忙位*/
  64. do{
  65.    E1();_delay_us(1);
  66.    tmp=LCDPIN;
  67.    E0();
  68. }
  69. while(tmp&1<<busy);
  70. LCDDDR=0xff;

  71. #else    //4位數據線

  72. uchar tmp;
  73. LCDDDR=0;
  74. E0();RS0();RW1();
  75. /*循環讀取忙位*/
  76. do{
  77. E1();_delay_us(1);
  78. tmp=LCDPIN;
  79. E0();_delay_us(1);
  80. E1();_delay_us(1);

  81. E0();_delay_us(6);
  82. }
  83. while(tmp&1<<busy);

  84. LCDDDR=0xff;

  85. #endif

  86. }
  87. /********************************************************/
  88. /* 函數:lcd_wrcmd(uchar CMD,uchar wait)                */
  89. /* 功能:寫入命令到LCD                                  */
  90. /*RS=0,RW=0,E=高脈沖,D0-D7=指令碼。                  */
  91. /*CMD為指令,wait指定是否要檢測LCD忙信號                */
  92. /*                                                      */
  93. /********************************************************/
  94. void lcd_wrcmd(uchar CMD,uchar wait)
  95. {   
  96.    #if (_LCD_BIT_IS_8==1) //8位數據線

  97. if (wait) //是否讀忙
  98. lcd_busy();
  99. //else
  100. //_delay_us(40);
  101.     RS0();RW0();
  102.     LCDDATA=CMD;   
  103.     E1();E0();

  104. #else    //4位數據線

  105. if (wait)
  106. lcd_busy();
  107. else
  108. _delay_us(40);
  109.     RS0();RW0();E0();     
  110.    
  111.     LCDDATA=CMD&0xf0;
  112.     E1();_delay_us(1);E0();_delay_us(6);
  113. LCDDATA=(CMD<<4)&0xf0;
  114. E1();_delay_us(1);E0();
  115. #endif
  116. }
  117. /********************************************************/
  118. /* 函數:void lcd_wrdate(uchar);                        */
  119. /* 功能:寫入數據到LCD                                  */
  120. /*RS=1,RW=0,E=高脈沖,D0-D7=指令碼。                  */
  121. /*dat為要寫入的數據                                     */
  122. /*                                                      */
  123. /********************************************************/
  124. void lcd_wrdata(uchar dat)      //寫數據
  125. {
  126.    #if (_LCD_BIT_IS_8==1) //8位數據線

  127. lcd_busy();
  128.     RW0();RS1();      
  129. LCDDATA=dat;
  130.     E1();E0();

  131. #else    //4位數據線
  132. lcd_busy();
  133.     RW0();RS1();      

  134.     LCDDATA=dat&0xf0;
  135.     E1();_delay_us(1);E0();_delay_us(6);


  136.     LCDDATA=(dat<<4)&0xf0;
  137. E1();_delay_us(1);E0();
  138. #endif
  139.    
  140. }
  141. /********************************************************/
  142. /* 函數:lcd_xy(uchar x,uchar y)                        */
  143. /* 功能:lcd顯示定位                                    */
  144. /*                                                      */
  145. /********************************************************/
  146. void lcd_xy(uchar x,uchar y)
  147. {
  148. uchar add;
  149. if(y==0)
  150. add=0x80+0x00+x;
  151.     else
  152.     add=0x80+0x40+x;
  153.     lcd_wrcmd(add,1);
  154. }

  155. /********************************************************/
  156. /* 函數:void lcd_char(uchar x,uchar y,uchar dat)       */
  157. /* 功能:lcd于(x,y)處顯示字符                        */
  158. /*                                                      */
  159. /********************************************************/
  160. void lcd_char(uchar x,uchar y,uchar dat)
  161. {   
  162.     lcd_xy(x,y);
  163.     lcd_wrdata(dat);
  164. }           
  165. /********************************************************/
  166. /* 函數:void lcd_string(uchar x,uchar y,uchar *s)      */
  167. /* 功能:lcd于(x,y)處開始顯示字符串                  */
  168. /*                                                      */
  169. /********************************************************/
  170. void lcd_string(uchar x,uchar y,uchar *s)
  171. {
  172. lcd_xy(x,y);
  173. while(*s)
  174.     {
  175.    lcd_wrdata(*s);
  176.         s++;
  177.     }
  178. }
  179. /********************************************************/
  180. /* 函數:void lcd_cls(void)                             */
  181. /* 功能:對1602顯示屏清除,并進行延時                   */
  182. /* 延時是為了使1602又時間進行清除                       */
  183. /*                                                      */
  184. /********************************************************/
  185. void lcd_cls(void)
  186. {
  187. lcd_wrcmd(0x01,1);
  188. _delay_ms(10);
  189. }
  190. /********************************************************/
  191. /* 函數:void LcdReset(void);                           */
  192. /* 功能:對1602進行復位                                 */
  193. /*                                                      */
  194. /********************************************************/
  195. void lcd_init(void)     
  196. {   
  197.    #if (_LCD_BIT_IS_8==1) //8位數據線
  198.    
  199. LCD_CZDDR=1<<LCD_E|1<<LCD_RS|1<<LCD_RW;
  200. LCDDDR=0xff;
  201. _delay_ms(15);
  202. lcd_wrcmd(0x38,0);   
  203. _delay_ms(5);
  204. lcd_wrcmd(0x38,0);   
  205. _delay_ms(5);
  206. lcd_wrcmd(0x38,0);
  207. _delay_us(1);
  208. lcd_wrcmd(0x38,1);
  209. lcd_wrcmd(0x08,1);
  210. lcd_cls();

  211.     lcd_wrcmd(0x06,1);
  212.     lcd_wrcmd(0x0e,1);

  213. #else    //4位數據線
  214. LCD_CZDDR=1<<LCD_E|1<<LCD_RS|1<<LCD_RW;
  215. LCDDDR=0xf0;
  216. _delay_ms(15);
  217. lcd_wrcmd(0x38,0);   
  218. _delay_ms(5);
  219. lcd_wrcmd(0x38,0);   
  220. _delay_ms(5);
  221. lcd_wrcmd(0x38,0);
  222. _delay_us(1);
  223. lcd_wrcmd(0x38,1);
  224. lcd_wrcmd(0x02,1);
  225. lcd_wrcmd(0x28,1);
  226. lcd_cls();
  227. lcd_wrcmd(0x06,1);
  228.     lcd_wrcmd(0x0e,1);


  229. #endif

  230.    
  231. }


  232. #if (_LCD_DEF==1)
  233. //定義CGRAM的值,在功能開啟后再主文件加入如下面字符串數組定義
  234. const uchar lcd_cgram[64]=
  235. {
  236. 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
  237. 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  238. 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
  239. 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
  240. 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
  241. 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
  242. 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
  243. 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00
  244. };

  245. void lcd_def(uchar cg[64])
  246. {
  247.     uchar temp=0;
  248.     lcd_wrcmd(0x40,1);
  249.     while(temp<64)
  250.     {
  251.       lcd_wrdata(cg[temp]);
  252.       temp++;
  253.     }
  254. }
  255. #endif

  256. #endif /*__1602_H_*/
復制代碼





回復

使用道具 舉報

ID:86711 發表于 2015-7-24 13:27 | 顯示全部樓層
十分感謝你的程序,照著你的我改了一份自己的。
回復

使用道具 舉報

ID:86711 發表于 2015-7-24 13:29 | 顯示全部樓層
十分感謝你的程序,照著你的我改了一份自己的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜影院在线观看免费 | 国产精品毛片 | 国产高清自拍视频在线观看 | 久久久久国产精品午夜一区 | 国产无人区一区二区三区 | 久久国产区 | 久久精品二区 | 中文字幕人成乱码在线观看 | 日韩欧美手机在线 | 精品欧美一区二区在线观看 | 欧美日韩高清在线一区 | 中国一级毛片免费 | 在线免费看黄 | 在线观看视频91 | 久久精品久久精品 | 五月激情婷婷网 | 精品视频一区二区三区在线观看 | 在线不卡视频 | 久久久精 | 7777精品伊人久久精品影视 | 欧美一区二区三区在线观看视频 | 91视视频在线观看入口直接观看 | 在线观看的av | 欧美一区二区三区在线观看视频 | 一区日韩| 在线看一区二区 | 黄网站色大毛片 | 精品少妇v888av | 日干夜操| 欧美一区视频在线 | 日韩精品视频在线免费观看 | www国产成人免费观看视频,深夜成人网 | 国产一区二区在线免费 | 日韩久久精品视频 | 日本久久一区 | 综合久久久久 | 欧美视频中文字幕 | 电影91久久久| 亚洲人在线观看视频 | 欧美伊人久久久久久久久影院 | 在线观看视频一区 |