找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制1602液晶的程序,想问下错哪了

[复制链接]
跳转到指定楼层
楼主
编译没通过,求大神帮忙看下
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. unsigned char code a[]={0xfe,0xfd,0xfb,0xf7};
  4. sbit ALAM=P2^5;
  5. sbit open_led=P2^3;
  6. unsigned char countt0,second;
  7. unsigned char code name[]= {"===Coded Locked==="};
  8. unsigned char code start_line[]= {"password:"};
  9. unsigned char code Error[]={"error"};
  10. unsigned char code codepass[]={"pass"};
  11. unsigned char code LockOpen[]={"open"};
  12. char InputData[6];
  13. unsigned char CurrentPassword[6]={6,5,4,3,2,1};
  14. unsigned char N=0;
  15. unsigned char ErrorCont;

  16. sbit  LcdRS=P2^0;
  17. sbit  LcdRW=P2^1;
  18. sbit  LcdEn=P2^2;
  19. sfr   LcdIO=0x80;

  20. #define LCD_COMMAND 0;
  21. #define LCD_DATA 1;
  22. #define LCD_CLEAR_SCREEN 0x01;
  23. #define LCD_HOME 0x02;






  24. void Delay_short(unsigned int n)
  25. {
  26.   unsigned int i;
  27.   for(i=0;i<n;i++);
  28. }

  29. void Delay_long(unsigned char N)

  30. {
  31.   unsigned char i;
  32.   unsigned int j;
  33.   for(i=0;i<N;i++)
  34.     for(j=0;j<315;j++);
  35. }

  36. void Delay5Ms(void)
  37. {
  38.   unsigned int TempCyc=5552;
  39.   while(TempCyc--);
  40. }

  41. void Delay400Ms(void)
  42. {
  43.   unsigned char TempCycA=5;
  44.   unsigned int TempCycB;
  45.   while(TempCycA--)
  46.    {
  47.      TempCycB=7269;
  48.      while(TempCycB--);
  49.    }
  50. }








  51. void LCD_Write(bit style,unsigned char input)
  52. {
  53.    LcdRS=style;
  54.    LcdRW=0;
  55.    LcdIO=input;
  56.    Delay_short(10);
  57.    LcdEn=1;
  58.    Delay_short(10);
  59.    LcdEn=0;
  60. }


  61. void LCD_Initial()
  62. {
  63.   Delay_long(6);
  64.   LCD_Write(LCD_COMMAND,0x38);
  65.   LCD_Write(LCD_COMMAND,0x38);
  66.   LCD_Write(LCD_COMMAND,0x38);
  67.   Delay_short(2);
  68.   LCD_Write(LCD_COMMAND,0x0c);
  69.   Delay_short(2);
  70.   LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);
  71.   Delay_short(100);
  72.   LCD_Write(LCD_COMMAND,0x06);
  73. }


  74. //液晶字符输入定位
  75. void GotoXY(unsigned char x,unsigned char y)
  76. {
  77.   unsigned char address;
  78.   if(y==1)
  79.     address=0x80+x;
  80.   else
  81.     address=0xc0+x;
  82.   LCD_Write(LCD_COMMAND,address);
  83. }


  84. //字符串输出液晶显示
  85. void Print(unsigned char *str)
  86. {
  87.   while(*str!='\0')
  88.   {
  89.   LCD_Write(LCD_DATA,*str);
  90.   str++;
  91.   }
  92. }

  93. //按键值编码为数值的程序
  94. unsigned char coding(unsigned char m)
  95. {
  96. unsigned char k;
  97. switch(m)
  98. {
  99.   case (0x18):k='*';break;
  100.   case (0x28):k=0;break;
  101.   case (0x48):k='#';break;
  102.   case (0x88):k='D';break;
  103.   case (0x14):k=3;break;
  104.   case (0x24):k=6;break;
  105.   case (0x44):k=9;break;
  106.   case (0x84):k='C';break;
  107.   case (0x12):k=2;break;
  108.   case (0x22):k=5;break;
  109.   case (0x42):k=8;break;
  110.   case (0x82):k='B';break;
  111.   case (0x11):k=1;break;
  112.   case (0x21):k=4;break;
  113.   case (0x41):k=7;break;
  114.   case (0x81):k='A';break;
  115. }
  116.   return(k);
  117. }

  118. //按键检测并返回健值
  119. unsigned char keynum(void)
  120. {
  121. unsigned char row,col,i;
  122. P3=0xf0;
  123. if((P3&0xf0)!=0xf0)
  124.   {
  125.     Delay5Ms();
  126.     Delay5Ms();
  127.     if((P3&0xf0)!=0xf0)
  128.      {
  129.       row=P3^0xf0;
  130.       i=0;
  131.       P3=a[i];
  132.       while(i<4)
  133.         {
  134.           if((P3&0xf0)!=0xf0)
  135.            {
  136.              col=~(P3&0xff);
  137.              break;
  138.            }
  139.           else
  140.            {
  141.             i++;
  142.             P3=a[i];
  143.            }
  144.         }
  145.      }
  146.   else
  147.      return 0xff;

  148.     while((P3&0xf0)!=0xf0);
  149.     return (row|col);  
  150.   }
  151. else return 0xff;
  152. }

  153. //一声提示音表示有效输入
  154. void OneAlam(void)
  155. {
  156.   ALAM=0;
  157.   Delay5Ms();
  158.   ALAM=1;
  159. }
  160. //二声提示音表示操作成功
  161. void TwoAlam(void)
  162. {
  163.    ALAM=0;
  164.   Delay5Ms();
  165.   ALAM=1;
  166.   Delay5Ms();
  167.    ALAM=0;
  168.   Delay5Ms();
  169.   ALAM=1;
  170. }
  171. //三声提示音表示错误
  172. void ThreeAlam(void)
  173. {
  174.   ALAM=0;
  175.   Delay5Ms();
  176.   ALAM=1;
  177.   Delay5Ms();
  178.   ALAM=0;
  179.   Delay5Ms();
  180.   ALAM=1;
  181.   Delay5Ms();
  182.   ALAM=0;
  183.   Delay5Ms();
  184.   ALAM=1;
  185. }
  186. //输入密码超过三遍报警
  187. void Alam_KeyUnable(void)
  188. {
  189.   P3=0x00;
  190.   {
  191.     ALAM=~ALAM;
  192.     Delay5Ms();
  193.   }
  194. }


  195. //取消所有操作ESC
  196. void Cancel(void)
  197. {
  198.   unsigned char i;
  199.   GotoXY(0,2);
  200.   Print(start_line);
  201.   TwoAlam();
  202.   for(i=0;i<6;i++)
  203.      InputData[i]=0;
  204.   ALAM=1;
  205.   ErrorCont=0;
  206.   open_led=1;
  207.   N=0;
  208. }

  209. //确认键ok
  210. void Ensure(void)
  211. {
  212.   unsigned char i,j;
  213.   for(i=0;i<6;)
  214.   {
  215.      if(CurrentPassword[i]==InputData[i])
  216.         i++;
  217.      else
  218.       {
  219.         ErrorCont++;
  220.         if(ErrorCont==3)
  221.          {
  222.            GotoXY(0,2);
  223.            Print("KeypadLocked!");
  224.            TR0=1;
  225.            do
  226.               Alam_KeyUnable();
  227.            while(TR0);
  228.            return;
  229.          }
  230.         break;
  231.       }
  232.   }
  233.   if(i==6)
  234.   {
  235.     GotoXY(0,2);
  236.     Print(codepass);
  237.     Delay400Ms();
  238.     Delay400Ms();
  239.     GotoXY(0,2);
  240.     Print(LockOpen);
  241.     TwoAlam();
  242.     open_led=0;
  243.     for(j=0;j<6;j++)
  244.         InputData[i]=0;
  245.     while(1);
  246.    }
  247.    else
  248.    {
  249.      GotoXY(0,2);
  250.      Print(Error);
  251.      ThreeAlam();
  252.      Delay400Ms();
  253.      GotoXY(0,2);
  254.      Print(start_line);
  255.      for(j=0;j<6;j++)
  256.        InputData[i]=0;
  257.    }
  258.   N=0;
  259. }

  260. //主函数
  261. void main()
  262. {
  263.   unsigned char KEY_SCAN,NUM;
  264.   unsigned char j;
  265.   P3=0xff;
  266.   TMOD=0x11;
  267.   TL0=0xB0;
  268.   TH0=0x3C;
  269.   EA=1;
  270.   ET0=1;
  271.   TR0=0;
  272.   Delay400Ms();
  273.   LCD_Initial();
  274.   GotoXY(0,1);
  275.   Print(name);
  276.   GotoXY(0,2);
  277.   Print(start_line);
  278.   GotoXY(9,2);
  279.   LCD_Write(LCD_COMMAND,0x0f);
  280.   Delay5Ms();
  281.   N=0;
  282.   while(1)
  283.    {
  284.       if(!TR0)
  285.        KEY_SCAN=keynum();
  286.       else
  287.        KEY_SCAN=0xff;
  288.       if(KEY_SCAN!=0xff)
  289.       {
  290.          NUM=coding(KEY_SCAN);
  291.          switch(NUM)
  292.          {
  293.            case 'A':    ;  break;
  294.            case 'B':    ;  break;
  295.            case 'C':    ;  break;
  296.            case 'D':    ;  break;
  297.            case '*':Cancel();  break;
  298.            case '#':Ensure();  break;
  299.            default:
  300.              {
  301.                if(N<6)
  302.                 {
  303.                   OneAlam();
  304.                   for(j=0;j<=N;j++)
  305.                    {
  306.                      GotoXY(9+j,2);
  307.                      LCD_Write(LCD_DATA,'*');
  308.                    }
  309.                   InputData[N]=NUM;
  310.                    N++;
  311.                 }
  312.                 else
  313.                   N=6;
  314.                 break;
  315.              }
  316.          }
  317.       }
  318.    }
  319. }


  320. //定时器0中断
  321. void time0_int(void) interrupt 1
  322. {
  323.   TL0=0xB0;
  324.   TH0=0x3C;
  325.   countt0++;
  326.   if(countt0==20)
  327.    {
  328.      countt0=0;
  329.      second++;
  330.      if(second==10)
  331.      {
  332.        P3=0xf0;
  333.        TL0=0xB0;
  334.        TH0=0x3C;
  335.        second=0;
  336.        ErrorCont=0;
  337.        GotoXY(0,2);
  338.        Print(start_line);
  339.        TR0=0;
  340.      }

  341.    }
  342. }
复制代码


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

使用道具 举报

沙发
ID:155507 发表于 2020-1-16 19:26 | 只看该作者
给你改了一下试试。
  1. sbit  LcdRS=P2^0;
  2. sbit  LcdRW=P2^1;
  3. sbit  LcdEn=P2^2;
  4. sfr   LcdIO=0x80;  // P0

  5. #define LCD_COMMAND 0          // --->不用加分号
  6. #define LCD_DATA    1          // --->不用加分号
  7. #define LCD_CLEAR_SCREEN 0x01  // --->不用加分号
  8. #define LCD_HOME 0x02          // --->不用加分号
复制代码
回复

使用道具 举报

板凳
ID:584814 发表于 2020-1-16 21:19 | 只看该作者
#define LCD_COMMAND 0;
#define LCD_DATA 1;
#define LCD_CLEAR_SCREEN 0x01;
#define LCD_HOME 0x02;
改成这样试试:
bit LCD_COMMAND=0;
bit LCD_DATA=1;
unsigned char LCD_CLEAR_SCREEN=0x01;
unsigned char LCD_HOME=0x02;
回复

使用道具 举报

地板
ID:282850 发表于 2020-1-17 09:14 | 只看该作者
正确答案:
#define LCD_COMMAND 0;
#define LCD_DATA 1;
#define LCD_CLEAR_SCREEN 0x01;
#define LCD_HOME 0x02;
这些凡是#define的,后边的";"全删除。因为
LCD_Write(LCD_COMMAND,0x0f);
这句编译时被替换成 LCD_Write(0;,0x0f); 0后边有个“;”明显错误。编译错误也指的是这个“;”


回复

使用道具 举报

5#
ID:282850 发表于 2020-1-17 09:27 | 只看该作者
再啰嗦一下,举个例子:
#define DQ1   P1DIR |=BIT5; P1OUT=BIT5
注意中间有个“;” 程序中拉高DQ写成
....
DQ1;
...

如果写成
#define DQ1   P1DIR |=BIT5; P1OUT=BIT5;
程序中拉高DQ写成
....
DQ1
...
这两种都没问题,但是第一种在程序里DQ1;看上去很顺眼。所以养成好习惯是#define后边不带“;”
#define DQ1 P1DIR |=BIT5; P1OUT=BIT5
程序中拉高DQ写
....
DQ1;
...

回复

使用道具 举报

6#
ID:324844 发表于 2020-1-17 10:28 | 只看该作者
angmall 发表于 2020-1-16 19:26
给你改了一下试试。

感谢大佬,才看到
回复

使用道具 举报

7#
ID:324844 发表于 2020-1-17 10:29 | 只看该作者
man1234567 发表于 2020-1-16 21:19
#define LCD_COMMAND 0;
#define LCD_DATA 1;
#define LCD_CLEAR_SCREEN 0x01;

老铁,我知道错哪了,你这样也可以666
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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