A method of programming a selected non-volatile memory cell to store one of N possible values, where N is an integer greater than 2, the selected non-volatile memory cell comprising a floating gate and a control gate, the method comprising: performing a coarse programming process comprising: programming the non-volatile memory cell with an initial programming voltage; applying a first voltage (VCGR1) to the control gate of the selected non-volatile memory cell and measuring a first current that results through the selected non-volatile memory cell; applying a second voltage (VCGR2) to the control gate of the selected non-volatile memory cell and measuring a second current that results through the selected non-volatile memory cell; determining a slope value based on the first voltage, the second voltage, the first current, and the second current according to the equation (first voltage - second voltage) / (LOG(first current) - LOG(second current)); determining a next programming voltage based on the slope value; programming the non-volatile memory cell with the next programming voltage; repeating the steps of determining a next programming voltage and programming the non-volatile memory cell with the next programming voltage until a current through the selected non-volatile memory cell during a read or verify operation is less than or equal to a first threshold current value (I CT, 3906); when a current through the selected non-volatile memory cell is less than or equal to a second threshold current value (I CT, 3907) smaller than the first threshold current value, erasing the selected non-volatile memory cell and repeating the coarse programming process; and performing a precision programming process until a current through the selected non-volatile memory cell during a read or verify operation is the target current (I D) within an acceptable deviation range. performing a coarse programming process comprising: programming the non-volatile memory cell with an initial programming voltage; applying a first voltage (VCGR1) to the control gate of the selected non-volatile memory cell and measuring a first current that results through the selected non-volatile memory cell; applying a second voltage (VCGR2) to the control gate of the selected non-volatile memory cell and measuring a second current that results through the selected non-volatile memory cell; determining a slope value based on the first voltage, the second voltage, the first current, and the second current according to the equation (first voltage - second voltage) / (LOG(first current) - LOG(second current)); determining a next programming voltage based on the slope value; programming the non-volatile memory cell with the next programming voltage; repeating the steps of determining a next programming voltage and programming the non-volatile memory cell with the next programming voltage until a current through the selected non-volatile memory cell during a read or verify operation is less than or equal to a first threshold current value (I CT, 3906); when a current through the selected non-volatile memory cell is less than or equal to a second threshold current value (I CT, 3907) smaller than the first threshold current value, erasing the selected non-volatile memory cell and repeating the coarse programming process; and programming the non-volatile memory cell with an initial programming voltage; applying a first voltage (VCGR1) to the control gate of the selected non-volatile memory cell and measuring a first current that results through the selected non-volatile memory cell; applying a second voltage (VCGR2) to the control gate of the selected non-volatile memory cell and measuring a second current that results through the selected non-volatile memory cell; determining a slope value based on the first voltage, the second voltage, the first current, and the second current according to the equation (first voltage - second voltage) / (LOG(first current) - LOG(second current)); determining a next programming voltage based on the slope value; programming the non-volatile memory cell with the next programming voltage; repeating the steps of determining a next programming voltage and programming the non-volatile memory cell with the next programming voltage until a current through the selected non-volatile memory cell during a read or verify operation is less than or equal to a first threshold current value (I CT, 3906); when a current through the selected non-volatile memory cell is less than or equal to a second threshold current value (I CT, 3907) smaller than the first threshold current value, erasing the selected non-volatile memory cell and repeating the coarse programming process; and performing a precision programming process until a current through the selected non-volatile memory cell during a read or verify operation is the target current (I D) within an acceptable deviation range.