找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1898|回复: 1
打印 上一主题 下一主题
收起左侧

lcd12864不带字库的改成带字库的单片机程序后出现语法错误

[复制链接]
跳转到指定楼层
楼主

  1. #ifndef _12864_H__
  2. #define _12864_H__        
  3. #define uchar unsigned char
  4. #define LCD_data  P0             //数据口
  5. sbit RS=P2^2;            //寄存器选择输入
  6. sbit RW=P2^1;            //液晶读/写控制
  7. sbit E=P2^0;            //液晶使能控制
  8. sbit PSB=P2^3;            //串/并方式控制
  9. /*1ms延时程序*/
  10. void delay1ms(uint k)
  11. {
  12.   k=k*125;
  13.   while(k--);
  14. }
  15. /*12864判忙 */
  16. void chekbusy12864(void)
  17. {
  18.   uchar dat;
  19.   EX0=0;
  20.   RS=0;       //指令模式
  21.   RW=1;       //读数据
  22. do{
  23.    P0=0x00;                         //
  24.    E=1;
  25.    dat=P0&0x80;
  26.    E=0;
  27.   }while(dat!=0x00);
  28.   EX0=1;
  29. }
  30. }  
  31. /******写命令*****/
  32. void cmd_w12864(uchar cmd)                //写命令
  33. {
  34.   chekbusy12864();
  35.   EX0=0;
  36.   RS=0;                    //指令模式
  37.   RW=0;             //写模式
  38.   E=1;
  39.   P0=cmd;
  40.   E=0;
  41.   EX0=1;
  42. }
  43. /****写数据******/
  44. void  dat_w12864(uchar dat)
  45. {
  46.   chekbusy12864();
  47.   EX0=0;
  48.   RS=1;
  49.   RW=0;
  50.   E=1;
  51.   P0=dat;
  52.   E=0;
  53.   EX0=1;
  54. }
  55. /*****清屏*****/
  56. void clear12864(void)
  57. {
  58.   uchar page,row;
  59.   for(page=0xb8;page<0xc0;page++)
  60.   {
  61.     cmd_w12864(page);
  62.         cmd_w12864(0x40);
  63.         for(row=0;row<64;row++)
  64.          {
  65.            dat_w12864(0x00);          //对12864所有地址全部写零
  66.          }
  67.   }
  68. }
  69. /***初始化****/
  70. void init12864(void)
  71. {
  72.   chekbusy12864();
  73.   cmd_w12864(0xc0);          //从第零行开始显示
  74.   cmd_w12864(0x3f);          //LCD显示RAM中的内容
  75. }
  76. /**8X16字符的显示**/
  77. void play8(uchar ch,uchar row,uchar page,uchar *adr)
  78. {
  79.   uchar i;
  80.   choose12864(ch);
  81.   page=page<<1;                           //程序中采用的位移运算代替乘法运算,这样可以大大降低处理器的负担
  82.   row=row<<3;
  83.   cmd_w12864(row+0x40);
  84.   cmd_w12864(page+0xb8);
  85.   for(i=0;i<8;i++)
  86.   {
  87.     dat_w12864(*(adr+i));
  88.   }
  89.   cmd_w12864(row+0x40);
  90.   cmd_w12864(page+0xb9);
  91.   for(i=8;i<16;i++)
  92.   {
  93.     dat_w12864(*(adr+i));
  94.   }
  95. }
  96. /**16X16显示**/
  97. void play16(uchar ch,uchar row,uchar page,uchar *adr)
  98. {
  99.   uchar i;
  100.   choose12864(ch);
  101.   page=page<<1;                                          
  102.   row=row<<3;
  103.   cmd_w12864(row+0x40);
  104.   cmd_w12864(page+0xb8);
  105.   for(i=0;i<16;i++)
  106.   {
  107.     dat_w12864(*(adr+i));
  108.   }
  109.   cmd_w12864(row+0x40);
  110.   cmd_w12864(page+0xb9);
  111.   for(i=16;i<32;i++)
  112.   {
  113.     dat_w12864(*(adr+i));
  114.   }
  115. }
  116. uchar dat_r12864(uchar page,uchar arrange)  //page页地址.arrange列地址)
  117. {
  118.   uchar dat;
  119.   chekbusy12864();
  120.   EA=0;
  121.   cmd_w12864(page+0xb8);
  122.   cmd_w12864(arrange+0x40);
  123.   EX0=0;                                                
  124.   P0=0xff;
  125.   RW=1;
  126.   RS=1;
  127.   E=1;
  128.   E=0;                                 //12864读数据时第二次读才有效,第一次读取的值不采集
  129.   E=1;
  130.   dat=P0;
  131.   E=0;
  132.   EA=1;
  133.   return(dat);
  134.   //EX0=1;

  135.   }
  136.   //反白显示
  137. void play16_fb(uchar ch,uchar arrange,uchar page)
  138. {
  139.    uchar i;
  140.    uchar xdata dat_fb[32];
  141.    choose12864(ch);
  142.    for(i=0;i<16;i++)
  143.    {
  144.      dat_fb[i]=~(dat_r12864((page<<1),((arrange<<3)+i)));
  145.          dat_fb[i+16]=~(dat_r12864((page<<1)+1,((arrange<<3)+i)));
  146.         }
  147.    play16(ch,arrange,page,dat_fb);
  148. }
  149.   /**竖线**/
  150. void vertical(uchar y1,uchar y2,uchar x)//y1表示起点,y2表示终点
  151. {
  152.   uchar i,sum=0;
  153.   if(x>63)
  154.    {
  155.      choose12864(1);                                         //y1比y2小,这里给出画竖线的函数而不用画点的方法
  156.      x=x-64;                                                         //是为了减少单片机的处理负担。
  157.    }
  158.    else
  159.    {
  160.      choose12864(0);
  161.    }
  162.   if((y1/8)!=(y2/8))
  163.   {
  164.    for(i=0;i<(8-y1%8);i++)         
  165.    {
  166.       sum=sum|((2<<((y1%8)+i)));
  167.    }
  168.   cmd_w12864(x+0x40);
  169.   cmd_w12864(y1/8+0xb8);
  170.   dat_w12864(sum);
  171.   sum=0;
  172.    for(i=0;i<(y2/8-y1/8-1);i++)
  173.     {
  174.      cmd_w12864(x+0x40);
  175.          cmd_w12864((y1/8)+0xb9+i);
  176.          dat_w12864(0xff);
  177.     }
  178.   for(i=0;i<=(y2%8);i++)
  179.    {
  180.      sum=sum|(2<<i);
  181.    }
  182.    cmd_w12864(x+0x40);
  183.    cmd_w12864(y2/8+0xb8);
  184.    dat_w12864(sum|1);
  185.    sum=0;        
  186. }
  187. else
  188. {
  189.    for(i=0;i<=y2-y1;i++)
  190.     {
  191.           sum=sum|(2<<(i+(y1%8)));
  192.         }
  193.         cmd_w12864(0x40|x);
  194.         cmd_w12864(0xb8|(y1/8));
  195.         dat_w12864(sum);
  196. }
  197. }
  198. /**点的显示**/
  199. void dot(uchar x,uchar y)
  200. {
  201.   uchar dat;
  202.   if(x>63)
  203.   {
  204.     choose12864(1);
  205.         x=x-64;
  206.   }
  207.   else
  208.   {
  209.     choose12864(0);
  210.   }
  211.   dat=dat_r12864(y/8,x);
  212.   cmd_w12864(0x40|x);
  213.   cmd_w12864(0xb8|y/8);
  214.   dat_w12864((1<<(y%8))|dat);
  215. }
  216. /**温度对图形的转换**/
  217. void play(void)
  218. {
  219.   static uchar n=63;
  220.   uchar i,m,sum=0;
  221.   m=temp[0]*10+temp[1]+(temp[2]+5)/10;
  222.   if(m<60)
  223.   {
  224.    m=62-m;
  225.    if(m<n)
  226.    {
  227.     vertical(m,63,124);
  228.     }
  229.    if(m>n)
  230.    {
  231.     if((m/8)>(n/8))
  232.         {
  233.           cmd_w12864(n/8+0xb8);
  234.           cmd_w12864(0x40+60);
  235.           dat_w12864(0x00);
  236.            }
  237.         for(i=0;i<(8-m%8);i++)
  238.            {
  239.                     sum=sum+(2<<((m%8)+i));
  240.            }
  241.          cmd_w12864(m/8+0xb8);
  242.          cmd_w12864(0x40+60);
  243.          dat_w12864(sum);
  244.          n=m;
  245.   }
  246.   dot(60,3);
  247. }                  
  248. }                                         
  249. clear8(uchar x,uchar y,uchar ch)
  250. {
  251.   uchar i;
  252.   choose12864(ch);
  253.   cmd_w12864(x*8+0x40);
  254.   cmd_w12864(y+0xb8);
  255.   for(i=0;i<8;i++)
  256.    {
  257.      dat_w12864(0x00);
  258.    }
  259.    cmd_w12864(x*8+0x40);
  260.    cmd_w12864(y+0xb9);
  261.   for(i=0;i<16;i++)
  262.    {
  263.       dat_w12864(0x00);
  264.    }
  265. }
  266. /**4X4个点合为一个**/
  267. void change(uchar *x,uchar *y)     //x<24  y<15
  268. {
  269.   uchar i,m,n;                                           //24和15分别表示游戏的范围
  270.   if(*x<24&&*y<15)                                   //这里的点是个有花色的点而不是一个实心的点
  271.   {
  272.    m=(*x)<<2;
  273.    n=((*y)<<2)+2;
  274.    for(i=0;i<4;i++)
  275.    {
  276.     dot(31+m,n+i);
  277.         dot(34+m,n+i);
  278.    }
  279.    dot(32+m,n);                 
  280.    dot(32+m,n+1);
  281.    dot(32+m,n+3);
  282.    dot(33+m,n);
  283.    dot(33+m,n+2);
  284.    dot(33+m,n+3);
  285.   }
  286. }
  287. /**4X4个点合为一个**/
  288. void change1(uchar x,uchar y)     //x<24  y<15
  289. {

  290.   uchar i,m,n;        
  291.   EA=0;                                                //24和15分别表示游戏的范围
  292.   if(x<24&&y<15)                                   //这里的点是个有花色的点而不是一个实心的点
  293.   {
  294.    m=(x)<<2;
  295.    n=(y<<2)+2;
  296.    for(i=0;i<4;i++)
  297.    {
  298.     dot(31+m,n+i);
  299.         dot(34+m,n+i);
  300.    }
  301.    dot(32+m,n);
  302.    dot(32+m,n+1);
  303.    dot(32+m,n+3);
  304.    dot(33+m,n);
  305.    dot(33+m,n+2);
  306.    dot(33+m,n+3);
  307.   }
  308.   EA=1;

  309. }


  310. void cleardot(uchar x,uchar y)
  311. {
  312.   uchar dat,j;
  313.   if(x>63)
  314.   {
  315.     choose12864(1);
  316.         x=x-64;
  317.   }
  318.   else
  319.   {
  320.     choose12864(0);
  321.   }
  322.   dat=dat_r12864(y/8,x);
  323.   cmd_w12864(0x40|x);
  324.   cmd_w12864(0xb8|(y/8));
  325.   j=~(1<<(y%8));
  326.   dat_w12864(dat&j);
  327. }
  328. /*清除一个4X4的点*/
  329. void clear(uchar *x,uchar *y)
  330. {
  331.   uchar i,m,n;
  332.   m=((*x)<<2)+31;
  333.   n=((*y)<<2)+2;
  334.   for(i=0;i<4;i++)
  335.   {
  336.     cleardot(m,n+i);
  337.         cleardot(m+1,n+i);
  338.         cleardot(m+2,n+i);
  339.         cleardot(m+3,n+i);
  340.   }
  341. }  /**清除一个点**/
  342. /*清除一个4X4的点*/
  343. void clear1(uchar x,uchar y)
  344. {
  345.   uchar i,m,n;
  346.   if(x>=0&&x<24&&y>=0&&y<15)
  347.   {
  348.    m=((x)<<2)+31;
  349.    n=((y)<<2)+2;
  350.    for(i=0;i<4;i++)
  351.    {
  352.     cleardot(m,n+i);
  353.         cleardot(m+1,n+i);
  354.         cleardot(m+2,n+i);
  355.         cleardot(m+3,n+i);
  356.    }
  357.   }
  358. }  /**清除一个点**/
  359. bit readfk(char x,char y)
  360. {
  361.   bit flagfk=0;
  362.   uchar m,n;
  363.   if(y>=0)
  364.   {
  365.   m=(x<<2)+31;
  366.   n=(y<<2)+2;
  367.   choose12864(0);
  368.   if(m>63)
  369.   {
  370.    m=m-64;
  371.    choose12864(1);
  372.   }                                                                                                                                                               
  373.   m=dat_r12864(n>>3,m);
  374.   if((n%8)==2)
  375.   {
  376.     if((m&0x3c)==0x3c)
  377.         {
  378.           flagfk=1;
  379.          }
  380.         else
  381.         {
  382.           flagfk=0;
  383.         }
  384.   }
  385.    if((n%8)==6)
  386.    {
  387.     if((m&0xc0)==0xc0)
  388.         {flagfk=1;

  389.         }
  390.         else
  391.         {flagfk=0;}
  392.    }
  393.   }
  394.   return(flagfk);

  395. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:312965 发表于 2018-4-30 11:22 | 只看该作者
我把原来不带字库的改成带字库的就变成这样了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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