找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5947|回复: 2
收起左侧

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

[复制链接]
ID:137190 发表于 2016-9-8 20:48 | 显示全部楼层 |阅读模式
分享一些ATmega16的基本的lcd12864显示函数,可能对大家的学习有用.仿真文件可以从本帖附件下载
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数据口,置为输出
  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写命令函数
  17. ***/
  18. void lcd_write_com(uchar com)
  19. {
  20.         rw_clr;                           //写操作
  21.         delay_us(3);
  22.         rs_clr;                          //写数据        
  23.         PORTC=com;
  24.         en_set;
  25.         delay_us(3);
  26.         en_clr;
  27. }

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

  41. /***
  42. ******12864确定位置数据函数
  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写一个字母或数字函数
  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的意思是每个字符占用两页,一共可以显示4行(一共8页)
  74.                                                                                               // y*8 的意思是每次写入的列都是8的整数倍
  75.                  for(j=0;j<8;j++)
  76.                  {
  77.                           lcd_write_date(ch[i*8+j]) ;           //一共16个字节
  78.                          delay_us(1);
  79.                  }
  80.         }
  81.         cs1_clr;                 //    CS1=0;
  82.         cs2_clr;                 //    CS2=0;
  83. }

  84. /***
  85. ******12864写一个汉字函数
  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的意思是每个汉字占用两页,一共可以显示4行(一共8页)
  106.                 delay_us(1);                                                //每次写入都是16的倍数列
  107.                 for(j=0;j<16;j++)
  108.                 {
  109.                         lcd_write_date(dat[i*16+j]) ;           //一共16个字节
  110.                         delay_us(3);
  111.                 }        
  112.         }
  113.         cs1_clr;                        //CS1=0;
  114.         cs2_clr;                        //CS2=0;
  115. }

  116. /***
  117. ******12864写一行字符函数
  118. ******页地址:x范围0-3
  119. ******列地址:y范围0-15
  120. ******字符数: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写一行汉字函数
  134. ******页地址:x范围0-3
  135. ******列地址:y范围0-7
  136. ******字符数: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:指的是数组指向下 i*32个数组
  145.                 y++;        
  146.                 delay_us(3);
  147.         }
  148. }

  149. /***
  150. ******12864写一个字母或数字反白函数
  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个字节        
  176.                                 delay_us(3);
  177.                         }
  178.                 }
  179.         }
  180.         cs1_clr;                                 //CS1=0;
  181.         cs2_clr;                                //CS2=0;        
  182. }

  183. /***
  184. ******12864写一行字母或数字反白函数
  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写一个汉字反白显示函数
  200. ******页地址:x范围0-3
  201. ******列地址:y范围0-7
  202. ******字符数: 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个字节        
  224.                         delay_us(3);
  225.                 }        
  226.         }
  227.         cs1_clr;                                 //CS1=0;
  228.         cs2_clr;                                //CS2=0;
  229. }

  230. /***
  231. ******12864写一行汉字反白显示函数
  232. ******页地址:x范围0-3
  233. ******列地址:y范围0-7
  234. ******字符数: 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初始化函数
  248. ***/
  249. void lcd_init(void)
  250. {
  251.         lcd_write_com(0x3f);           //开显示开关
  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清屏函数
  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清除一行显示函数
  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. }

复制代码


0.png

所有资料下载:
12864显示avr单片机.rar (68.2 KB, 下载次数: 117)
回复

使用道具 举报

ID:210735 发表于 2018-6-4 16:32 | 显示全部楼层
不错好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:29256 发表于 2018-10-8 20:47 | 显示全部楼层
正好可以参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表