找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LCD1602显示编译错误error C129: missing ';' before '_at_0x3b'

[复制链接]
跳转到指定楼层
楼主
编一个LCD1602显示的程序,程序是按教材抄的,编译时出现MAIN.C(15): error C129: missing ';' before '_at_0x3b'这个错误,想知道怎么结决
程序如下
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define PCF8591_WRITE 0x90
  4. #define PCF8591_READ 0x91
  5. sbit SDA=P2^0;
  6. sbit SCL=P2^1;
  7. #define disdata P0
  8. sbit LCD_RS=P2^3;
  9. sbit LCD_RW=P2^4;
  10. sbit LCD_EN=P2^5;
  11. unsigned char code dis1[]="0-.V  1-.V";
  12. unsigned char code dis2[]="2-.V  3-.V";
  13. unsigned int data dis[4];
  14. unsigned char data receivebuf[4];
  15. char code reserve[3]_at_0x3b;
  16. //us延时函数(4.34us)
  17. void delayNOP()
  18. {
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23. }
  24. //ms延时函数
  25. void delayms(unsigned int ms)
  26. {
  27.         unsigned char i;
  28.         while  (ms--)
  29.         {
  30.                 for(i=0;i<114;i++)
  31.                 ;
  32.         }
  33. }
  34. //检查LCD忙状态
  35. bit lcd_busy()
  36. {
  37.         bit result;
  38.         LCD_RS=0;
  39.         LCD_RW=1;
  40.         LCD_EN=1;
  41.         delayNOP();
  42.         result=(bit)(P0&0x80);
  43.         LCD_EN=0;
  44.         return (result);
  45. }
  46. //写指令数据到LCD
  47. void lcd_wcmd(unsigned char cmd)
  48. {
  49.         while(lcd_busy)
  50.         ;
  51.         LCD_RS=0;
  52.         LCD_RW=0;
  53.         LCD_EN=1;
  54.         P0=cmd;
  55.         delayNOP();
  56.         LCD_EN=0;
  57. }
  58. //写显示数据到LCD
  59. void lcd_wdat(unsigned char dat)
  60. {        while (lcd_busy())
  61.         ;
  62.         LCD_RS=1;
  63.         LCD_RW=0;
  64.         LCD_EN=1;
  65.         P0=dat;
  66.         delayNOP();
  67.         LCD_EN=0;
  68. }
  69. //LCD初始化设定
  70. void lcd_init()
  71. {
  72.         delayms(15);
  73.         lcd_wcmd(0x38);
  74.         delayms(5);
  75.         lcd_wcmd(0x38);
  76.         delayms(5);
  77.         lcd_wcmd(0x38);
  78.         delayms(5);
  79.         lcd_wcmd(0x0c);
  80.         delayms(5);
  81.         lcd_wcmd(0x06);
  82.         delayms(5);
  83.         lcd_wcmd(0x01);
  84.         delayms(5);
  85. }
  86. //设定显示位置
  87. void lcd_pos(unsigned char pos)
  88. {
  89.         lcd_wcmd(pos|0x80);
  90. }
  91. //数据处理与显示
  92. void show_value(unsigned char ad_data)
  93. {
  94.         dis[2]=ad_data/51;
  95.         dis[2]=dis[2]+0x30;
  96.         dis[3]=ad_data%51;
  97.         dis[3]=dis[3]*10;
  98.         dis[1]=dis[3]/51;
  99.         dis[1]=dis[1]+0x30;
  100.         dis[3]=ad_data%51;
  101.         dis[3]=dis[3]*10;
  102.         dis[0]=dis[3]/51;
  103.         dis[0]=dis[0]+0x30;
  104. }
  105. //启动i2c
  106. void iic_start(void)
  107. {
  108.         SDA=1;
  109.         SCL=1;
  110.         delayNOP();
  111.         SDA=0;
  112.         delayNOP();
  113.         SCL=0;
  114. }
  115. //停止i2c
  116. void iic_stop(void)
  117. {
  118.         SDA=0;
  119.         SCL=1;
  120.         delayNOP();
  121.         SDA=1;
  122.         delayNOP();
  123.         SCL=0;
  124. }
  125. //初始化i2c
  126. void iicInit(void)
  127. {
  128.         SCL=0;
  129.         iic_stop();
  130. }
  131. //应答子程序
  132. void slave_ACK(void)
  133. {
  134.         SDA=0;
  135.         SCL=1;
  136.         delayNOP();
  137.         SCL=0;
  138.         SDA=1;
  139. }
  140. //非应答子程序
  141. void slave_NOACK(void)
  142. {
  143.         SDA=1;
  144.         SCL=1;
  145.         delayNOP();
  146.         SDA=0;
  147.         SCL=0;
  148.         SDA=0;
  149. }
  150. //检查应答子程序
  151. void checl_ACK(void)
  152. {
  153.         SDA=1;
  154.         SCL=1;
  155.         F0=0;
  156.         delayNOP();
  157.         if(SDA==1)
  158.                 F0=1;
  159.         SCL=0;
  160. }
  161. //发送1个字节
  162. void IICSendByte(unsigned char indata)
  163. {
  164.         unsigned char n=8;
  165.         while(n--)
  166.         {
  167.                 SDA=(bit)(indata &0x80)
  168.                 SCL=1;
  169.                 delayNOP();
  170.                 SCL=0;
  171.                 indata=indata<<1;
  172.         }
  173. }
  174. //接收一个字节
  175. unsigned char IICreceiveByte(void)
  176. {
  177.         unsigned char n=8;
  178.         unsigned char tdata=0;
  179.         while(n--)
  180.         {
  181.                 SDA=1;
  182.                 SCL=1;
  183.                 tdata=tdata<<1;
  184.                 if(SDA==1)
  185.                         tdata=tdata|0x01;
  186.                 else
  187.                         tdata=tdata&0xfe;
  188.                 SCL=0;
  189.         }
  190.         return(tdata);
  191. }
  192. //发送数据子程序
  193. void DAC_PCF8591(unsigned char controlbyte,unsigned char w_data)
  194. {
  195.         iic_start();
  196.         delayNOP();
  197.         IICSendByte(PCF8591_WRITE);
  198.         check_ACK();
  199.         IICSendByte(controlbyte&0x77);
  200.         check_ACK();
  201.         IICSendByte(w_data);
  202.         check_ACK();
  203.         iic_stop;
  204.         delayNOP();
  205.         delayNOP();
  206. }
  207. //A/D转换
  208. void ADC_PCF8591(unsigned char controlbyte)
  209. {
  210.         unsigned char i=0;
  211.         iic_start();
  212.         IICSendByte(PCF8591_WRITE);
  213.         check_ACK();
  214.         IICSendByte(controlbyte);
  215.         check_ACK();
  216.         iic_start();
  217.         IICSendByte(PCF8591_READ);
  218.         check_ACK();
  219.         IICreceiveByte();
  220.         slave_ACK();
  221.         while(i<3)
  222.         {
  223.                 receivebuf[i++]=IICreceiveByte();
  224.                 slave_ACK();
  225.         }
  226.         receivebuf[3]=IICreceiveByte();
  227.         slave_NOACK();
  228.         iic_stop();
  229. }
  230. //主函数
  231. void main(void)
  232. {
  233.         unsigned char i;
  234.         delayms(10);
  235.         lcd_init();
  236.         lcd_pos(0);
  237.         for(i=0;i<16;i++)
  238.                 lcd_wdat(dis1[i]);
  239.         lcd_pos(0x40);
  240.         for(i=0;i<16;i++)
  241.                 lcd_wdat(dis2[i]);
  242.         while(1)
  243.         {
  244.                 iicInit();
  245.                 ADC_PCF8591(0x04);
  246.                 while(F0)
  247.                 {
  248.                         iicInit();
  249.                         ADC_PCF8591(0x04);
  250.                 }
  251.                 show_value(receivebuf[0]);
  252.                 lcd_pos(0x02);
  253.                 lcd_wdat(dis[2]);
  254.                 lcd_pos(0x04);
  255.                 lcd_wdat(dis[1]);
  256.                 lcd_wdat(dis[0]);

  257.                 show_value(receivebuf[1]);
  258.                 lcd_pos(0x0b);
  259.                 lcd_wdat(dis[2]);
  260.                 lcd_pos(0x0d);
  261.                 lcd_wdat(dis[1]);
  262.                 lcd_wdat(dis[0]);

  263.                 show_value(receivebuf[2]);
  264.                 lcd_pos(0x42);
  265.                 lcd_wdat(dis[2]);
  266.                 lcd_pos(0x44);
  267.                 lcd_wdat(dis[1]);
  268.                 lcd_wdat(dis[0]);

  269.                 show_value(receivebuf[3]);
  270.                 lcd_pos(0x4b);
  271.                 lcd_wdat(dis[2]);
  272.                 lcd_pos(0x4d);
  273.                 lcd_wdat(dis[1]);
  274.                 lcd_wdat(dis[0]);

  275.                 iicInit();
  276.                 DAC_PCF8591(0x40,receivebuf[0]);

  277.                 while(F0)
  278.                 {        
  279.                         iicInit();
  280.                         DAC_PCF8591(0x40,receivebuf[0]);
  281.                 }
  282.         }
  283. }
