extern char跟extern u8有什么区别
时间: 2023-11-21 12:24:45 浏览: 148
`extern char` 和 `extern u8` 都是使用 `extern` 关键字来声明一个变量,表示这个变量是在其他地方定义的。其中,`char` 是 C 语言中的字符类型,而 `u8` 可能是某些特定编译器或库中定义的无符号 8 位整数类型。
因此,`extern char` 声明的变量是字符类型的,而 `extern u8` 声明的变量是无符号 8 位整数类型的。这两者之间最主要的区别在于变量的类型不同,因此在使用时需要根据具体的需求来选择合适的类型。
相关问题
u8 sendflag=1; int count_key=0; u8 key= 0; char data2[6]={"\0\0\0\0\0\0"}; extern void HMISends(char *buf1);//´®¿ÚÆÁº¯Êý extern void HMISendb(u8 buf); extern int HMIreturn(void); extern char TEXT_Buffer[6]; char code_y_n=1; void KeyHandle() //°´¼üɨÃè { if(key!=0) { if(key==10) key=0; if((key<10)&&sendflag) { data2[count_key]=key+48; count_key++; if(count_key!=6) data2[count_key]='\0'; } else if(key==11) { count_key--; if(count_key==-1) count_key=0; data2[count_key]='\0'; sendflag=1; } HMISends("t1all.txt="); //ÃÜÂëÊäÈëdelete HMISends("\""); HMISends(data2); HMISends("\""); HMISendb(0xff); if(key==12) { HMISends("mima.tm1.en=1"); HMISendb(0xff); sendflag=1; count_key = 0; if(TEXT_Buffer[0]==data2[0]&&TEXT_Buffer[1]==data2[1]&&TEXT_Buffer[2]==data2[2]&&TEXT_Buffer[3]==data2[3]&&TEXT_Buffer[4]==data2[4]&&TEXT_Buffer[5]==data2[5]) { printf("kaimen"); code_y_n=0; } data2[0]=22;data2[1]=22;data2[2]=22; } if(count_key==6) sendflag=0; } }
这段代码是一个按键处理函数,用于处理按键的输入和相应的操作。
具体的功能如下:
- 根据按键的值key进行相应的操作。
- 如果按键值为0,则不执行任何操作。
- 如果按键值小于10且sendflag为真,则将按键值转换为字符并存储在data2数组中,同时更新count_key的值。
- 如果按键值为11,则将count_key减1,并将data2数组中对应位置的值设置为'\0',同时将sendflag设置为1,表示可以继续输入。
- 发送数据给HMI模块,用于显示输入的内容。
- 如果按键值为12,则进行密码验证的操作。将HMI模块的密码与输入的密码进行比较,如果匹配成功,则设置code_y_n为0,表示开门成功。
- 如果count_key等于6,则设置sendflag为0,表示不允许继续输入。
需要注意的是,在调用该函数之前,需要确保已经初始化了相关的外部函数和变量。
如果需要的话,你可以对这段代码进行修改和优化。
4. 主程序 main( )函数前添加 extern u16 USART_TX_EN; extern u8 USART_RX_BUF[USART_REC_LEN]; extern u16 USART_RX_STA; 在 C 语言中,修饰符 extern 用在变量或者函数的声明前,用来说明“此变量/函数是在 别的源文件中定义,要在此处引用”。 5. 在主程序 main( )中添加初始化代码,并添加相关头文件 char USART_SendBuf[]="Hello!"; int i; int Len=strlen(USART_SendBuf); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); LCD_GPIO_Init(); LCD_Init(); usart1_Init(115200); 6. 在主框架 while(1)中添加串口发送代码 delay_ms(2000); if(USART_TX_EN) { for(i=0;i<Len;i++) { USART_SendData(USART1, USART_SendBuf[i]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)!=SET); } USART_TX_EN=0; } //???补充代码,判断是否发送完毕 LCD_Display_Words(0,0,USART_RX_BUF); 5.4 练习 在实验 5.3 的框架中补齐代码,在 LCD 显示通过 USART 自发自收的字符串“Hello!”, 并添加代码实现持续发送和接收并在 LCD 换行显示。
以下是补充代码:
```c
while(1)
{
delay_ms(2000);
// 判断是否需要发送
if(USART_TX_EN)
{
for(i=0; i<Len; i++)
{
USART_SendData(USART1, USART_SendBuf[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
}
USART_TX_EN = 0;
}
// 判断是否有数据接收
if(USART_RX_STA & 0x8000)
{
u16 len = USART_RX_STA & 0x3fff;
USART_RX_BUF[len] = '\0';
LCD_Display_Words(0, 0, USART_RX_BUF);
USART_RX_STA = 0;
}
}
```
在该代码中,我们首先判断是否需要发送数据,如果需要发送,则使用循环逐个发送数据字节,直到所有数据都发送完毕。
接下来,我们判断是否有数据接收。如果有,则将接收到的字符串显示在 LCD 上。需要注意的是,我们在 USART_RX_STA 中使用了一个标志位(最高位为 1)来表示是否接收到了完整的数据包。如果有数据接收,则读取数据长度并将最高位清零,方便下一次数据接收的判断。
阅读全文