/***********************数码显示函数*****************************/ void display() { static uchar i; i++; if(i >= smg_i) i = 0; smg_we_switch(i); //位选 P1 = dis_smg[i]; //段选 } /*********************定时器0、定时器1初始化******************/ void time_init() { EA = 1; //开总中断 TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 0; //关定时器0中断 TR0 = 1; //允许定时器0定时 ET1 = 1; //开定时器1中断 TR1 = 1; //允许定时器1定时 } /*********************定时器1中断服务程序************************/ void time1_int() interrupt 3 //外部中断3 { static uchar value; //定时2ms中断一次 TH1 = 0xf8; TL1 = 0x30; //2ms display(); //数码管显示函数 value++; if(value >= 150) { value = 0; flag_300ms = 1; } } /***************主函数*****************/ void main() { beep = 0; //开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平 send_wave(); //测距离函数 smg_display(); //处理距离显示函数 time_init(); //定时器初始化程序 send_wave(); //测距离函数 send_wave(); //测距离函数 while(1) { if(flag_300ms == 1) { flag_300ms = 0; clock(); //报警函数 if(beep == 1) send_wave(); //测距离函数 if(menu_1 == 0) smg_display(); //处理距离显示函数 } key(); //按键函数 if(key_can < 10) { key_with(); //按键处理函数 } } }flag300ms是做什么的
时间: 2023-07-23 16:59:14 浏览: 47
flag_300ms是一个标志位,用于表示是否经过了300毫秒的时间间隔。在定时器1中断服务程序中,每2毫秒flag_300ms会自增,当它的值达到150时(300毫秒),将其重置为0,并将flag_300ms设置为1。
在主函数中的while循环中,判断flag_300ms是否为1,如果是,则执行一些操作。在这段代码中,根据具体的应用需求,flag_300ms被用来触发一些定时操作,例如报警函数、测距离函数、距离显示函数等。
所以,flag_300ms的作用是控制定时触发某些操作的时间间隔。
相关问题
帮我用keil5写4*4矩形键盘模块三位数以内加减乘除计算器代码
好的,下面是使用Keil5编写4*4矩形键盘模块三位数以内加减乘除计算器的代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code keymap[4][4] = { // 键盘按键映射表
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'C', '0', '=', '/'}
};
uchar tmp, num1, num2, op, result; // 定义变量
sbit D0 = P2^0; // 显示数码管位选引脚
sbit D1 = P2^1;
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit LSA = P2^4; // 显示数码管片选引脚
sbit LSB = P2^5;
sbit LSC = P2^6;
void delay(uint t) // 延时函数
{
uint i, j;
for(i=0; i<t; i++)
{
for(j=0; j<120; j++);
}
}
void scan_key() // 扫描键盘函数
{
uchar i, j;
for(i=0; i<4; i++)
{
P1 = 0x0f ^ (0x01 << i); // 设置行引脚电平
tmp = P1; // 读取列引脚电平
for(j=0; j<4; j++)
{
if(!(tmp & (0x01 << j))) // 判断是否有按键按下
{
delay(10); // 延时去抖动处理
if(!(tmp & (0x01 << j))) // 再次判断是否有按键按下
{
while(!(tmp & (0x01 << j))); // 等待按键释放
if(keymap[i][j] >= '0' && keymap[i][j] <= '9') // 如果是数字键
{
if(op == 0) // 如果还没有操作符
{
num1 = num1 * 10 + (keymap[i][j] - '0'); // 计算第一个数
P0 = num1; // 显示第一个数
}
else // 如果已经有操作符
{
num2 = num2 * 10 + (keymap[i][j] - '0'); // 计算第二个数
P0 = num2; // 显示第二个数
}
}
else if(keymap[i][j] == 'C') // 如果是清除键
{
num1 = 0;
num2 = 0;
op = 0;
P0 = 0; // 清除显示
}
else if(keymap[i][j] == '=') // 如果是等于键
{
switch(op)
{
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = num1 / num2; break;
default: break;
}
num1 = result;
num2 = 0;
op = 0;
P0 = result; // 显示结果
}
else // 如果是操作符键
{
op = keymap[i][j];
}
}
}
}
}
}
void display(uchar num) // 显示数码管函数
{
switch(num)
{
case 0: LSA = 0, LSB = 0, LSC = 0, D0 = 1, D1 = 1, D2 = 1, D3 = 1; break;
case 1: LSA = 1, LSB = 0, LSC = 0, D0 = 0, D1 = 1, D2 = 1, D3 = 1; break;
case 2: LSA = 0, LSB = 1, LSC = 0, D0 = 1, D1 = 0, D2 = 1, D3 = 1; break;
case 3: LSA = 1, LSB = 1, LSC = 0, D0 = 0, D1 = 0, D2 = 1, D3 = 1; break;
case 4: LSA = 0, LSB = 0, LSC = 1, D0 = 1, D1 = 1, D2 = 0, D3 = 1; break;
case 5: LSA = 1, LSB = 0, LSC = 1, D0 = 0, D1 = 1, D2 = 0, D3 = 1; break;
case 6: LSA = 0, LSB = 1, LSC = 1, D0 = 1, D1 = 0, D2 = 0, D3 = 1; break;
case 7: LSA = 1, LSB = 1, LSC = 1, D0 = 0, D1 = 0, D2 = 0, D3 = 1; break;
case 8: LSA = 0, LSB = 0, LSC = 0, D0 = 1, D1 = 1, D2 = 1, D3 = 0; break;
case 9: LSA = 1, LSB = 0, LSC = 0, D0 = 0, D1 = 1, D2 = 1, D3 = 0; break;
default: break;
}
}
void main()
{
while(1)
{
scan_key(); // 扫描键盘
display(num1 % 10); // 显示个位数字
delay(5);
display(num1 / 10 % 10); // 显示十位数字
delay(5);
display(num1 / 100); // 显示百位数字
delay(5);
}
}
```
在以上代码中,我们通过扫描键盘来获取用户的输入,并根据不同的按键进行相应的计算操作。同时,我们还使用了数码管来显示计算结果。需要注意的是,由于使用了延时函数来控制数码管的显示,可能会导致按键响应速度变慢,因此可以考虑使用定时器来代替延时函数来控制数码管的显示。
typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; #define SMG_A_DP_PORT P0 //使用宏定义数码管段码口 //共阴极数码管显示0~F的段码数据 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { SMG_A_DP_PORT=gsmg_code[0];//将数组第1个数据赋值给数码管段选口 while(1) { } }
这段代码是一个简单的示例程序,用于控制共阴极数码管显示0~F的段码数据。
首先,代码通过 `typedef` 对系统默认数据类型进行了重新定义,将 `unsigned int` 重定义为 `u16`,将 `unsigned char` 重定义为 `u8`。
然后,通过 `#define` 定义了一个宏 `SMG_A_DP_PORT`,用于表示数码管段码口。
接着,定义了一个长度为17的数组 `gsmg_code`,其中存储了共阴极数码管显示0~F的段码数据。每个元素都是一个十六进制数,分别对应一个特定的段码。
在 `main` 函数中,将数组中的第一个数据赋值给数码管段选口 `SMG_A_DP_PORT`。然后程序进入一个无限循环,不做其他操作。
这段示例代码基本上只是将数组中的第一个数据赋值给了数码管段选口,具体的数码管显示操作并未在代码中体现出来。如果要实现完整的数码管显示功能,还需要进一步的代码编写。