复制代码

PT35SOPJUKLMT(POWFCDMP5.png (25.88 KB, 下载次数: 111)

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

使用道具 举报

沙发
ID:893765 发表于 2021-5-11 19:12 | 只看该作者
你那么大个延时函数哪儿去了
回复

使用道具 举报

板凳
ID:723431 发表于 2021-5-11 19:14 | 只看该作者
田所浩二单推人 发表于 2021-5-11 19:12
你那么大个延时函数哪儿去了

啊这,不好意思,没粘全
回复

使用道具 举报

地板
ID:917199 发表于 2021-5-11 19:26 | 只看该作者
char code reserve[3]_at_0x3b;
这句不太对,你确定没抄错?
有code,后面很可能有很长一串缺失
回复

使用道具 举报

5#
ID:723431 发表于 2021-5-11 19:32 | 只看该作者
timerzero 发表于 2021-5-11 19:26
char code reserve[3]_at_0x3b;
这句不太对,你确定没抄错?
有code,后面很可能有很长一串缺失

没错啊

IMG_20210511_192901.jpg (1.05 MB, 下载次数: 111)

IMG_20210511_192901.jpg
回复

使用道具 举报

6#
ID:213173 发表于 2021-5-12 06:23 | 只看该作者
不知是教材错误还是楼主太粗心,抄写错误有好多。
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define PCF8591_WRITE 0x90
  4. #define PCF8591_READ 0x91
  5. sbit SDA=P2^0;
  6. sbit SCL=P2^1;
  7. #define disdata P0
  8. sbit LCD_RS=P2^3;
  9. sbit LCD_RW=P2^4;
  10. sbit LCD_EN=P2^5;
  11. unsigned char code dis1[]="0-0.00V  1-0.00V";
  12. unsigned char code dis2[]="2-0.00V  3-0.00V";
  13. unsigned int data dis[4];
  14. unsigned char data receivebuf[4];
  15. //char code reserve[3]_at_0x3b;
  16. //us延时函数(4.34us)
  17. void delayNOP()
  18. {
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23. }
  24. //ms延时函数
  25. void delayms(unsigned int ms)
  26. {
  27.         unsigned char i;
  28.         while  (ms--)
  29.         {
  30.                 for(i=0;i<114;i++)
  31.                 ;
  32.         }
  33. }

  34. //检查LCD忙状态
  35. bit lcd_busy()
  36. {
  37.         bit result;
  38.         P0=0xff;
  39.         LCD_RS=0;
  40.         LCD_RW=1;
  41.         result=(bit)(P0&0x80);
  42.         delayNOP();
  43.         LCD_EN=0;
  44.         LCD_EN=1;
  45.         return (result);
  46. }

  47. //写指令数据到LCD
  48. void lcd_wcmd(unsigned char cmd)
  49. {
  50.         while(lcd_busy());
  51.         LCD_RS=0;
  52.         LCD_RW=0;
  53.         P0=cmd;
  54.         delayNOP();
  55.         LCD_EN=0;
  56.         LCD_EN=1;
  57. }
  58. //写显示数据到LCD
  59. void lcd_wdat(unsigned char dat)
  60. {
  61.         while (lcd_busy());
  62.         LCD_RS=1;
  63.         LCD_RW=0;
  64.         P0=dat;
  65.         delayNOP();
  66.         LCD_EN=0;
  67.         LCD_EN=1;
  68. }
  69. //LCD初始化设定
  70. void lcd_init()
  71. {
  72.         delayms(15);
  73.         lcd_wcmd(0x38);
  74.         delayms(5);
  75.         lcd_wcmd(0x38);
  76.         delayms(5);
  77.         lcd_wcmd(0x38);
  78.         delayms(5);
  79.         lcd_wcmd(0x0c);
  80.         delayms(5);
  81.         lcd_wcmd(0x06);
  82.         delayms(5);
  83.         lcd_wcmd(0x01);
  84.         delayms(5);
  85. }
  86. //设定显示位置
  87. void lcd_pos(unsigned char pos)
  88. {
  89.         lcd_wcmd(pos|0x80);
  90. }
  91. //数据处理与显示
  92. void show_value(unsigned char ad_data)
  93. {
  94.         dis[2]=ad_data/51;
  95.         dis[2]=dis[2]+0x30;
  96.         dis[3]=ad_data%51;
  97.         dis[3]=dis[3]*10;
  98.         dis[1]=dis[3]/51;
  99.         dis[1]=dis[1]+0x30;
  100.         dis[3]=ad_data%51;
  101.         dis[3]=dis[3]*10;
  102.         dis[0]=dis[3]/51;
  103.         dis[0]=dis[0]+0x30;
  104. }
  105. //启动i2c
  106. void iic_start(void)
  107. {
  108.         SDA=1;
  109.         SCL=1;
  110.         delayNOP();
  111.         SDA=0;
  112.         delayNOP();
  113.         SCL=0;
  114. }
  115. //停止i2c
  116. void iic_stop(void)
  117. {
  118.         SDA=0;
  119.         SCL=1;
  120.         delayNOP();
  121.         SDA=1;
  122.         delayNOP();
  123.         SCL=0;
  124. }
  125. //初始化i2c
  126. void iicInit(void)
  127. {
  128.         SCL=0;
  129.         iic_stop();
  130. }
  131. //应答子程序
  132. void slave_ACK(void)
  133. {
  134.         SDA=0;
  135.         SCL=1;
  136.         delayNOP();
  137.         SCL=0;
  138.         SDA=1;
  139. }
  140. //非应答子程序
  141. void slave_NOACK(void)
  142. {
  143.         SDA=1;
  144.         SCL=1;
  145.         delayNOP();
  146.         SDA=0;
  147.         SCL=0;
  148.         SDA=0;
  149. }
  150. //检查应答子程序
  151. void check_ACK(void)
  152. {
  153.         SDA=1;
  154.         SCL=1;
  155.         F0=0;
  156.         delayNOP();
  157.         if(SDA==1)
  158.                 F0=1;
  159.         SCL=0;
  160. }
  161. //发送1个字节
  162. void IICSendByte(unsigned char indata)
  163. {
  164.         unsigned char n=8;
  165.         while(n--)
  166.         {
  167.                 SDA=(bit)(indata &0x80);
  168.                 SCL=1;
  169.                 delayNOP();
  170.                 SCL=0;
  171.                 indata=indata<<1;
  172.         }
  173. }
  174. //接收一个字节
  175. unsigned char IICreceiveByte(void)
  176. {
  177.         unsigned char n=8;
  178.         unsigned char tdata=0;
  179.         while(n--)
  180.         {
  181.                 SDA=1;
  182.                 SCL=1;
  183.                 tdata=tdata<<1;
  184.                 if(SDA==1)
  185.                 tdata=tdata|0x01;
  186.                 else
  187.                 tdata=tdata&0xfe;
  188.                 SCL=0;
  189.         }
  190.         return(tdata);
  191. }
  192. //发送数据子程序
  193. void DAC_PCF8591(unsigned char controlbyte,unsigned char w_data)
  194. {
  195.         iic_start();
  196.         delayNOP();
  197.         IICSendByte(PCF8591_WRITE);
  198.         check_ACK();
  199.         IICSendByte(controlbyte&0x77);
  200.         check_ACK();
  201.         IICSendByte(w_data);
  202.         check_ACK();
  203.         iic_stop();
  204.         delayNOP();
  205.         delayNOP();
  206. }
  207. //A/D转换
  208. void ADC_PCF8591(unsigned char controlbyte)
  209. {
  210.         unsigned char i=0;
  211.         iic_start();
  212.         IICSendByte(PCF8591_WRITE);
  213.         check_ACK();
  214.         IICSendByte(controlbyte);
  215.         check_ACK();
  216.         iic_start();
  217.         IICSendByte(PCF8591_READ);
  218.         check_ACK();
  219.         IICreceiveByte();
  220.         slave_ACK();
  221.         while(i<3)
  222.         {
  223.                 receivebuf[i++]=IICreceiveByte();
  224.                 slave_ACK();
  225.         }
  226.         receivebuf[3]=IICreceiveByte();
  227.         slave_NOACK();
  228.         iic_stop();
  229. }
  230. //主函数
  231. void main(void)
  232. {
  233.         unsigned char i;
  234.         delayms(10);
  235.         lcd_init();
  236.         lcd_pos(0);
  237.         for(i=0;i<16;i++)
  238.                 lcd_wdat(dis1[i]);
  239.         lcd_pos(0x40);
  240.                 for(i=0;i<16;i++)
  241.         lcd_wdat(dis2[i]);
  242.         while(1)
  243.         {
  244.                 iicInit();
  245.                 ADC_PCF8591(0x04);
  246.                 while(F0)
  247.                 {
  248.                         iicInit();
  249.                         ADC_PCF8591(0x04);
  250.                 }
  251.                 show_value(receivebuf[0]);
  252.                 lcd_pos(0x02);
  253.                 lcd_wdat(dis[2]);
  254.                 lcd_pos(0x04);
  255.                 lcd_wdat(dis[1]);
  256.                 lcd_wdat(dis[0]);
  257.                
  258.                 show_value(receivebuf[1]);
  259.                 lcd_pos(0x0b);
  260.                 lcd_wdat(dis[2]);
  261.                 lcd_pos(0x0d);
  262.                 lcd_wdat(dis[1]);
  263.                 lcd_wdat(dis[0]);
  264.                
  265.                 show_value(receivebuf[2]);
  266.                 lcd_pos(0x42);
  267.                 lcd_wdat(dis[2]);
  268.                 lcd_pos(0x44);
  269.                 lcd_wdat(dis[1]);
  270.                 lcd_wdat(dis[0]);
  271.                
  272.                 show_value(receivebuf[3]);
  273.                 lcd_pos(0x4b);
  274.                 lcd_wdat(dis[2]);
  275.                 lcd_pos(0x4d);
  276.                 lcd_wdat(dis[1]);
  277.                 lcd_wdat(dis[0]);
  278.                
  279.                 iicInit();
  280.                 DAC_PCF8591(0x40,receivebuf[0]);
  281.                
  282.                 while(F0)
  283.                 {        
  284.                         iicInit();
  285.                         DAC_PCF8591(0x40,receivebuf[0]);
  286.                 }
  287.         }
  288. }
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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