Issue with " Error: '_asm': undefined identifier "

Issue with " Error: '_asm': undefined identifier "

我已经编写了代码,使 8051 微控制器能够与 LCD 接口,并在 LCD 上显示以 8 位二进制值读取的温度。代码在运行时能够在 LCD 上显示文本,但是,当引入允许读取温度的代码时,程序中断了。错误似乎集中在从 ADC 读取温度的函数周围,并且似乎与“_asm”有关,这是我以前从未处理过的。下面列出了错误:

compiling main.c...
main.c(72): error C231: 'get_temp': redefinition
main.c(74): error C141: syntax error near 'int', expected '__asm'
main.c(74): error C202: 'readvalue': undefined identifier
main.c(75): error C141: syntax error near 'int', expected '__asm'
main.c(75): error C202: 'temp': undefined identifier
main.c(76): error C141: syntax error near 'int', expected '__asm'
main.c(76): error C202: 'binaryvalue': undefined identifier
main.c(76): error C141: syntax error near '{', expected 'sizeof'
main.c(76): error C141: syntax error near '}', expected ';'
main.c(77): error C141: syntax error near 'int', expected '__asm'
main.c(77): error C141: syntax error near '{', expected 'sizeof'
main.c(82): error C141: syntax error near '}', expected ';'
main.c(83): error C141: syntax error near '{', expected 'sizeof'
main.c(83): error C141: syntax error near ')', expected ';'
main.c(85): error C202: 'temp': undefined identifier
main.c(88): error C202: 'temp': undefined identifier
main.c(89): error C231: 'get_temp': redefinition
main.c(118): error C141: syntax error near 'int', expected '__asm'
main.c(118): error C202: 'atemp': undefined identifier
main.c(119): error C202: 'atemp': undefined identifier
main.c(120): error C202: 'atemp': undefined identifier

该代码已在 Keil uVision 中开发,如下所示。函数原型被注释掉,因为它们会导致程序出现更多问题,并且在注释掉时,一些错误已得到解决:

#include<reg51.h>
#include<stdio.h>

/********************************************* LCD control signals declaration ***************************************************/
 
sbit RS = P0^0;     //
sbit RW = P0^1;  // Read/write line
sbit Enable = P0^2; // Enable line
#define LCD_PORT P2 // define port
 
/********************************************* LCD function prototypes ************************************************/
//void send_cmd(unsigned char);
//void send_char(unsigned char);
//void send_int()
//void LCD_init(void);
//void delayms(unsigned int);
//int get_temp();
////int get_humidity();

/******************************************* delayms Function declaration***********************************************/
void delayms(unsigned int val)
{
 unsigned int i,j;
   
 for(i=0;i<=val;i++)
 {
  for(j=0;j<=2;j++)  ;
  //_nop_();   // no operation produce 1us time delay
 }
  
}
/*********************************************LCD Command Sending Function declaration********************************/
 
void send_cmd(unsigned char Command)
{
 LCD_PORT = Command;
 RS = 0;      // Select Command Register
 RW = 0;    // write operation
 Enable = 1;      // High to Low pulse provided on the enable pin with nearly 1ms(>450ns)
 delayms(1);   // 1 millisec delay
 Enable = 0;
}
 

 

/********************************************* LCD Initialization Function declaration ********************************/
 
void LCD_init()
{
 send_cmd(0x38);      // configuring LCD as 2 line 5x7 matrix
 send_cmd(0x0E);      // Display on, Cursor blinking
 send_cmd(0x01);      // Clear Display Screen
 send_cmd(0x06);      // Increment Cursor (Right side)
}
 
void send_char(unsigned char character)
{
 LCD_PORT = character;
 RS = 1;    // Select Data Register
 RW = 0;    // write operation
 Enable = 1;      // High to Low pulse provided on the enable pin with nearly 1ms(>450ns)
 delayms(1);   // 1 millisec delay
 Enable = 0;
 delayms(10);   // 100 millisec delay
}
 
 


/****************************************** Temperature Function Declaration ********************************************/
void get_temp(){
    P1 = 0xFF;
    int readvalue = P1;
    int temp;
    int binaryvalue[70] = {01000001,00100001,01100001,00010001,10010001,11010001,10110001,11110001,00001001,01001001,00101001,01101001,11101001,10011001,01011001,00111001,01111001,11111001,10000101,01000101,00100101,10100101,01100101,00010101,10010101,11010101,00110101,01110101,01110101,00001101,10001101,01001101,11001101,00101101,01101101,01101101,11101101,00011101,01011101,01011101,11011101,00111101,10111101,01111101,11111101,11111101,00000011,10000011,10000011,01000011,11000011,00100011,00100011,10100011,10100011,01100011,11100011,11100011,11100011,00010011,00010011,10010011,10010011,01010011,01010011,11010011,11010011,11010011,00110011,00110011,10110011};
    int temperature[70] = {-20,-19,-18,-17,-16,-15,-14,-13,
                                            -12,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,
                                            0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
                                            15,16,17,18,19,20,21,22,23,24,25,26,
                                            27,28,29,30,31,32,33,34,35,36,37,38,
                                            39,40,41,42,43,44,45,46,47,48,49,50};
    for(i=0;i<sizeof{binaryvalue};i++){
        if(readvalue == binaryvalue[i]){
            temp = temperature[i];
        }
    }
    return temp;
}

/********************************************* Main Funciton declaration ***********************************************/
void main()
{

    LCD_PORT = 0x00; // Make the port as output port
   
    LCD_init();            // LCD initialization
  send_cmd(0x80);     // Force cursor to beginning of 1st line, if the number is 0x83 then force the cursor to 53rd position
  delayms(100);    // Delay of 100millisec
  send_char('T');
    send_char('H');
    send_char('E');
    send_char('R');
    send_char('M');  // Send data
    send_char('I');
    send_char('S');
    send_char('T');
    send_char('O');
    send_char('R');  // Send data   
  send_cmd(0xC0);     // Force cursor to beginning of 2nd line
  delayms(100);    // Delay of 100millisec
  send_char('V');  // Send data 
  send_char('A');  // Send data 
  send_char('L');  // Send data 
    send_char('U');  // Send data 
  send_char('E');  // Send data 
  send_char(':');  // Send data
    int atemp = get_temp();
    while (atemp > 0){
        int k = atemp % 10;
        char send_x;
        itoa(k,send_x,10);
        send_char(send_x);
        temp /= 10;
    }
 //}
}
 

由于我对 C 的了解有限,因此将不胜感激。提前致谢。

_asm 标记内联汇编,正确的语法取决于您使用的机器(What is the difference between 'asm', '__asm' and '__asm__'? ). i do not know where you got the library with the LCD driver code from but inline assembly in Keil is described in https://www.keil.com/support/man/docs/armcc/armcc_chr1359124246903.htm and https://www.keil.com/support/man/docs/c51/c51_ap_ctoasm.htm(对于 8051)

错误在行

void get_temp(){
    P1 = 0xFF;
    _asm int readvalue = P1;
    _asm int temp;

我认为您想读取或修改 P1 特殊功能寄存器 (SFR) 因为它与您的温度传感器有连接,为此请参阅 https://www.includehelp.com/embedded-system/accessing-ports-and-pins-in-8051-microcontroller.aspx

此外,您尝试将 8 位值转换为至少 16 位的 int...

另外你尝试write/read锁存P1,而不是读取它的值(https://developer.arm.com/documentation/ka004317/latest)