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

QQ登錄

只需一步,快速開始

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

ATmega16的lcd12864顯示程序及proteus仿真工程文件

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-9-8 20:48 | 顯示全部樓層 |閱讀模式
分享一些ATmega16的基本的lcd12864顯示函數(shù),可能對(duì)大家的學(xué)習(xí)有用.仿真文件可以從本帖附件下載
0.png


  1. #include<iom16v.h>
  2. #include<macros.h>
  3. #include"12864.h"
  4. #include"main.h"

  5. void port_init(void)
  6. {
  7. DDRC=0xFF;                 //12864數(shù)據(jù)口,置為輸出
  8. PORTC=0xFF;

  9. en_out;   //置EN輸出
  10. rw_out;   //置rw輸出
  11. rs_out;   //置rs輸出
  12. cs1_out;//置cs1輸出
  13. cs2_out;//置cs2輸出
  14. }

  15. /***
  16. ******12864寫命令函數(shù)
  17. ***/
  18. void lcd_write_com(uchar com)
  19. {
  20.         rw_clr;                           //寫操作
  21.         delay_us(3);
  22.         rs_clr;                          //寫數(shù)據(jù)        
  23.         PORTC=com;
  24.         en_set;
  25.         delay_us(3);
  26.         en_clr;
  27. }

  28. /***
  29. ******12864寫數(shù)據(jù)函數(shù)
  30. ***/
  31. void lcd_write_date(uchar date)
  32. {
  33.         rw_clr;            //寫操作
  34.         delay_us(3);  
  35.         rs_set;   //寫數(shù)據(jù)
  36.         PORTC=date;
  37.         en_set;
  38.         delay_us(3);
  39.         en_clr;
  40. }

  41. /***
  42. ******12864確定位置數(shù)據(jù)函數(shù)
  43. ******頁地址:x范圍0-7
  44. ******列地址:y范圍0-63
  45. ***/
  46. void lcd_setxy(uchar x,uchar y)
  47. {
  48.         lcd_write_com(0xb8+x);
  49.         lcd_write_com(0x40+y);
  50. }

  51. /***
  52. ******12864寫一個(gè)字母或數(shù)字函數(shù)
  53. ******頁地址:x范圍0-3
  54. ******列地址:y范圍0-15
  55. ***/
  56. void lcd_write_ch(uchar x,uchar y,const uchar *ch)
  57. {
  58.         uchar i,j;
  59.         if(y<8)                        //判斷列地址,如果小于8列,顯示在左屏
  60.         {
  61.                 cs1_clr;        //        CS1=0;
  62.             cs2_set;        //  CS2=1;
  63.         }
  64.         else                         //判斷列地址,如果大于8列,顯示在右屏
  65.         {
  66.         
  67.                 cs1_set;        //  CS1=1;
  68.                 cs2_clr;        //  CS2=0;
  69.                 y=y-8;
  70.         }
  71.         for(i=0;i<2;i++)
  72.         {
  73.                  lcd_setxy(x*2+i,y*8);                                  // x*2+i的意思是每個(gè)字符占用兩頁,一共可以顯示4行(一共8頁)
  74.                                                                                               // y*8 的意思是每次寫入的列都是8的整數(shù)倍
  75.                  for(j=0;j<8;j++)
  76.                  {
  77.                           lcd_write_date(ch[i*8+j]) ;           //一共16個(gè)字節(jié)
  78.                          delay_us(1);
  79.                  }
  80.         }
  81.         cs1_clr;                 //    CS1=0;
  82.         cs2_clr;                 //    CS2=0;
  83. }

  84. /***
  85. ******12864寫一個(gè)漢字函數(shù)
  86. ******頁地址:x范圍0-3
  87. ******列地址:y范圍0-7
  88. ***/
  89. void lcd_write_hanzi(uchar x,uchar y,const uchar *dat)
  90. {
  91.         uchar i,j;
  92.         if(y<4)
  93.         {
  94.                 cs1_clr;                   //CS1=0;
  95.                 cs2_set;               //CS2=1;
  96.         }
  97.         else
  98.         {
  99.         cs1_set;                //CS1=1;
  100.                 cs2_clr;                //CS2=0;
  101.                 y-=4;
  102.         }

  103.         for(i=0;i<2;i++)
  104.         {
  105.                 lcd_setxy(x*2+i,y*16);                                  // x*2+i的意思是每個(gè)漢字占用兩頁,一共可以顯示4行(一共8頁)
  106.                 delay_us(1);                                                //每次寫入都是16的倍數(shù)列
  107.                 for(j=0;j<16;j++)
  108.                 {
  109.                         lcd_write_date(dat[i*16+j]) ;           //一共16個(gè)字節(jié)
  110.                         delay_us(3);
  111.                 }        
  112.         }
  113.         cs1_clr;                        //CS1=0;
  114.         cs2_clr;                        //CS2=0;
  115. }

  116. /***
  117. ******12864寫一行字符函數(shù)
  118. ******頁地址:x范圍0-3
  119. ******列地址:y范圍0-15
  120. ******字符數(shù):0-15
  121. ***/
  122. void lcd_write_str_hang(uchar x,uchar y,const uchar *ch,uchar n)
  123. {
  124.         uchar i;
  125.         for(i=0;i<n;i++)
  126.         {
  127.                 lcd_write_ch(x,y,ch+16*i);        //指針相加
  128.                 y++;
  129.                 delay_us(3);        
  130.         }
  131. }


  132. /***
  133. ******12864寫一行漢字函數(shù)
  134. ******頁地址:x范圍0-3
  135. ******列地址:y范圍0-7
  136. ******字符數(shù):0-7
  137. ***/
  138. void lcd_write_hanzi_hanzi_hang(uchar x,uchar y,const uchar *date,uchar n)
  139. {
  140.         uchar i;
  141.         for(i=0;i<n;i++)
  142.         {
  143.                 lcd_write_hanzi(x,y,date+i*32);
  144.                 //注意理解ch+i*32:指的是數(shù)組指向下 i*32個(gè)數(shù)組
  145.                 y++;        
  146.                 delay_us(3);
  147.         }
  148. }

  149. /***
  150. ******12864寫一個(gè)字母或數(shù)字反白函數(shù)
  151. ******頁地址:x范圍0-3
  152. ******列地址:y范圍0-15
  153. ***/
  154. void lcd_write_ch_fb(uchar x,uchar y,const uchar *ch)
  155. {
  156.         uchar i,j;
  157.         if(y<8)
  158.         {
  159.                 cs1_clr;                   //CS1=0;
  160.                 cs2_set;                   //CS2=1;
  161.         }
  162.         else
  163.         {
  164.                 cs1_set;                   //CS1=1;
  165.                 cs2_clr;                   //CS2=0;
  166.                 y-=8;
  167.         }
  168.         
  169.         for(i=0;i<2;i++)
  170.         {
  171.                 lcd_setxy(x*2+i,y*8);               
  172.                 {
  173.                         for(j=0;j<8;j++)
  174.                         {
  175.                                 lcd_write_date(255-ch[i*8+j]) ;           //一共16個(gè)字節(jié)        
  176.                                 delay_us(3);
  177.                         }
  178.                 }
  179.         }
  180.         cs1_clr;                                 //CS1=0;
  181.         cs2_clr;                                //CS2=0;        
  182. }

  183. /***
  184. ******12864寫一行字母或數(shù)字反白函數(shù)
  185. ******頁地址:x范圍0-3
  186. ******列地址:y范圍0-15
  187. ***/
  188. void lcd_write_str_fb(uchar x,uchar y,const uchar *ch,uchar n)
  189. {
  190. uchar i;
  191. for(i=0;i<n;i++)
  192. {
  193.   lcd_write_ch_fb(x,y,ch+i*16);
  194.         y++;
  195.         delay_us(3);
  196. }
  197. }
  198. /***
  199. ******12864寫一個(gè)漢字反白顯示函數(shù)
  200. ******頁地址:x范圍0-3
  201. ******列地址:y范圍0-7
  202. ******字符數(shù): n范圍0-7
  203. ***/
  204. void lcd_write_hanzi_fb(uchar x,uchar y,const uchar *date)
  205. {
  206.         uchar i,j;
  207.         if(y<4)
  208.         {
  209.                 cs1_clr;                          //CS1=0;
  210.                 cs2_set;                          //CS2=1;
  211.         }
  212.         else
  213.         {
  214.                 cs1_set;                          //CS1=1;
  215.                 cs2_clr;                          //CS2=0;
  216.                 y-=4;
  217.         }

  218.         for(i=0;i<2;i++)
  219.         {
  220.                 lcd_setxy(x*2+i,y*16);        
  221.                 for(j=0;j<16;j++)
  222.                 {
  223.                         lcd_write_date(255-date[i*16+j]) ;           //一共16個(gè)字節(jié)        
  224.                         delay_us(3);
  225.                 }        
  226.         }
  227.         cs1_clr;                                 //CS1=0;
  228.         cs2_clr;                                //CS2=0;
  229. }

  230. /***
  231. ******12864寫一行漢字反白顯示函數(shù)
  232. ******頁地址:x范圍0-3
  233. ******列地址:y范圍0-7
  234. ******字符數(shù): n范圍0-7
  235. ***/
  236. void lcd_write_hanzi_hang_fb(uchar x,uchar y,const uchar *date,uchar n)
  237. {
  238.         uchar i;
  239.         for(i=0;i<n;i++)
  240.         {
  241.                  lcd_write_hanzi_fb(x,y,date+i*32);
  242.                 y++;
  243.                 delay_us(3);
  244.         }
  245. }

  246. /***
  247. ******12864初始化函數(shù)
  248. ***/
  249. void lcd_init(void)
  250. {
  251.         lcd_write_com(0x3f);           //開顯示開關(guān)
  252.         lcd_write_com(0xc0);        //LCD行初始地址,共64行
  253.         lcd_write_com(0xb8);        //LCD頁初始地址         共8頁
  254.         lcd_write_com(0x40);        //LCD列初始地址,共64列
  255. }

  256. /***
  257. ******12864清屏函數(shù)
  258. ***/
  259. void lcd_clear_csr(void)
  260. {
  261.         uchar i,j;
  262. //        CS1=0;
  263.         cs1_clr;
  264. //  CS2=1;
  265.         cs2_set;
  266.         for(i=0;i<8;i++)                                  //清除左屏
  267.         {
  268.                 lcd_setxy(i,0);
  269.                 for(j=0;j<64;j++)
  270.                 {
  271.                         lcd_write_date(0) ;
  272.                         delay_us(1);
  273.                 }
  274.                 lcd_setxy(0,0);        
  275.         }

  276.         //CS1=1;
  277.         cs1_set;                                                            //清除右屏
  278.         //CS2=0;
  279.         cs2_clr;
  280.         for(i=0;i<8;i++)
  281.         {
  282.                 lcd_setxy(i,0);
  283.                 for(j=0;j<64;j++)
  284.                 {
  285.                         lcd_write_date(0) ;
  286.                         delay_us(1);
  287.                 }
  288.                 lcd_setxy(0,0);        
  289.         }
  290. }

  291. /***
  292. ******12864清除一行顯示函數(shù)
  293. ****        x :0-3
  294. ***/
  295. void lcd_clear_hang(uchar x)
  296. {
  297.         uchar i,j;
  298.         cs1_clr;  //CS1=0;                //左屏
  299.         cs2_set;  //CS2=1;
  300.         for(i=0;i<2;i++)
  301.         {
  302.                 lcd_setxy(x*2+i,0);
  303.                 delay_us(2);
  304.                 for(j=0;j<64;j++)
  305.                 {
  306.                         lcd_write_date(0);
  307.                         delay_us(2);
  308.                 }        
  309.         }

  310.         cs1_set;                        //CS1=1;  右屏
  311.         cs2_clr;                        //CS2=0;
  312.         for(i=0;i<2;i++)
  313.         {
  314.                 lcd_setxy(x*2+i,0);
  315.                 delay_us(2);
  316.                 for(j=0;j<64;j++)
  317.                 {
  318.                         lcd_write_date(0);
  319.                         delay_us(2);
  320.                 }        
  321.         }
  322. }

復(fù)制代碼


0.png

所有資料下載:
12864顯示avr單片機(jī).rar (68.2 KB, 下載次數(shù): 117)

回復(fù)

使用道具 舉報(bào)

ID:210735 發(fā)表于 2018-6-4 16:32 | 顯示全部樓層
不錯(cuò)好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:29256 發(fā)表于 2018-10-8 20:47 | 顯示全部樓層
正好可以參考
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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