To solve this optimization problem, we first need to define the decision variables, the objective function, and the constraints.

- Decision Variables:
  - Let \(L\) be the number of packets of lemon candy made.
  - Let \(C\) be the number of packets of cherry candy made.

- Objective Function:
  - The profit per packet of lemon candy is $5, and the profit per packet of cherry candy is $7. Therefore, the total profit \(P\) can be represented as \(P = 5L + 7C\).

- Constraints:
  - Time Constraint: Each packet of lemon candy takes 20 minutes to make, and each packet of cherry candy takes 25 minutes to make. The store has available 3000 minutes. Therefore, the time constraint is \(20L + 25C \leq 3000\).
  - Quantity Constraints:
    - For lemon candy: \(L \leq 100\)
    - For cherry candy: \(C \leq 80\)
  - Non-Negativity Constraints: Since the number of packets cannot be negative, we have \(L \geq 0\) and \(C \geq 0\).

Given these definitions, we can set up the optimization problem as a linear programming problem where we aim to maximize the total profit \(P\) under the given constraints.

Here is how you could implement this in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Candy Store Profit Maximization")

# Define the decision variables
L = m.addVar(lb=0, vtype=GRB.INTEGER, name="LemonCandyPackets")
C = m.addVar(lb=0, vtype=GRB.INTEGER, name="CherryCandyPackets")

# Set the objective function to maximize profit
m.setObjective(5*L + 7*C, GRB.MAXIMIZE)

# Add constraints
m.addConstr(20*L + 25*C <= 3000, "TimeConstraint")
m.addConstr(L <= 100, "LemonCandyQuantityConstraint")
m.addConstr(C <= 80, "CherryCandyQuantityConstraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: {L.varName} = {L.x}, {C.varName} = {C.x}")
    print(f"Maximum Profit: ${5*L.x + 7*C.x}")
else:
    print("No optimal solution found")
```