有人可以帮我注释下这两段代码没,
#include <STC89C5xRC.H>
typedef unsigned int u16;
typedef unsigned char u8;
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LED1=P2^0;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
delay_10us(1000);
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
key=1;
}
return KEY_UNPRESS;
}
void main()
{
u8 key=0;
while(1)
{
key=key_scan(0);
if(key==KEY1_PRESS)
LED1=!LED1;
}
}
#include <STC89C5xRC.H>
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define LED_PORT P2
sbit LED1=P2^0;
sbit KEY3=P3^2;
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void exti0_init(void)
{
IT0=1;
EX0=1;
EA=1;
}
void exti0() interrupt 0
{
LED_PORT=0x0ff;
delay_10us(10000);
LED1=1;
delay_10us(10000);
LED1=0;
delay_10us(10000);
LED1=1;
delay_10us(10000);
LED1=0;
delay_10us(10000);
}
void main()
{
u8 i=0;
exti0_init();
LED_PORT =~0x01;
delay_10us(50000);
while(1)
{
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}
#include <STC89C5xRC.H>
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define LED_PORT P2
sbit LED1=P2^0;
sbit KEY3=P3^2;
这些行包含了头文件和宏定义。STC89C5xRC.H
是针对 STC89C5xRC 微控制器的特定头文件。"intrins.h" 是一个通用的头文件,包含了一些用于延迟和内存访问的汇编指令。u16
和 u8
分别定义为无符号整数类型,用于存储 16 位和 8 位数据。LED_PORT
定义为 P2 端口,LED1
和 KEY3
分别定义为 P2.0 和 P3.2 的 sbit 类型。
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
这个函数用于延迟 10 微秒。参数 ten_us
是要延迟的时间,单位为微秒。函数实现是通过一个 while 循环,循环 ten_us
次。每次循环,变量 ten_us
的值减 1。
void exti0_init(void)
{
IT0=1;
EX0=1;
EA=1;
}
这个函数初始化 EXTI0 中断。IT0
、EX0
和 EA
是寄存器,用于控制中断的触发方式、使能和总使能。这里,我们设置 IT0=1(触发方式 0),EX0=1(使能中断)和 EA=1(总使能)。
void exti0() interrupt 0
{
LED_PORT=0x0ff;
delay_10us(10000);
LED1=1;
delay_10us(10000);
LED1=0;
delay_10us(10000);
LED1=1;
delay_10us(10000);
LED1=0;
delay_10us(10000);
}
这个函数是 EXTI0 中断的服务程序。当中断触发时,这个函数会被执行。函数首先将 P2 端口清零,然后延迟 10 微秒。接下来,LED1 被设置为 1,再延迟 10 微秒。然后,LED1 被清零,再延迟 10 微秒。这样,LED1 会在 1 秒内闪烁。
void main()
{
u8 i=0;
exti0_init();
LED_PORT =~0x01;
delay_10us(50000);
while(1)
{
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}
main()
函数是程序的入口点。函数首先调用 exti0_init()
函数初始化 EXTI0 中断。然后,P2 端口被设置为 0x01(LED1 置零),并延迟 5 秒。接下来,程序进入一个无限循环。在循环中,LED1 的状态会按照一定的模式循环变化。具体而言,LED1 会从 0 到 1 依次点亮,共 7 次,然后从 1 到 0 依次点亮,共 7 次。在这个过程中,每次变化都会延迟 5 秒。另外,KEY3 键被设置为 1,每当 5 秒过去,KEY3 键状态会自动恢复为 0。
Code Sample 1:
/*该函数实现了将一个整数转换为字符数组并输出*/
void intToChar(int num, char *str) {
int i = 0, j = 0;
char temp;
if (num < 0) { //判断num的正负
str[j++] = '-';
num = -num;
}
do {
str[i++] = num % 10 + '0';
num /= 10;
} while (num);
for (j = 0; j < i / 2; j++) { //反转str数组
temp = str[j];
str[j] = str[i - j - 1];
str[i - j - 1] = temp;
}
str[i] = '\0'; //字符串结尾添加'\0'
}
注释:
/*该函数实现了将一个整数转换为字符数组并输出*/
void intToChar(int num, char *str) {
int i = 0, j = 0;
char temp;
if (num < 0) { //判断num的正负
str[j++] = '-';
num = -num;
}
do {
str[i++] = num % 10 + '0'; //将num的每一位取出,转换为字符并存储到str中
num /= 10;
} while (num); //num为0跳出循环
for (j = 0; j < i / 2; j++) { //反转str数组
temp = str[j];
str[j] = str[i - j - 1];
str[i - j - 1] = temp;
}
str[i] = '\0'; //字符串结尾添加'\0'
}
解释: 该函数用于将一个整数转换为字符数组并输出,具体实现方式如下: