master
Guy Carver 2017-11-04 17:43:12 -04:00
rodzic c00e592a4d
commit 4b7db95d06
14 zmienionych plików z 0 dodań i 2705 usunięć

Wyświetl plik

@ -1,562 +0,0 @@
#driver for GY-521 Accelerometer
#Translated by Guy Carver from the MPU6050 sample code.
import pyb
ADDRESS_LOW = 0x68 #address pin low (GND), default for InvenSense evaluation board
ADDRESS_HIGH = 0x69 #address pin high (VCC)
RA_XG_OFFS_TC = 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
RA_YG_OFFS_TC = 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
RA_ZG_OFFS_TC = 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
RA_X_FINE_GAIN = 0x03 //[7:0] X_FINE_GAIN
RA_Y_FINE_GAIN = 0x04 //[7:0] Y_FINE_GAIN
RA_Z_FINE_GAIN = 0x05 //[7:0] Z_FINE_GAIN
RA_XA_OFFS_H = 0x06 //[15:0] XA_OFFS
RA_XA_OFFS_L_TC = 0x07
RA_YA_OFFS_H = 0x08 //[15:0] YA_OFFS
RA_YA_OFFS_L_TC = 0x09
RA_ZA_OFFS_H = 0x0A //[15:0] ZA_OFFS
RA_ZA_OFFS_L_TC = 0x0B
RA_XG_OFFS_USRH = 0x13 //[15:0] XG_OFFS_USR
RA_XG_OFFS_USRL = 0x14
RA_YG_OFFS_USRH = 0x15 //[15:0] YG_OFFS_USR
RA_YG_OFFS_USRL = 0x16
RA_ZG_OFFS_USRH = 0x17 //[15:0] ZG_OFFS_USR
RA_ZG_OFFS_USRL = 0x18
RA_SMPLRT_DIV = 0x19
RA_CONFIG = 0x1A
RA_GYRO_CONFIG = 0x1B
RA_ACCEL_CONFIG = 0x1C
RA_FF_THR = 0x1D
RA_FF_DUR = 0x1E
RA_MOT_THR = 0x1F
RA_MOT_DUR = 0x20
RA_ZRMOT_THR = 0x21
RA_ZRMOT_DUR = 0x22
RA_FIFO_EN = 0x23
RA_I2C_MST_CTRL = 0x24
RA_I2C_SLV0_ADDR = 0x25
RA_I2C_SLV0_REG = 0x26
RA_I2C_SLV0_CTRL = 0x27
RA_I2C_SLV1_ADDR = 0x28
RA_I2C_SLV1_REG = 0x29
RA_I2C_SLV1_CTRL = 0x2A
RA_I2C_SLV2_ADDR = 0x2B
RA_I2C_SLV2_REG = 0x2C
RA_I2C_SLV2_CTRL = 0x2D
RA_I2C_SLV3_ADDR = 0x2E
RA_I2C_SLV3_REG = 0x2F
RA_I2C_SLV3_CTRL = 0x30
RA_I2C_SLV4_ADDR = 0x31
RA_I2C_SLV4_REG = 0x32
RA_I2C_SLV4_DO = 0x33
RA_I2C_SLV4_CTRL = 0x34
RA_I2C_SLV4_DI = 0x35
RA_I2C_MST_STATUS = 0x36
RA_INT_PIN_CFG = 0x37
RA_INT_ENABLE = 0x38
RA_DMP_INT_STATUS = 0x39
RA_INT_STATUS = 0x3A
RA_ACCEL_XOUT_H = 0x3B
RA_ACCEL_XOUT_L = 0x3C
RA_ACCEL_YOUT_H = 0x3D
RA_ACCEL_YOUT_L = 0x3E
RA_ACCEL_ZOUT_H = 0x3F
RA_ACCEL_ZOUT_L = 0x40
RA_TEMP_OUT_H = 0x41
RA_TEMP_OUT_L = 0x42
RA_GYRO_XOUT_H = 0x43
RA_GYRO_XOUT_L = 0x44
RA_GYRO_YOUT_H = 0x45
RA_GYRO_YOUT_L = 0x46
RA_GYRO_ZOUT_H = 0x47
RA_GYRO_ZOUT_L = 0x48
RA_EXT_SENS_DATA_00 = 0x49
RA_EXT_SENS_DATA_01 = 0x4A
RA_EXT_SENS_DATA_02 = 0x4B
RA_EXT_SENS_DATA_03 = 0x4C
RA_EXT_SENS_DATA_04 = 0x4D
RA_EXT_SENS_DATA_05 = 0x4E
RA_EXT_SENS_DATA_06 = 0x4F
RA_EXT_SENS_DATA_07 = 0x50
RA_EXT_SENS_DATA_08 = 0x51
RA_EXT_SENS_DATA_09 = 0x52
RA_EXT_SENS_DATA_10 = 0x53
RA_EXT_SENS_DATA_11 = 0x54
RA_EXT_SENS_DATA_12 = 0x55
RA_EXT_SENS_DATA_13 = 0x56
RA_EXT_SENS_DATA_14 = 0x57
RA_EXT_SENS_DATA_15 = 0x58
RA_EXT_SENS_DATA_16 = 0x59
RA_EXT_SENS_DATA_17 = 0x5A
RA_EXT_SENS_DATA_18 = 0x5B
RA_EXT_SENS_DATA_19 = 0x5C
RA_EXT_SENS_DATA_20 = 0x5D
RA_EXT_SENS_DATA_21 = 0x5E
RA_EXT_SENS_DATA_22 = 0x5F
RA_EXT_SENS_DATA_23 = 0x60
RA_MOT_DETECT_STATUS = 0x61
RA_I2C_SLV0_DO = 0x63
RA_I2C_SLV1_DO = 0x64
RA_I2C_SLV2_DO = 0x65
RA_I2C_SLV3_DO = 0x66
RA_I2C_MST_DELAY_CTRL = 0x67
RA_SIGNAL_PATH_RESET = 0x68
RA_MOT_DETECT_CTRL = 0x69
RA_USER_CTRL = 0x6A
RA_PWR_MGMT_1 = 0x6B
RA_PWR_MGMT_2 = 0x6C
RA_BANK_SEL = 0x6D
RA_MEM_START_ADDR = 0x6E
RA_MEM_R_W = 0x6F
RA_DMP_CFG_1 = 0x70
RA_DMP_CFG_2 = 0x71
RA_FIFO_COUNTH = 0x72
RA_FIFO_COUNTL = 0x73
RA_FIFO_R_W = 0x74
RA_WHO_AM_I = 0x75
TC_PWR_MODE_BIT = 7
TC_OFFSET_BIT = 6
TC_OFFSET_LENGTH = 6
TC_OTP_BNK_VLD_BIT = 0
VDDIO_LEVEL_VLOGIC = 0
VDDIO_LEVEL_VDD = 1
CFG_EXT_SYNC_SET_BIT = 5
CFG_EXT_SYNC_SET_LENGTH = 3
CFG_DLPF_CFG_BIT = 2
CFG_DLPF_CFG_LENGTH = 3
EXT_SYNC_DISABLED = 0x0
EXT_SYNC_TEMP_OUT_L = 0x1
EXT_SYNC_GYRO_XOUT_L = 0x2
EXT_SYNC_GYRO_YOUT_L = 0x3
EXT_SYNC_GYRO_ZOUT_L = 0x4
EXT_SYNC_ACCEL_XOUT_L = 0x5
EXT_SYNC_ACCEL_YOUT_L = 0x6
EXT_SYNC_ACCEL_ZOUT_L = 0x7
DLPF_BW_256 = 0x00
DLPF_BW_188 = 0x01
DLPF_BW_98 = 0x02
DLPF_BW_42 = 0x03
DLPF_BW_20 = 0x04
DLPF_BW_10 = 0x05
DLPF_BW_5 = 0x06
GCONFIG_FS_SEL_BIT = 4
GCONFIG_FS_SEL_LENGTH = 2
GYRO_FS_250 = 0x00
GYRO_FS_500 = 0x01
GYRO_FS_1000 = 0x02
GYRO_FS_2000 = 0x03
ACONFIG_XA_ST_BIT = 7
ACONFIG_YA_ST_BIT = 6
ACONFIG_ZA_ST_BIT = 5
ACONFIG_AFS_SEL_BIT = 4
ACONFIG_AFS_SEL_LENGTH = 2
ACONFIG_ACCEL_HPF_BIT = 2
ACONFIG_ACCEL_HPF_LENGTH = 3
ACCEL_FS_2 = 0x00
ACCEL_FS_4 = 0x01
ACCEL_FS_8 = 0x02
ACCEL_FS_16 = 0x03
DHPF_RESET = 0x00
DHPF_5 = 0x01
DHPF_2P5 = 0x02
DHPF_1P25 = 0x03
DHPF_0P63 = 0x04
DHPF_HOLD = 0x07
TEMP_FIFO_EN_BIT = 7
XG_FIFO_EN_BIT = 6
YG_FIFO_EN_BIT = 5
ZG_FIFO_EN_BIT = 4
ACCEL_FIFO_EN_BIT = 3
SLV2_FIFO_EN_BIT = 2
SLV1_FIFO_EN_BIT = 1
SLV0_FIFO_EN_BIT = 0
MULT_MST_EN_BIT = 7
WAIT_FOR_ES_BIT = 6
SLV_3_FIFO_EN_BIT = 5
I2C_MST_P_NSR_BIT = 4
I2C_MST_CLK_BIT = 3
I2C_MST_CLK_LENGTH = 4
CLOCK_DIV_348 = 0x0
CLOCK_DIV_333 = 0x1
CLOCK_DIV_320 = 0x2
CLOCK_DIV_308 = 0x3
CLOCK_DIV_296 = 0x4
CLOCK_DIV_286 = 0x5
CLOCK_DIV_276 = 0x6
CLOCK_DIV_267 = 0x7
CLOCK_DIV_258 = 0x8
CLOCK_DIV_500 = 0x9
CLOCK_DIV_471 = 0xA
CLOCK_DIV_444 = 0xB
CLOCK_DIV_421 = 0xC
CLOCK_DIV_400 = 0xD
CLOCK_DIV_381 = 0xE
CLOCK_DIV_364 = 0xF
I2C_SLV_RW_BIT = 7
I2C_SLV_ADDR_BIT = 6
I2C_SLV_ADDR_LENGTH = 7
I2C_SLV_EN_BIT = 7
I2C_SLV_BYTE_SW_BIT = 6
I2C_SLV_REG_DIS_BIT = 5
I2C_SLV_GRP_BIT = 4
I2C_SLV_LEN_BIT = 3
I2C_SLV_LEN_LENGTH = 4
I2C_SLV4_RW_BIT = 7
I2C_SLV4_ADDR_BIT = 6
I2C_SLV4_ADDR_LENGTH = 7
I2C_SLV4_EN_BIT = 7
I2C_SLV4_INT_EN_BIT = 6
I2C_SLV4_REG_DIS_BIT = 5
I2C_SLV4_MST_DLY_BIT = 4
I2C_SLV4_MST_DLY_LENGTH = 5
MST_PASS_THROUGH_BIT = 7
MST_I2C_SLV4_DONE_BIT = 6
MST_I2C_LOST_ARB_BIT = 5
MST_I2C_SLV4_NACK_BIT = 4
MST_I2C_SLV3_NACK_BIT = 3
MST_I2C_SLV2_NACK_BIT = 2
MST_I2C_SLV1_NACK_BIT = 1
MST_I2C_SLV0_NACK_BIT = 0
INTCFG_INT_LEVEL_BIT = 7
INTCFG_INT_OPEN_BIT = 6
INTCFG_LATCH_INT_EN_BIT = 5
INTCFG_INT_RD_CLEAR_BIT = 4
INTCFG_FSYNC_INT_LEVEL_BIT = 3
INTCFG_FSYNC_INT_EN_BIT = 2
INTCFG_I2C_BYPASS_EN_BIT = 1
INTCFG_CLKOUT_EN_BIT = 0
INTMODE_ACTIVEHIGH = 0x00
INTMODE_ACTIVELOW = 0x01
INTDRV_PUSHPULL = 0x00
INTDRV_OPENDRAIN = 0x01
INTLATCH_50USPULSE = 0x00
INTLATCH_WAITCLEAR = 0x01
INTCLEAR_STATUSREAD = 0x00
INTCLEAR_ANYREAD = 0x01
INTERRUPT_FF_BIT = 7
INTERRUPT_MOT_BIT = 6
INTERRUPT_ZMOT_BIT = 5
INTERRUPT_FIFO_OFLOW_BIT = 4
INTERRUPT_I2C_MST_INT_BIT = 3
INTERRUPT_PLL_RDY_INT_BIT = 2
INTERRUPT_DMP_INT_BIT = 1
INTERRUPT_DATA_RDY_BIT = 0
# TODO: figure out what these actually do
# UMPL source code is not very obivous
DMPINT_5_BIT = 5
DMPINT_4_BIT = 4
DMPINT_3_BIT = 3
DMPINT_2_BIT = 2
DMPINT_1_BIT = 1
DMPINT_0_BIT = 0
MOTION_MOT_XNEG_BIT = 7
MOTION_MOT_XPOS_BIT = 6
MOTION_MOT_YNEG_BIT = 5
MOTION_MOT_YPOS_BIT = 4
MOTION_MOT_ZNEG_BIT = 3
MOTION_MOT_ZPOS_BIT = 2
MOTION_MOT_ZRMOT_BIT = 0
DELAYCTRL_DELAY_ES_SHADOW_BIT = 7
DELAYCTRL_I2C_SLV4_DLY_EN_BIT = 4
DELAYCTRL_I2C_SLV3_DLY_EN_BIT = 3
DELAYCTRL_I2C_SLV2_DLY_EN_BIT = 2
DELAYCTRL_I2C_SLV1_DLY_EN_BIT = 1
DELAYCTRL_I2C_SLV0_DLY_EN_BIT = 0
PATHRESET_GYRO_RESET_BIT = 2
PATHRESET_ACCEL_RESET_BIT = 1
PATHRESET_TEMP_RESET_BIT = 0
DETECT_ACCEL_ON_DELAY_BIT = 5
DETECT_ACCEL_ON_DELAY_LENGTH = 2
DETECT_FF_COUNT_BIT = 3
DETECT_FF_COUNT_LENGTH = 2
DETECT_MOT_COUNT_BIT = 1
DETECT_MOT_COUNT_LENGTH = 2
DETECT_DECREMENT_RESET = 0x0
DETECT_DECREMENT_1 = 0x1
DETECT_DECREMENT_2 = 0x2
DETECT_DECREMENT_4 = 0x3
USERCTRL_DMP_EN_BIT = 7
USERCTRL_FIFO_EN_BIT = 6
USERCTRL_I2C_MST_EN_BIT = 5
USERCTRL_I2C_IF_DIS_BIT = 4
USERCTRL_DMP_RESET_BIT = 3
USERCTRL_FIFO_RESET_BIT = 2
USERCTRL_I2C_MST_RESET_BIT = 1
USERCTRL_SIG_COND_RESET_BIT = 0
PWR1_DEVICE_RESET_BIT = 7
PWR1_SLEEP_BIT = 6
PWR1_CYCLE_BIT = 5
PWR1_TEMP_DIS_BIT = 3
PWR1_CLKSEL_BIT = 2
PWR1_CLKSEL_LENGTH = 3
CLOCK_INTERNAL = 0x00
CLOCK_PLL_XGYRO = 0x01
CLOCK_PLL_YGYRO = 0x02
CLOCK_PLL_ZGYRO = 0x03
CLOCK_PLL_EXT32K = 0x04
CLOCK_PLL_EXT19M = 0x05
CLOCK_KEEP_RESET = 0x07
PWR2_LP_WAKE_CTRL_BIT = 7
PWR2_LP_WAKE_CTRL_LENGTH = 2
PWR2_STBY_XA_BIT = 5
PWR2_STBY_YA_BIT = 4
PWR2_STBY_ZA_BIT = 3
PWR2_STBY_XG_BIT = 2
PWR2_STBY_YG_BIT = 1
PWR2_STBY_ZG_BIT = 0
WAKE_FREQ_1P25 = 0x0
WAKE_FREQ_2P5 = 0x1
WAKE_FREQ_5 = 0x2
WAKE_FREQ_10 = 0x3
BANKSEL_PRFTCH_EN_BIT = 6
BANKSEL_CFG_USER_BANK_BIT = 5
BANKSEL_MEM_SEL_BIT = 4
BANKSEL_MEM_SEL_LENGTH = 5
WHO_AM_I_BIT = 6
WHO_AM_I_LENGTH = 6
DMP_MEMORY_BANKS = 8
DMP_MEMORY_BANK_SIZE = 256
DMP_MEMORY_CHUNK_SIZE = 16
class Accel(object) :
"""GY-521 Accelerometer."""
@staticmethod
def color( aR, aG, aB ) :
'''Create a 565 rgb TFTColor value'''
return TFTColor(aR, aG, aB)
def __init__( self, aLoc, aAddress = ADDRESS_LOW ) :
"""aLoc I2C pin location is either 1 for 'X' or 2 for 'Y'.
aAddress is either ADDRESS_LOW or ADDRESS_HIGH."""
if 1 > aLoc > 2 :
raise Exception("aLoc must be 1 or 2.")
self._data = bytearray(1)
self._data6 = bytearray(6)
self._data14 = bytearray(14)
self._address = aAddress
self._i2c = pyb.I2C(aLoc, pyb.I2C.MASTER, baudrate = 400000)
self.setclocksource(CLOCK_PLL_XGYRO)
self.setfullscalegyrorange(GYRO_FS_250)
self.setfulscaleaccelrange(ACCEL_FS_2)
self.setsleepenabled(False)
def getrate( self ) :
self._readdata(RA_SMPLRT_DIV, self._data)
return self._data[0]
def setrate( self, aRate ) :
self._writedata(RA_SMPLRT_DIV, aRate)
def getDLPF( self ) :
return self._readbits(RA_CONFIG, CFG_DLPF_CFG_BIT, CFG_DLPF_CFG_LENGTH)
def setDLPF( self, aMode ) :
self._writebits(RA_CONFIG, CFG_DLPF_CFG_BIT, CFG_DLPF_CFG_LENGTH, aMode)
def setclocksource( self, aSource ) :
self._writebits(RA_PWR_MGMT_1, PWR1_CLKSEL_BIT, PWR1_CLKSEL_LENGTH, aSource)
def getfullscalegyrorange( self ) :
return self._readbits(RA_GYRO_CONFIG, GCONFIG_FS_SEL_BIT, GCONFIG_FS_SEL_LENGTH)
def setfullscalegyrorange( self, aRange ) :
self._writebits(RA_GYRO_CONFIG, GCONFIG_FS_SEL_BIT, GCONFIG_FS_SEL_LENGTH, aRange)
def getfullscaleaccelrange( self ) :
self._readbits(RA_ACCEL_CONFIG, ACONFIG_AFS_SEL_BIT, ACONFIG_AFS_SEL_LENGTH)
def setfullscaleaccelrange( self, aRange ) :
self._writebits(RA_ACCEL_CONFIG, ACONFIG_AFS_SEL_BIT, ACONFIG_AFS_SEL_LENGTH, aRange)
def getsleepenabled( self ) :
self._readbits(RA_PWR_MGMT_1, PWR1_SLEEP_BIT, 1)
def setsleepenabled( self, aTF ) :
self._writebits(RA_PWR_MGMT_1, PWR1_SLEEP_BIT, 1, aTF)
def getfreefalldetectionthreshold( self ) :
self._readdata(RA_FF_THR, self._data)
return self._data[0]
def setfreefalldetectionthreshold( self, aValue ) :
self._writedata(RA_FF_THR, aValue)
def getfreefalldetectionduration( self ) :
self._readdata(RA_FF_DUR, self._data)
return self._data[0]
def setfreefalldetectionduration( self, aValue ) :
self._writedata(RA_FF_DUR, aValue)
def getmotiondetectionthreshold( self ) :
self._readdata(RA_MOT_THR, self._data)
return self._data[0]
def setmotiondetectionthreshold( self, aValue ) :
self._writedata(RA_MOT_THR, aValue)
def getmotiondetectionduration( self ) :
self._readdata(RA_MOT_DUR, self._data)
return self._data[0]
def setmotiondetectionduration( self, aValue ) :
self._writedata(RA_MOT_DUR, aValue)
def getzeromotiondetectionthreshold( self ) :
self._readdata(RA_ZRMOT_THR, self._data)
return self._data[0]
def setzeromotiondetectionthreshold( self, aValue ) :
self._writedata(RA_ZRMOT_THR, aValue)
def getzeromotiondetectionduration( self ) :
self._readdata(RA_ZRMOT_DUR, self._data)
return self._data[0]
def setzeromotiondetectionduration( self, aValue ) :
self._writedata(RA_ZRMOT_DUR, aValue)
def getFIFOenabled( self ) :
return self._readbits(RA_USER_CTRL, USERCTRL_FIFO_EN_BIT, 1)
def setFIFFOenabled( self, aTF ) :
self._writebits(RA_USER_CTRL, USERCTRL_FIFO_EN_BIT, 1, aTF)
def gettempFIFOenabled( self ) :
return self._readbits(RA_FIFO_EN, TEMP_FIFO_EN_BIT, 1)
def settempFIFFOenabled( self, aTF ) :
self._writebits(RA_FIFO_EN, TEMP_FIFO_EN_BIT, 1, aTF)
def getxgyroFIFOenabled( self ) :
return self._readbits(RA_FIFO_EN, XG_FIFO_EN_BIT, 1)
def setxgyroFIFOenabled( self, aTF ) :
self._writebits(RA_FIFO_EN, XG_FIFO_EN_BIT, 1, aTF)
def getygyroFIFOenabled( self ) :
return self._readbits(RA_FIFO_EN, YG_FIFO_EN_BIT, 1)
def setygyroFIFOenabled( self, aTF ) :
self._writebits(RA_FIFO_EN, YG_FIFO_EN_BIT, 1, aTF)
def getzgyroFIFOenabled( self ) :
return self._readbits(RA_FIFO_EN, ZG_FIFO_EN_BIT, 1)
def setzgyroFIFOenabled( self, aTF ) :
self._writebits(RA_FIFO_EN, ZG_FIFO_EN_BIT, 1, aTF)
def getaccelFIFOenabled( self ) :
return self._readbits(RA_FIFO_EN, ACCEL_FIFO_EN_BIT, 1)
def setaccelFIFOenabled( self, aTF ) :
self._writebits(RA_FIFO_EN, ACCEL_FIFO_EN_BIT, 1, aTF)
def getmasterclockspeed( self ) :
return self._readbits(RA_I2C_MST_CTRL, I2C_MST_CLK_BIT, I2C_MST_CLK_LENGTH)
def setmasterclockspeed( self, aValue ) :
self._writebits(RA_I2C_MST_CTRL, I2C_MST_CLK_BIT, I2C_MST_CLK_LENGTH, aValue)
def getinterruptmode( self ) :
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_LEVEL_BIT, 1)
def setinterruptmode( self, aValue ) :
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_LEVEL_BIT, 1, aValue)
def getinterruptdrive( self ) :
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_OPEN_BIT, 1)
def setinterruptdrive( self, aValue ) :
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_OPEN_BIT, 1, aValue)
def getinterruptlatch( self ) :
return self._readbits(RA_INT_PIN_CFG, INTCFG_LATCH_INT_EN_BIT, 1)
def setinterruptlatch( self, aValue ) :
self._writebits(RA_INT_PIN_CFG, INTCFG_LATCH_INT_EN_BIT, 1, aValue)
def getinterruptlatchclear( self ) :
return self._readbits(RA_INT_PIN_CFG, INTCFG_INT_RD_CLEAR_BIT, 1)
def setinterruptlatchclear( self, aValue ) :
self._writebits(RA_INT_PIN_CFG, INTCFG_INT_RD_CLEAR_BIT, 1, aValue)
def getacceltemprot( self ) :
self._readdata(RA_ACCEL_XOUT_H, self._data14)
return [(self._data14[i] << 8) | self._data14[i + 1] for i in range(0, len(self._data14), 2)]
def getacceleration( self ) :
self._readdata(RA_ACCEL_XOUT_H, self._data6)
return [(self._data6[i] << 8) | self._data6[i + 1] for i in range(0, len(self._data6), 2)]
def getrotation( self ) :
self._readdata(RA_GYRO_XOUT_H, self.data6)
return [(self._data6[i] << 8) | self._data6[i + 1] for i in range(0, len(self._data6), 2)]
def reset( self ) :
self._writebits(RA_PWR_MGMT_1, PWR1_DEVICE_RESET_BIT, 1, True)
def _writedata( self, aAddress, aData ) :
self._i2c.mem_write(aData, self._address, aAddress)
def _readdata( self, aAddress, aData ) :
self._i2c.mem_read(aData, self._address, aAddress)
# @micropython.native
def _readbits( self, aAddress, aStart, aLen ) :
self._readdata(aAddress, self._data)
b = (self._data[0] >> (aStart - aLen + 1)) & ((1 << aLen) - 1)
# @micropython.native
def _writebits( self, aAddress, aStart, aLen, aValue ) :
self._readdata(aAddress, self._data)
mask = ((1 << aLen) - 1) << (aStart - aLen + 1)
aValue = (buffer[0] << (aStart - aLen + 1)) & mask #shift data into correct position
val &= ~mask
self._data[0] |= aValue
self._writedata(aAddress, self._data)

Wyświetl plik

@ -1,33 +0,0 @@
from pyb import Pin, ADC
class IRDistance(object):
""" Driver for Sharp Gp2y0a IR distance sensor. The distance
range is around 3 to 40 inches. """
maxinches = 31.5 #Maximun range of IR board in inches.
_v2i = -1.02 #Voltage to inches power.
def __init__( self, pin ) :
"""pin may be name or pin object. It must be able to handle ADC input."""
if type(pin) == str:
p = Pin(pin)
elif type(pin) == Pin:
p = pin
else:
raise Exception("pin must be pin name or pyb.Pin able to support ADC")
self._adc = ADC(p)
@property
def distance( self ) : return self._adc.read()
@property
def inches( self ) :
volts = self.distance * 0.0048828125
return 65.0 * pow(volts, IRDistance._v2i)
@property
def centimeters( self ) : return self.inches * 2.54

Wyświetl plik

@ -1,69 +0,0 @@
from pyb import UART, repl_uart, udelay
# JY-MCU Bluetooth board ----------------------------------------
# This opens connection with Bluetooth module connected to Y1, Y2 (UART 6)
# Then it sets the repl output to this UART.
#COMMANDS AT - does nothing but get an ok.
# The posible baudrates are:
# AT+BAUD1-------1200
# AT+BAUD2-------2400
# AT+BAUD3-------4800
# AT+BAUD4-------9600 - Default for hc-06
# AT+BAUD5------19200
# AT+BAUD6------38400
# AT+BAUD7------57600 - Johnny-five speed
# AT+BAUD8-----115200
# AT+BAUD9-----230400
# AT+BAUDA-----460800
# AT+BAUDB-----921600
# AT+BAUDC----1382400
# AT+VERSION
# AT+NAMEnewname This is the name that will show up in windows.
# AT+PIN???? set 4 digit pairing pin.
class JYMCU(object):
"""JY-MCU Bluetooth serial device driver. This is simply a light UART wrapper
with addition AT command methods to customize the device."""
def __init__( self, uart, baudrate ):
""" uart = uart #1-6, baudrate must match what is set on the JY-MCU.
Needs to be a #1-C. """
self._uart = UART(uart, baudrate)
def __del__( self ) : self._uart.deinit()
def any( self ) : return self._uart.any()
def write( self, astring ) : return self._uart.write(astring)
def writechar( self, achar ) : self._uart.writechar(achar)
def read( self, num = None ) : return self._uart.read(num)
def readline( self ) : return self._uart.readline()
def readchar( self ) : return self._uart.readchar()
def readall( self ) : return self._uart.readall()
def readinto( self, buf, count = None ) : return self._uart.readinto(buf, count)
def _cmd( self, cmd ) :
""" Send AT command, wait a bit then return result string. """
self._uart.write("AT+" + cmd)
udelay(500)
return self.readline()
def baudrate( self, rate ) :
""" Set the baud rate. Needs to be #1-C. """
return self._cmd("BAUD" + str(rate))
def name( self, name ) :
""" Set the name to show up on the connecting device. """
return self._cmd("NAME" + name)
def pin( self, pin ) :
""" Set the given 4 digit numeric pin. """
return self._cmd("PIN" + str(pin))
def version( self ) : return self._cmd("VERSION")
def setrepl( self ) : repl_uart(self._uart)

Wyświetl plik

@ -1,43 +0,0 @@
#Driver for the L298N Dual HBridge motor controller.
from PWM import PWM
from pyb import Pin, delay
class Motor( ):
"""Control a motor connected to the L298N Dual motor controller."""
def __init__( self, forward, backward, speed ) :
"""forward pin name, backward pin name, speed = (pin name, timer#)
Need to make sure the given timer # is associated with the speed
pin or an exception will be raised. The speed pin must support
PWM."""
self._forward = Pin(forward, Pin.OUT_PP)
self._backward = Pin(backward, Pin.OUT_PP)
self._speedControl = PWM(speed[0], speed[1])
self._speed = 0
@property
def speed( self ) : return self._speed
@speed.setter
def speed( self, value ) :
self._speed = value
if (value == 0):
self._forward.low()
self._backward.low()
elif (value < 0):
self._forward.low()
self._backward.high()
else:
self._forward.high()
self._backward.low()
self._speedControl.pulse_width_percent = min(100, abs(value))
def brake( self ) :
""" Brake the motor by sending power both directions. """
self._forward.high()
self._backward.high()
self._speedControl.pulse_width_percent = 100
delay(1000)
self.speed = 0

Wyświetl plik

@ -1,347 +0,0 @@
#driver for Sainsmart 1.8" TFT display ST7735
#Translated by Guy Carver from the ST7735 sample code.
#NOTE: This current code will set the pixel at 0,0 but the scrolling will not scroll it. Don't know if it's software causing it or not.
import pyb
_I2C_ADDRESS = const(0x3C) # 011110+SA0+RW - 0x3C or 0x3D
_SETCONTRAST = const(0x81)
_DISPLAYALLON_RESUME = const(0xA4)
_DISPLAYALLON = const(0xA5)
_NORMALDISPLAY = const(0xA6)
_INVERTDISPLAY = const(0xA7)
_DISPLAYOFF = const(0xAE)
_DISPLAYON = const(0xAF)
_SETDISPLAYOFFSET = const(0xD3)
_SETCOMPINS = const(0xDA)
_SETVCOMDETECT = const(0xDB)
_SETDISPLAYCLOCKDIV = const(0xD5)
_SETPRECHARGE = const(0xD9)
_SETMULTIPLEX = const(0xA8)
_SETLOWCOLUMN = const(0x00)
_SETHIGHCOLUMN = const(0x10)
_SETSTARTLINE = const(0x40)
_MEMORYMODE = const(0x20)
_COMSCANINC = const(0xC0)
_COMSCANDEC = const(0xC8)
_SEGREMAP = const(0xA0)
_CHARGEPUMP = const(0x8D)
_EXTRNALVCC = const(0x1)
_SWITCHAPVCC = const(0x2)
_ACTIVATE_SCROLL = const(0x2F)
_DEACTIVATE_SCROLL = const(0x2E)
_SET_VERTICAL_SCROLL_AREA = const(0xA3)
_RIGHT_HORIZONTAL_SCROLL = const(0x26)
_LEFT_HORIZONTAL_SCROLL = const(0x27)
_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = const(0x29)
_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = const(0x2A)
#Buffer layout in bits. 128 columns by 64 rows.
#Each byte represents 8 pixels in a row.
# Column
# R 0 8 10 ... 3F8
# O 1 9 11 ... 3F9
# W 2 A 12 ... 3FA
# 3 B 13 ... 3FB
# 4 C 14 ... 3FC
# 5 D 15 ... 3FD
# 6 E 16 ... 3FE
# 7 F 17 ... 3FF
# 400 408
# 401 409
# 402 40A
# 403 40B
# 404 40C
# 405 40D
# 406 40E
# 407 40F
class OLED(object) :
"""diyMall OLED 9.6 128x64 pixel display driver."""
def __init__( self, aLoc ) :
"""aLoc I2C pin location is either 1 for 'X' or 2 for 'Y'."""
self._size = (128, 64)
self._rotation = 0
self._inverted = False
self._on = False
self.i2c = pyb.I2C(aLoc, pyb.I2C.MASTER, baudrate = 200000)
self.bytes = self.size[0] * self.size[1] // 8
self.buffer = bytearray(self.bytes + 1)
self.buffer[0] = 0x40 #data write start command at very start of buffer.
self.data = bytearray(2)
self.data[0] = 0
self.command = _DISPLAYOFF
self.command = _SETDISPLAYCLOCKDIV
self.command = 0x80 #suggested ratio.
self.command = _SETMULTIPLEX
self.command = 0x3F
self.command = _SETDISPLAYOFFSET
self.command = 0x0
self.command = _SETSTARTLINE #| 0x0
self.command = _CHARGEPUMP
self.command = 0x14 #No external power.
self.command = _MEMORYMODE
self.command = 0x00 #Act like ks0108
self.command = _SEGREMAP + 0x01
self.command = _COMSCANDEC
self.command = _SETCOMPINS
self.command = 0x12
self.command = _SETCONTRAST
self.command = 0xCF
self.command = _SETPRECHARGE
self.command = 0xF1
self.command = _SETVCOMDETECT
self.command = 0x40
self.command = _DISPLAYALLON_RESUME
self.command = _NORMALDISPLAY
self.command = 0XB0
self.command = 0x10
self.command = 0x01 #Set original position to 0,0.
self.on = True
self.display()
@property
def size( self ) : return self._size
@property
def rotation( self ) : return self._rotation
@rotation.setter
def rotation( self, aValue ) :
self._rotation = aValue & 3
def write( self, aValue ) :
self.i2c.send(aValue, _I2C_ADDRESS)
@property
def command( self ) : return 0
@command.setter
def command( self, aValue ) :
self.data[1] = aValue
self.write(self.data)
@property
def on( self ) : return self._on
@on.setter
def on( self, aTF ) :
if aTF != self._on :
self._on = aTF
'''Turn display on or off.'''
self.command = _DISPLAYON if aTF else _DISPLAYOFF
@property
def invert( self ) : return self._inverted
@invert.setter
def invert( self, aTF ) :
if aTF != self._inverted :
self._inverted = aTF
self.command = _INVERTDISPLAY if aTF else _NORMALDISPLAY
@micropython.native
def fill( self, aValue ) :
for x in range(1, self.bytes + 1):
self.buffer[x] = aValue;
def clear( self ) :
self.fill(0)
@micropython.native
def pixel( self, aPos, aOn ) :
'''Draw a pixel at the given position'''
x, y = aPos
w, h = self.size
if 0 <= x < w and 0 <= y < h:
if self._rotation == 1:
aPos = (w - y - 1, x)
elif self._rotation == 2:
aPos = (w - x - 1, h - y - 1)
elif self._rotation == 3:
aPos = (y, h - x - 1)
bit = 1 << (aPos[1] % 8)
index = (aPos[0] + (aPos[1] // 8) * w) + 1
if aOn :
self.buffer[index] |= bit
else :
self.buffer[index] &= not bit
@micropython.native
def line( self, aStart, aEnd, aOn ) :
'''Draws a line from aStart to aEnd in the given color. Vertical or horizontal
lines are forwarded to vline and hline.'''
px, py = aStart
ex, ey = aEnd
dx = ex - px
dy = ey - py
inx = 1 if dx > 0 else -1
iny = 1 if dy > 0 else -1
dx = abs(dx)
dy = abs(dy)
if (dx >= dy):
dy <<= 1
e = dy - dx
dx <<= 1
while (px != ex):
self.pixel((px, py), aOn)
if (e >= 0):
py += iny
e -= dx
e += dy
px += inx
else:
dx <<= 1
e = dx - dy
dy <<= 1
while (py != ey):
self.pixel((px, py), aOn)
if (e >= 0):
px += inx
e -= dy
e += dx
py += iny
# @micropython.native
def fillrect( self, aStart, aSize, aOn ) :
'''Draw a filled rectangle. aStart is the smallest coordinate corner
and aSize is a tuple indicating width, height.'''
x, y = aStart
w, h = aSize
ex = x + w
for i in range(y, y + h):
self.line((x, i), (ex, i), aOn)
@micropython.native
def text( self, aPos, aString, aColor, aFont, aSize = 1 ) :
'''Draw a text at the given position. If the string reaches the end of the
display it is wrapped to aPos[0] on the next line. aSize may be an integer
which will size the font uniformly on w,h or a or any type that may be
indexed with [0] or [1].'''
if aFont == None:
return
#Make a size either from single value or 2 elements.
if (type(aSize) == int) or (type(aSize) == float):
wh = (aSize, aSize)
else:
wh = aSize
px, py = aPos
width = wh[0] * aFont["Width"] + 1
for c in aString:
self.char((px, py), c, aColor, aFont, wh)
px += width
#We check > rather than >= to let the right (blank) edge of the
# character print off the right of the screen.
if px + width > self._size[0]:
py += aFont["Height"] * wh[1] + 1
px = aPos[0]
@micropython.native
def char( self, aPos, aChar, aOn, aFont, aSizes ) :
'''Draw a character at the given position using the given font and color.
aSizes is a tuple with x, y as integer scales indicating the
# of pixels to draw for each pixel in the character.'''
if aFont == None:
return
startchar = aFont['Start']
endchar = aFont['End']
ci = ord(aChar)
if (startchar <= ci <= endchar):
fontw = aFont['Width']
fonth = aFont['Height']
ci = (ci - startchar) * fontw
charA = aFont["Data"][ci:ci + fontw]
px = aPos[0]
if aSizes[0] <= 1 and aSizes[1] <= 1 :
for c in charA :
py = aPos[1]
for r in range(fonth) :
if c & 0x01 :
self.pixel((px, py), aOn)
py += 1
c >>= 1
px += 1
else:
for c in charA :
py = aPos[1]
for r in range(fonth) :
if c & 0x01 :
self.fillrect((px, py), aSizes, aOn)
py += aSizes[1]
c >>= 1
px += aSizes[0]
def doscrollLR( self, start, stop, aDir ) :
self.command = aDir
self.command = 0x00
self.command = start
self.command = 0x00
self.command = stop
self.command = 0x01
self.command = 0xFF
self.command = _ACTIVATE_SCROLL
def startscrollright( self, start, stop ) :
self.doscrollLR(start, stop, _RIGHT_HORIZONTAL_SCROLL)
def startscrollleft( self, start, stop ) :
self.doscrollLR(start, stop, _LEFT_HORIZONTAL_SCROLL)
def doscrollDiag( self, start, stop, aDir ) :
self.command = _SET_VERTICAL_SCROLL_AREA
self.command = 0x00
self.command = self.size()[1]
self.command = aDir
self.command = 0x00
self.command = start
self.command = 0x00
self.command = stop
self.command = 0x01
self.command = _ACTIVATE_SCROLL
def startscrolldiagright( self, start, stop ) :
self.doscrollDiag(start, stop, _VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL)
def startscrolldiagleft( self, start, stop ) :
self.doscrollDiag(start, stop, _VERTICAL_AND_LEFT_HORIZONTAL_SCROLL)
def stopscroll( self ) :
self.command = _DEACTIVATE_SCROLL
def display( self ) :
self.command = _SETLOWCOLUMN #| 0x00
self.command = _SETHIGHCOLUMN #| 0x00
self.command = _SETSTARTLINE #| 0x00
#buffer starts with 0x40 in 1st byte which is the command to start the buffer write.
self.write(self.buffer)

Wyświetl plik

@ -1,72 +0,0 @@
#Passive infrared motipower sensor.
import pyb
class PIR(object):
"""Passive Infrared Motion Sensor driver. Supports on/off through an output pin
trigger reading as well as an interrupt callback on trigger high/low changes."""
def __init__(self, power, trigger, callback = None):
"""Power and trigger pins, optional interrupt callback in the format
of fun( bOnOff ). This will be called whenever the trigger state
changes."""
if power != None:
self._power = pyb.Pin(power, pyb.Pin.OUT_PP)
self._power.low()
else:
self._power = None
self._trigger = pyb.Pin(trigger, pyb.Pin.IN, pyb.Pin.PULL_DOWN)
self.interrupt = callback
def _onoff( self, aTF ) :
"""Turn device on/off"""
if (self._power != None):
if (aTF):
oldon = self.inton
self.inton = False #Make sure interrupt is off while turning on power to avoid false callbacks.
self._power.high()
if (oldon):
pyb.delay(200) #Need to wait a bit after turning on to make sure we don't get false values.
self.inton = oldon
else:
self._power.low()
@property
def power( self ) : return True if (self._power == None) else self._power.value()
@power.setter
def power( self, value ) : self._onoff(value)
def on( self ) : self.power = True
def off( self ) : self.power = False
@property
def trigger( self ) : return self._trigger.value()
@property
def interrupt( self ) : return self._interrupt
@interrupt.setter
def interrupt( self, func ) :
self._interrupt = None;
self._func = func
if (func != None):
self._interrupt = pyb.ExtInt(self._trigger, pyb.ExtInt.IRQ_RISING_FALLING, pyb.Pin.PULL_DOWN, self._inthandler)
self._inton = True
def _inthandler( self, line ) :
'''Function to handle interrupts and pass on to callback with on/off trigger state.'''
if (self._func != None):
self._func(self.trigger)
@property
def inton( self ) : return self._inton
@inton.setter
def inton( self, value ) :
self._inton = value
if self._interrupt != None:
if value :
self._interrupt.enable()
else:
self._interrupt.disable()

Wyświetl plik

@ -1,81 +0,0 @@
# PWM driver.
from pyb import Timer, Pin
class PWM(object):
"""docstring for PWMM"""
#Dict pin name: timer #, channel #.
PinChannels = {
'X1': [(2,1), (5,1)],
'X2': [(2,2), (5,2)],
'X3': [(2,3), (5,3), (9,1)],
'X4': [(2,4), (5,4), (9,2)],
'X6': [(2,1), (8,1)],
'X7': [(13, 1)],
'X8': [(1,1), (8,1), (14,1)],
'X9': [(4,1)],
'X10': [(4,2)],
'Y1': [(8,1)],
'Y2': [(8,2)],
'Y3': [(4,3), (10,1)],
'Y4': [(4,4), (11,1)],
'Y6': [(1,1)],
'Y7': [(1,2), (8,2), (12,1)],
'Y8': [(1,3), (8,3), (12,2)],
'Y9': [(2,3)],
'Y10': [(2,4)],
'Y11': [(1,2), (8,2)],
'Y12': [(1,3), (8,3)]
}
class PWMException(Exception):
def __init__( self, msg ) :
self.msg = msg
@staticmethod
def timerandchannel( pinname, timernum ) :
try:
a = PWM.PinChannels[pinname]
if timernum <= 0:
return a[0]
else:
for v in a:
if v[0] == timernum:
return v
except Exception as e :
raise PWM.PWMException("Pin {} cannot be used for PWM".format(pinname))
raise PWM.PWMException("Pin {} cannot use timer {}".format(pinname, timernum))
def __init__( self, p, timernum, afreq = 100 ) :
isname = type(p) == str
pinname = p if isname else p.name()
timernum, channel = PWM.timerandchannel(pinname, timernum)
if isname:
p = Pin(pinname)
self._timer = Timer(timernum, freq = afreq)
self._channel = self._timer.channel(channel, Timer.PWM, pin = p)
@property
def pulse_width( self ) : return self._channel.pulse_width()
@pulse_width.setter
def pulse_width( self, value ) : self._channel.pulse_width(value)
@property
def pulse_width_percent( self ) : return self._channel.pulse_width_percent()
@pulse_width_percent.setter
def pulse_width_percent( self, value ) : self._channel.pulse_width_percent(value)
@property
def freq( self ) : return self._timer.freq()
@freq.setter
def freq( self, value ) : self._timer.freq(value)
def callback( self, value ) :
self._channel.callback(value)

Wyświetl plik

@ -1,30 +0,0 @@
#Control a relay board.
from pyb import Pin
class Relay(object):
"""Control a relay board with an output pin. Set on to True to drive the relay pin low
which turns the relay on."""
def __init__( self, pin ) :
"""Pin may be a pin name or pyb.Pin object set for output."""
if type(pin) == str:
self._pin = Pin(pin, Pin.OUT_PP, Pin.PULL_DOWN)
elif type(pin) == Pin:
self._pin = pin
else:
raise Exception("pin must be pin name or pyb.Pin")
self.on = False
@property
def on( self ) : return self._pin.value()
@on.setter
def on( self, value ) :
if value:
self._pin.low()
else:
self._pin.high()

Wyświetl plik

@ -1,71 +0,0 @@
from pyb import Pin, Timer, udelay
# WARNING: Do not use PA4-X5 or PA5-X6 as the echo pin without a 1k resistor.
class SR04Distance(object):
""" """
maxinches = 20 #maximum range of SR04.
def __init__( self, tpin, epin, timer=2 ) :
""" """
if type(tpin) == str:
self._tpin = Pin(tpin, Pin.OUT_PP, Pin.PULL_NONE)
elif type(tpin) == Pin:
self._tpin = tpin
else:
raise Exception("trigger pin must be pin name or pyb.Pin configured for output.")
self._tpin.low()
if type(epin) == str:
self._epin = Pin(epin, Pin.IN, Pin.PULL_NONE)
elif type(epin) == Pin:
self._epin = epin
else:
raise Exception("echo pin must be pin name or pyb.Pin configured for input.")
# Create a microseconds counter.
self._micros = Timer(timer, prescaler=83, period=0x3fffffff)
def __del__( self ) :
self._micros.deinit()
@property
def counter( self ) : return self._micros.counter()
@counter.setter
def counter( self, value ) : self._micros.counter(value)
@property
def centimeters( self ) :
start = 0
end = 0
self.counter = 0
#Send 10us pulse.
self._tpin.high()
udelay(10)
self._tpin.low()
while not self._epin.value():
start = self.counter
j = 0
# Wait 'till the pulse is gone.
while self._epin.value() and j < 1000:
j += 1
end = self.counter
# Calc the duration of the recieved pulse, divide the result by
# 2 (round-trip) and divide it by 29 (the speed of sound is
# 340 m/s and that is 29 us/cm).
return (end - start) / 58
@property
def inches( self ) : return self.centimeters * 0.3937

Wyświetl plik

@ -1,763 +0,0 @@
#driver for Sainsmart 1.8" TFT display ST7735
#Translated by Guy Carver from the ST7735 sample code.
import pyb
from math import sqrt
#TFTRotations and TFTRGB are bits to set
# on MADCTL to control display rotation/color layout
#Looking at display with pins on top.
#00 = upper left printing right
#10 = does nothing (MADCTL_ML)
#20 = upper left printing down (backwards) (Vertical flip)
#40 = upper right printing left (backwards) (X Flip)
#80 = lower left printing right (backwards) (Y Flip)
#04 = (MADCTL_MH)
#60 = 90 right rotation
#C0 = 180 right rotation
#A0 = 270 right rotation
TFTRotations = [0x00, 0x60, 0xC0, 0xA0]
TFTBGR = 0x08 #When set color is bgr else rgb.
TFTRGB = 0x00
@micropython.native
def clamp( aValue, aMin, aMax ) :
return max(aMin, min(aMax, aValue))
@micropython.native
def TFTColor( aR, aG, aB ) :
'''Create a 16 bit rgb value from the given R,G,B from 0-255.
This assumes rgb 565 layout and will be incorrect for bgr.'''
return ((aR & 0xF8) << 8) | ((aG & 0xFC) << 3) | (aB >> 3)
ScreenSize = (128, 160)
class TFT(object) :
"""Sainsmart TFT 7735 display driver."""
NOP = 0x0
SWRESET = 0x01
RDDID = 0x04
RDDST = 0x09
SLPIN = 0x10
SLPOUT = 0x11
PTLON = 0x12
NORON = 0x13
INVOFF = 0x20
INVON = 0x21
DISPOFF = 0x28
DISPON = 0x29
CASET = 0x2A
RASET = 0x2B
RAMWR = 0x2C
RAMRD = 0x2E
COLMOD = 0x3A
MADCTL = 0x36
FRMCTR1 = 0xB1
FRMCTR2 = 0xB2
FRMCTR3 = 0xB3
INVCTR = 0xB4
DISSET5 = 0xB6
PWCTR1 = 0xC0
PWCTR2 = 0xC1
PWCTR3 = 0xC2
PWCTR4 = 0xC3
PWCTR5 = 0xC4
VMCTR1 = 0xC5
RDID1 = 0xDA
RDID2 = 0xDB
RDID3 = 0xDC
RDID4 = 0xDD
PWCTR6 = 0xFC
GMCTRP1 = 0xE0
GMCTRN1 = 0xE1
BLACK = 0
RED = TFTColor(0xFF, 0x00, 0x00)
MAROON = TFTColor(0x80, 0x00, 0x00)
GREEN = TFTColor(0x00, 0xFF, 0x00)
FOREST = TFTColor(0x00, 0x80, 0x80)
BLUE = TFTColor(0x00, 0x00, 0xFF)
NAVY = TFTColor(0x00, 0x00, 0x80)
CYAN = TFTColor(0x00, 0xFF, 0xFF)
YELLOW = TFTColor(0xFF, 0xFF, 0x00)
PURPLE = TFTColor(0xFF, 0x00, 0xFF)
WHITE = TFTColor(0xFF, 0xFF, 0xFF)
GRAY = TFTColor(0x80, 0x80, 0x80)
@staticmethod
def color( aR, aG, aB ) :
'''Create a 565 rgb TFTColor value'''
return TFTColor(aR, aG, aB)
def __init__( self, aLoc, aDC, aReset ) :
"""aLoc SPI pin location is either 1 for 'X' or 2 for 'Y'.
aDC is the DC pin and aReset is the reset pin."""
self._size = ScreenSize
self.rotate = 0 #Vertical with top toward pins.
self._rgb = True #color order of rgb.
self.dc = pyb.Pin(aDC, pyb.Pin.OUT_PP, pyb.Pin.PULL_DOWN)
self.reset = pyb.Pin(aReset, pyb.Pin.OUT_PP, pyb.Pin.PULL_DOWN)
rate = 200000 #100000000 #Set way high but will be clamped to a maximum in SPI constructor.
cs = "X5" if aLoc == 1 else "Y5"
self.cs = pyb.Pin(cs, pyb.Pin.OUT_PP, pyb.Pin.PULL_DOWN)
self.cs.high()
self.spi = pyb.SPI(aLoc, pyb.SPI.MASTER, baudrate = rate, polarity = 1, phase = 0, crc=None)
self.colorData = bytearray(2)
self.windowLocData = bytearray(4)
def size( self ) :
return self._size
# @micropython.native
def on( self, aTF = True ) :
'''Turn display on or off.'''
self._writecommand(TFT.DISPON if aTF else TFT.DISPOFF)
# @micropython.native
def invertcolor( self, aBool ) :
'''Invert the color data IE: Black = White.'''
self._writecommand(TFT.INVON if aBool else TFT.INVOFF)
# @micropython.native
def rgb( self, aTF = True ) :
'''True = rgb else bgr'''
self._rgb = aTF
self._setMADCTL()
# @micropython.native
def rotation( self, aRot ) :
'''0 - 3. Starts vertical with top toward pins and rotates 90 deg
clockwise each step.'''
if (0 <= aRot < 4):
rotchange = self.rotate ^ aRot
self.rotate = aRot
#If switching from vertical to horizontal swap x,y
# (indicated by bit 0 changing).
if (rotchange & 1):
self._size =(self._size[1], self._size[0])
self._setMADCTL()
@micropython.native
def pixel( self, aPos, aColor ) :
'''Draw a pixel at the given position'''
if 0 <= aPos[0] < self._size[0] and 0 <= aPos[1] < self._size[1]:
self._setwindowpoint(aPos)
self._pushcolor(aColor)
# @micropython.native
def text( self, aPos, aString, aColor, aFont, aSize = 1 ) :
'''Draw a text at the given position. If the string reaches the end of the
display it is wrapped to aPos[0] on the next line. aSize may be an integer
which will size the font uniformly on w,h or a or any type that may be
indexed with [0] or [1].'''
if aFont == None:
return
#Make a size either from single value or 2 elements.
if (type(aSize) == int) or (type(aSize) == float):
wh = (aSize, aSize)
else:
wh = aSize
px, py = aPos
width = wh[0] * aFont["Width"] + 1
for c in aString:
self.char((px, py), c, aColor, aFont, wh)
px += width
#We check > rather than >= to let the right (blank) edge of the
# character print off the right of the screen.
if px + width > self._size[0]:
py += aFont["Height"] * wh[1] + 1
px = aPos[0]
# @micropython.native
def char( self, aPos, aChar, aColor, aFont, aSizes ) :
'''Draw a character at the given position using the given font and color.
aSizes is a tuple with x, y as integer scales indicating the
# of pixels to draw for each pixel in the character.'''
if aFont == None:
return
startchar = aFont['Start']
endchar = aFont['End']
ci = ord(aChar)
if (startchar <= ci <= endchar):
fontw = aFont['Width']
fonth = aFont['Height']
ci = (ci - startchar) * fontw
charA = aFont["Data"][ci:ci + fontw]
px = aPos[0]
if aSizes[0] <= 1 and aSizes[1] <= 1 :
for c in charA :
py = aPos[1]
for r in range(fonth) :
if c & 0x01 :
self.pixel((px, py), aColor)
py += 1
c >>= 1
px += 1
else:
for c in charA :
py = aPos[1]
for r in range(fonth) :
if c & 0x01 :
self.fillrect((px, py), aSizes, aColor)
py += aSizes[1]
c >>= 1
px += aSizes[0]
# @micropython.native
def line( self, aStart, aEnd, aColor ) :
'''Draws a line from aStart to aEnd in the given color. Vertical or horizontal
lines are forwarded to vline and hline.'''
if aStart[0] == aEnd[0]:
#Make sure we use the smallest y.
pnt = aEnd if (aEnd[1] < aStart[1]) else aStart
self.vline(pnt, abs(aEnd[1] - aStart[1]) + 1, aColor)
elif aStart[1] == aEnd[1]:
#Make sure we use the smallest x.
pnt = aEnd if aEnd[0] < aStart[0] else aStart
self.hline(pnt, abs(aEnd[0] - aStart[0]) + 1, aColor)
else:
px, py = aStart
ex, ey = aEnd
dx = ex - px
dy = ey - py
inx = 1 if dx > 0 else -1
iny = 1 if dy > 0 else -1
dx = abs(dx)
dy = abs(dy)
if (dx >= dy):
dy <<= 1
e = dy - dx
dx <<= 1
while (px != ex):
self.pixel((px, py), aColor)
if (e >= 0):
py += iny
e -= dx
e += dy
px += inx
else:
dx <<= 1
e = dx - dy
dy <<= 1
while (py != ey):
self.pixel((px, py), aColor)
if (e >= 0):
px += inx
e -= dy
e += dx
py += iny
# @micropython.native
def vline( self, aStart, aLen, aColor ) :
'''Draw a vertical line from aStart for aLen. aLen may be negative.'''
start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1]))
stop = (start[0], clamp(start[1] + aLen, 0, self._size[1]))
#Make sure smallest y 1st.
if (stop[1] < start[1]):
start, stop = stop, start
self._setwindowloc(start, stop)
self._draw(aLen, aColor)
# @micropython.native
def hline( self, aStart, aLen, aColor ) :
'''Draw a horizontal line from aStart for aLen. aLen may be negative.'''
start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1]))
stop = (clamp(start[0] + aLen, 0, self._size[0]), start[1])
#Make sure smallest x 1st.
if (stop[0] < start[0]):
start, stop = stop, start
self._setwindowloc(start, stop)
self._draw(aLen, aColor)
# @micropython.native
def rect( self, aStart, aSize, aColor ) :
'''Draw a hollow rectangle. aStart is the smallest coordinate corner
and aSize is a tuple indicating width, height.'''
self.hline(aStart, aSize[0], aColor)
self.hline((aStart[0], aStart[1] + aSize[1] - 1), aSize[0], aColor)
self.vline(aStart, aSize[1], aColor)
self.vline((aStart[0] + aSize[0] - 1, aStart[1]), aSize[1], aColor)
# @micropython.native
def fillrect( self, aStart, aSize, aColor ) :
'''Draw a filled rectangle. aStart is the smallest coordinate corner
and aSize is a tuple indicating width, height.'''
start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1]))
end = (clamp(start[0] + aSize[0] - 1, 0, self._size[0]), clamp(start[1] + aSize[1] - 1, 0, self._size[1]))
if (end[0] < start[0]):
tmp = end[0]
end = (start[0], end[1])
start = (tmp, start[1])
if (end[1] < start[1]):
tmp = end[1]
end = (end[0], start[1])
start = (start[0], tmp)
self._setwindowloc(start, end)
numPixels = (end[0] - start[0] + 1) * (end[1] - start[1] + 1)
self._draw(numPixels, aColor)
# @micropython.native
def circle( self, aPos, aRadius, aColor ) :
'''Draw a hollow circle with the given radius and color with aPos as center.'''
self.colorData[0] = aColor >> 8
self.colorData[1] = aColor
xend = int(0.7071 * aRadius) + 1
rsq = aRadius * aRadius
for x in range(xend) :
y = int(sqrt(rsq - x * x))
xp = aPos[0] + x
yp = aPos[1] + y
xn = aPos[0] - x
yn = aPos[1] - y
xyp = aPos[0] + y
yxp = aPos[1] + x
xyn = aPos[0] - y
yxn = aPos[1] - x
self._setwindowpoint((xp, yp))
self._writedata(self.colorData)
self._setwindowpoint((xp, yn))
self._writedata(self.colorData)
self._setwindowpoint((xn, yp))
self._writedata(self.colorData)
self._setwindowpoint((xn, yn))
self._writedata(self.colorData)
self._setwindowpoint((xyp, yxp))
self._writedata(self.colorData)
self._setwindowpoint((xyp, yxn))
self._writedata(self.colorData)
self._setwindowpoint((xyn, yxp))
self._writedata(self.colorData)
self._setwindowpoint((xyn, yxn))
self._writedata(self.colorData)
# @micropython.native
def fillcircle( self, aPos, aRadius, aColor ) :
'''Draw a filled circle with given radius and color with aPos as center'''
rsq = aRadius * aRadius
for x in range(aRadius) :
y = int(sqrt(rsq - x * x))
y0 = aPos[1] - y
ey = y0 + y * 2
y0 = clamp(y0, 0, self._size[1])
ln = abs(ey - y0) + 1;
self.vline((aPos[0] + x, y0), ln, aColor)
self.vline((aPos[0] - x, y0), ln, aColor)
def fill( self, aColor = BLACK ) :
'''Fill screen with the given color.'''
self.fillrect((0, 0), self._size, aColor)
# @micropython.native
def _draw( self, aPixels, aColor ) :
'''Send given color to the device aPixels times.'''
self.colorData[0] = aColor >> 8
self.colorData[1] = aColor
self.dc.high()
self.cs.low()
for i in range(aPixels):
self.spi.send(self.colorData)
self.cs.high()
# @micropython.native
def _setwindowpoint( self, aPos ) :
'''Set a single point for drawing a color to.'''
x = int(aPos[0])
y = int(aPos[1])
self._writecommand(TFT.CASET) #Column address set.
self.windowLocData[0] = 0x00
self.windowLocData[1] = x
self.windowLocData[2] = 0x00
self.windowLocData[3] = x
self._writedata(self.windowLocData)
self._writecommand(TFT.RASET) #Row address set.
self.windowLocData[1] = y
self.windowLocData[3] = y
self._writedata(self.windowLocData)
self._writecommand(TFT.RAMWR) #Write to RAM.
# @micropython.native
def _setwindowloc( self, aPos0, aPos1 ) :
'''Set a rectangular area for drawing a color to.'''
self._writecommand(TFT.CASET) #Column address set.
self.windowLocData[0] = 0x00
self.windowLocData[1] = int(aPos0[0])
self.windowLocData[2] = 0x00
self.windowLocData[3] = int(aPos1[0])
self._writedata(self.windowLocData)
self._writecommand(TFT.RASET) #Row address set.
self.windowLocData[1] = int(aPos0[1])
self.windowLocData[3] = int(aPos1[1])
self._writedata(self.windowLocData)
self._writecommand(TFT.RAMWR) #Write to RAM.
@micropython.native
def _writecommand( self, aCommand ) :
'''Write given command to the device.'''
self.dc.low()
self.cs.low()
self.spi.send(aCommand)
self.cs.high()
@micropython.native
def _writedata( self, aData ) :
'''Write given data to the device. This may be
either a single int or a bytearray of values.'''
self.dc.high()
self.cs.low()
self.spi.send(aData)
self.cs.high()
@micropython.native
def _pushcolor( self, aColor ) :
'''Push given color to the device.'''
self.colorData[0] = aColor >> 8
self.colorData[1] = aColor
self._writedata(self.colorData)
@micropython.native
def _setMADCTL( self ) :
'''Set screen rotation and RGB/BGR format.'''
self._writecommand(TFT.MADCTL)
rgb = TFTRGB if self._rgb else TFTBGR
self._writedata(TFTRotations[self.rotate] | rgb)
@micropython.native
def _reset( self ) :
'''Reset the device.'''
self.dc.low()
self.reset.high()
pyb.delay(500)
self.reset.low()
pyb.delay(500)
self.reset.high()
pyb.delay(500)
def initb( self ) :
'''Initialize blue tab version.'''
self._size = (ScreenSize[0] + 2, ScreenSize[1] + 1)
self._reset()
self._writecommand(TFT.SWRESET) #Software reset.
pyb.delay(50)
self._writecommand(TFT.SLPOUT) #out of sleep mode.
pyb.delay(500)
data1 = bytearray(1)
self._writecommand(TFT.COLMOD) #Set color mode.
data1[0] = 0x05 #16 bit color.
self._writedata(data1)
pyb.delay(10)
data3 = bytearray([0x00, 0x06, 0x03]) #fastest refresh, 6 lines front, 3 lines back.
self._writecommand(TFT.FRMCTR1) #Frame rate control.
self._writedata(data3)
pyb.delay(10)
self._writecommand(TFT.MADCTL)
data1[0] = 0x08 #row address/col address, bottom to top refresh
self._writedata(data1)
data2 = bytearray(2)
self._writecommand(TFT.DISSET5) #Display settings
data2[0] = 0x15 #1 clock cycle nonoverlap, 2 cycle gate rise, 3 cycle oscil, equalize
data2[1] = 0x02 #fix on VTL
self._writedata(data2)
self._writecommand(TFT.INVCTR) #Display inversion control
data1[0] = 0x00 #Line inversion.
self._writedata(data1)
self._writecommand(TFT.PWCTR1) #Power control
data2[0] = 0x02 #GVDD = 4.7V
data2[1] = 0x70 #1.0uA
self._writedata(data2)
pyb.delay(10)
self._writecommand(TFT.PWCTR2) #Power control
data1[0] = 0x05 #VGH = 14.7V, VGL = -7.35V
self._writedata(data1)
self._writecommand(TFT.PWCTR3) #Power control
data2[0] = 0x01 #Opamp current small
data2[1] = 0x02 #Boost frequency
self._writedata(data2)
self._writecommand(TFT.VMCTR1) #Power control
data2[0] = 0x3C #VCOMH = 4V
data2[1] = 0x38 #VCOML = -1.1V
self._writedata(data2)
pyb.delay(10)
self._writecommand(TFT.PWCTR6) #Power control
data2[0] = 0x11
data2[1] = 0x15
self._writedata(data2)
#These different values don't seem to make a difference.
# dataGMCTRP = bytearray([0x0f, 0x1a, 0x0f, 0x18, 0x2f, 0x28, 0x20, 0x22, 0x1f,
# 0x1b, 0x23, 0x37, 0x00, 0x07, 0x02, 0x10])
dataGMCTRP = bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29,
0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10])
self._writecommand(TFT.GMCTRP1)
self._writedata(dataGMCTRP)
# dataGMCTRN = bytearray([0x0f, 0x1b, 0x0f, 0x17, 0x33, 0x2c, 0x29, 0x2e, 0x30,
# 0x30, 0x39, 0x3f, 0x00, 0x07, 0x03, 0x10])
dataGMCTRN = bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e,
0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10])
self._writecommand(TFT.GMCTRN1)
self._writedata(dataGMCTRN)
pyb.delay(10)
self._writecommand(TFT.CASET) #Column address set.
self.windowLocData[0] = 0x00
self.windowLocData[1] = 2 #Start at column 2
self.windowLocData[2] = 0x00
self.windowLocData[3] = self._size[0] - 1
self._writedata(self.windowLocData)
self._writecommand(TFT.RASET) #Row address set.
self.windowLocData[1] = 1 #Start at row 2.
self.windowLocData[3] = self._size[1] - 1
self._writedata(self.windowLocData)
self._writecommand(TFT.NORON) #Normal display on.
pyb.delay(10)
self._writecommand(TFT.RAMWR)
pyb.delay(500)
self._writecommand(TFT.DISPON)
self.cs.high()
pyb.delay(500)
def initr( self ) :
'''Initialize a red tab version.'''
self._reset()
self._writecommand(TFT.SWRESET) #Software reset.
pyb.delay(150)
self._writecommand(TFT.SLPOUT) #out of sleep mode.
pyb.delay(500)
data3 = bytearray([0x01, 0x2C, 0x2D]) #fastest refresh, 6 lines front, 3 lines back.
self._writecommand(TFT.FRMCTR1) #Frame rate control.
self._writedata(data3)
self._writecommand(TFT.FRMCTR2) #Frame rate control.
self._writedata(data3)
data6 = bytearray([0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d])
self._writecommand(TFT.FRMCTR3) #Frame rate control.
self._writedata(data6)
pyb.delay(10)
data1 = bytearray(1)
self._writecommand(TFT.INVCTR) #Display inversion control
data1[0] = 0x07 #Line inversion.
self._writedata(data1)
self._writecommand(TFT.PWCTR1) #Power control
data3[0] = 0xA2
data3[1] = 0x02
data3[2] = 0x84
self._writedata(data3)
self._writecommand(TFT.PWCTR2) #Power control
data1[0] = 0xC5 #VGH = 14.7V, VGL = -7.35V
self._writedata(data1)
data2 = bytearray(2)
self._writecommand(TFT.PWCTR3) #Power control
data2[0] = 0x0A #Opamp current small
data2[1] = 0x00 #Boost frequency
self._writedata(data2)
self._writecommand(TFT.PWCTR4) #Power control
data2[0] = 0x8A #Opamp current small
data2[1] = 0x2A #Boost frequency
self._writedata(data2)
self._writecommand(TFT.PWCTR5) #Power control
data2[0] = 0x8A #Opamp current small
data2[1] = 0xEE #Boost frequency
self._writedata(data2)
self._writecommand(TFT.VMCTR1) #Power control
data1[0] = 0x0E
self._writedata(data1)
self._writecommand(TFT.INVOFF)
self._writecommand(TFT.MADCTL) #Power control
data1[0] = 0xC8
self._writedata(data1)
self._writecommand(TFT.COLMOD)
data1[0] = 0x05
self._writedata(data1)
self._writecommand(TFT.CASET) #Column address set.
self.windowLocData[0] = 0x00
self.windowLocData[1] = 0x00
self.windowLocData[2] = 0x00
self.windowLocData[3] = self._size[0] - 1
self._writedata(self.windowLocData)
self._writecommand(TFT.RASET) #Row address set.
self.windowLocData[3] = self._size[1] - 1
self._writedata(self.windowLocData)
dataGMCTRP = bytearray([0x0f, 0x1a, 0x0f, 0x18, 0x2f, 0x28, 0x20, 0x22, 0x1f,
0x1b, 0x23, 0x37, 0x00, 0x07, 0x02, 0x10])
self._writecommand(TFT.GMCTRP1)
self._writedata(dataGMCTRP)
dataGMCTRN = bytearray([0x0f, 0x1b, 0x0f, 0x17, 0x33, 0x2c, 0x29, 0x2e, 0x30,
0x30, 0x39, 0x3f, 0x00, 0x07, 0x03, 0x10])
self._writecommand(TFT.GMCTRN1)
self._writedata(dataGMCTRN)
pyb.delay(10)
self._writecommand(TFT.DISPON)
pyb.delay(100)
self._writecommand(TFT.NORON) #Normal display on.
pyb.delay(10)
self.cs.high()
@micropython.native
def initg( self ) :
'''Initialize a green tab version.'''
self._reset()
self._writecommand(TFT.SWRESET) #Software reset.
pyb.delay(150)
self._writecommand(TFT.SLPOUT) #out of sleep mode.
pyb.delay(255)
data3 = bytearray([0x01, 0x2C, 0x2D]) #fastest refresh, 6 lines front, 3 lines back.
self._writecommand(TFT.FRMCTR1) #Frame rate control.
self._writedata(data3)
self._writecommand(TFT.FRMCTR2) #Frame rate control.
self._writedata(data3)
data6 = bytearray([0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d])
self._writecommand(TFT.FRMCTR3) #Frame rate control.
self._writedata(data6)
pyb.delay(10)
self._writecommand(TFT.INVCTR) #Display inversion control
self._writedata(0x07)
self._writecommand(TFT.PWCTR1) #Power control
data3[0] = 0xA2
data3[1] = 0x02
data3[2] = 0x84
self._writedata(data3)
self._writecommand(TFT.PWCTR2) #Power control
self._writedata(0xC5)
data2 = bytearray(2)
self._writecommand(TFT.PWCTR3) #Power control
data2[0] = 0x0A #Opamp current small
data2[1] = 0x00 #Boost frequency
self._writedata(data2)
self._writecommand(TFT.PWCTR4) #Power control
data2[0] = 0x8A #Opamp current small
data2[1] = 0x2A #Boost frequency
self._writedata(data2)
self._writecommand(TFT.PWCTR5) #Power control
data2[0] = 0x8A #Opamp current small
data2[1] = 0xEE #Boost frequency
self._writedata(data2)
self._writecommand(TFT.VMCTR1) #Power control
self._writedata(0x0E)
self._writecommand(TFT.INVOFF)
self._setMADCTL()
self._writecommand(TFT.COLMOD)
self._writedata(0x05)
self._writecommand(TFT.CASET) #Column address set.
self.windowLocData[0] = 0x00
self.windowLocData[1] = 0x01 #Start at row/column 1.
self.windowLocData[2] = 0x00
self.windowLocData[3] = self._size[0] - 1
self._writedata(self.windowLocData)
self._writecommand(TFT.RASET) #Row address set.
self.windowLocData[3] = self._size[1] - 1
self._writedata(self.windowLocData)
dataGMCTRP = bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29,
0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10])
self._writecommand(TFT.GMCTRP1)
self._writedata(dataGMCTRP)
dataGMCTRN = bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e,
0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10])
self._writecommand(TFT.GMCTRN1)
self._writedata(dataGMCTRN)
self._writecommand(TFT.NORON) #Normal display on.
pyb.delay(10)
self._writecommand(TFT.DISPON)
pyb.delay(100)
self.cs.high()
def maker( ) :
t = TFT(1, "X1", "X2")
print("Initializing")
t.initr()
t.fill(0)
return t
def makeb( ) :
t = TFT(1, "X1", "X2")
print("Initializing")
t.initb()
t.fill(0)
return t
def makeg( ) :
t = TFT(1, "X1", "X2")
print("Initializing")
t.initg()
t.fill(0)
return t

Wyświetl plik

@ -1,99 +0,0 @@
seriffont = {"Width": 6, "Height": 8, "Start": 32, "End": 127, "Data": bytearray([
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x03, 0x00, 0x03, 0x00, 0x00, 0x00, #0x00,
0x12, 0x3F, 0x12, 0x3F, 0x12, 0x00, #0x00,
0x26, 0x7F, 0x32, 0x00, 0x00, 0x00, #0x00,
0x13, 0x0B, 0x34, 0x32, 0x00, 0x00, #0x00,
0x1A, 0x25, 0x1A, 0x28, 0x00, 0x00, #0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x7E, 0x81, 0x00, 0x00, 0x00, 0x00, #0x00,
0x81, 0x7E, 0x00, 0x00, 0x00, 0x00, #0x00,
0x06, 0x06, 0x00, 0x00, 0x00, 0x00, #0x00,
0x08, 0x1C, 0x08, 0x00, 0x00, 0x00, #0x00,
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x08, 0x08, 0x00, 0x00, 0x00, 0x00, #0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x38, 0x07, 0x00, 0x00, 0x00, 0x00, #0x00,
0x1E, 0x21, 0x21, 0x1E, 0x00, 0x00, #0x00,
0x02, 0x3F, 0x00, 0x00, 0x00, 0x00, #0x00,
0x32, 0x29, 0x29, 0x36, 0x00, 0x00, #0x00,
0x12, 0x21, 0x25, 0x1A, 0x00, 0x00, #0x00,
0x18, 0x16, 0x3F, 0x10, 0x00, 0x00, #0x00,
0x27, 0x25, 0x19, 0x00, 0x00, 0x00, #0x00,
0x1E, 0x25, 0x25, 0x18, 0x00, 0x00, #0x00,
0x03, 0x39, 0x07, 0x00, 0x00, 0x00, #0x00,
0x1A, 0x25, 0x25, 0x1A, 0x00, 0x00, #0x00,
0x06, 0x29, 0x29, 0x1E, 0x00, 0x00, #0x00,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x64, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x08, 0x14, 0x22, 0x00, 0x00, 0x00, #0x00,
0x14, 0x14, 0x14, 0x00, 0x00, 0x00, #0x00,
0x22, 0x14, 0x08, 0x00, 0x00, 0x00, #0x00,
0x02, 0x29, 0x05, 0x02, 0x00, 0x00, #0x00,
0x1C, 0x22, 0x49, 0x55, 0x59, 0x12, #0x0C,
0x30, 0x2C, 0x0B, 0x0B, 0x2C, 0x30, #0x00,
0x21, 0x3F, 0x25, 0x25, 0x1A, 0x00, #0x00,
0x1E, 0x21, 0x21, 0x21, 0x13, 0x00, #0x00,
0x21, 0x3F, 0x21, 0x21, 0x1E, 0x00, #0x00,
0x21, 0x3F, 0x25, 0x33, 0x00, 0x00, #0x00,
0x21, 0x3F, 0x25, 0x03, 0x00, 0x00, #0x00,
0x1E, 0x21, 0x21, 0x29, 0x3B, 0x00, #0x00,
0x3F, 0x04, 0x04, 0x3F, 0x00, 0x00, #0x00,
0x3F, 0x21, 0x00, 0x00, 0x00, 0x00, #0x00,
0x21, 0x1F, 0x01, 0x00, 0x00, 0x00, #0x00,
0x21, 0x3F, 0x0C, 0x33, 0x21, 0x00, #0x00,
0x3F, 0x21, 0x30, 0x00, 0x00, 0x00, #0x00,
0x21, 0x3F, 0x0C, 0x30, 0x0C, 0x3F, #0x21,
0x3F, 0x03, 0x0C, 0x3F, 0x01, 0x00, #0x00,
0x1E, 0x21, 0x21, 0x21, 0x1E, 0x00, #0x00,
0x3F, 0x29, 0x06, 0x00, 0x00, 0x00, #0x00,
0x1E, 0x21, 0x21, 0x61, 0x1E, 0x00, #0x00,
0x21, 0x3F, 0x09, 0x36, 0x00, 0x00, #0x00,
0x32, 0x25, 0x25, 0x1B, 0x00, 0x00, #0x00,
0x01, 0x3F, 0x01, 0x00, 0x00, 0x00, #0x00,
0x1F, 0x21, 0x20, 0x21, 0x1F, 0x00, #0x00,
0x03, 0x0D, 0x30, 0x30, 0x0D, 0x03, #0x00,
0x0F, 0x31, 0x0C, 0x0C, 0x31, 0x0F, #0x00,
0x21, 0x33, 0x0C, 0x0C, 0x33, 0x21, #0x00,
0x03, 0x24, 0x38, 0x24, 0x03, 0x01, #0x00,
0x29, 0x25, 0x33, 0x00, 0x00, 0x00, #0x00,
0x7F, 0x41, 0x00, 0x00, 0x00, 0x00, #0x00,
0x07, 0x38, 0x00, 0x00, 0x00, 0x00, #0x00,
0x41, 0x7F, 0x00, 0x00, 0x00, 0x00, #0x00,
0x02, 0x01, 0x02, 0x00, 0x00, 0x00, #0x00,
0x40, 0x40, 0x40, 0x40, 0x00, 0x00, #0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, #0x00,
0x14, 0x24, 0x38, 0x00, 0x00, 0x00, #0x00,
0x3F, 0x28, 0x24, 0x18, 0x00, 0x00, #0x00,
0x18, 0x24, 0x24, 0x00, 0x00, 0x00, #0x00,
0x18, 0x24, 0x25, 0x3F, 0x00, 0x00, #0x00,
0x18, 0x24, 0x28, 0x00, 0x00, 0x00, #0x00,
0x3E, 0x25, 0x00, 0x00, 0x00, 0x00, #0x00,
0x18, 0xA4, 0xA4, 0x7C, 0x00, 0x00, #0x00,
0x3F, 0x04, 0x38, 0x00, 0x00, 0x00, #0x00,
0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x3F, 0x18, 0x24, 0x00, 0x00, 0x00, #0x00,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x3C, 0x04, 0x38, 0x04, 0x38, 0x00, #0x00,
0x3C, 0x04, 0x38, 0x00, 0x00, 0x00, #0x00,
0x18, 0x24, 0x24, 0x18, 0x00, 0x00, #0x00,
0xFC, 0xA4, 0x24, 0x18, 0x00, 0x00, #0x00,
0x18, 0x24, 0xA4, 0xFC, 0x00, 0x00, #0x00,
0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, #0x00,
0x28, 0x24, 0x14, 0x00, 0x00, 0x00, #0x00,
0x1E, 0x24, 0x00, 0x00, 0x00, 0x00, #0x00,
0x1C, 0x20, 0x3C, 0x00, 0x00, 0x00, #0x00,
0x0C, 0x30, 0x0C, 0x00, 0x00, 0x00, #0x00,
0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x00, #0x00,
0x24, 0x18, 0x24, 0x00, 0x00, 0x00, #0x00,
0x9C, 0x60, 0x1C, 0x00, 0x00, 0x00, #0x00,
0x34, 0x24, 0x2C, 0x00, 0x00, 0x00, #0x00,
0x08, 0x77, 0x00, 0x00, 0x00, 0x00, #0x00,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00,
0x77, 0x08, 0x00, 0x00, 0x00, 0x00, #0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, #0x00,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, #0x00
])}

Wyświetl plik

@ -1,170 +0,0 @@
from machine import Pin
from time import sleep_us, time, localtime
import pyb
class sevenseg(object):
"""docstring for 7seg"""
_CMD1 = const(0x40)
_CMD2 = const(0xC0)
_CMD3 = const(0x80)
# A
# ---
# F | | B
# -G-
# E | | C
# ---
# D
# XGFEDCBA
_numbertable = [
0b00111111, #0
0b00000110, #1
0b01011011, #2
0b01001111, #3
0b01100110, #4
0b01101101, #5
0b01111101, #6
0b00000111, #7
0b01111111, #8
0b01101111, #9
0b01110111, #A
0b01111100, #B
0b00111001, #C
0b01011110, #D
0b01111001, #E
0b01110001, #F
0b00000000, #space
0b01000000 #dash
]
def __init__(self, clk, dio ):
self._clk = pyb.Pin(clk, pyb.Pin.IN)
self._dio = pyb.Pin(dio, pyb.Pin.IN)
self._brightness = 0
self._colon = False
self._buffer = bytearray(4)
self._clk.init(Pin.IN)
self._dio.init(Pin.IN)
self._clk(0)
self._dio(0)
self.brightness = 7
@property
def colon( self ) : return self._colon
@colon.setter
def colon( self, aValue ) :
self._colon = aValue
@property
def brightness( self ) : return self._brightness
@brightness.setter
def brightness( self, aValue ) :
self._brightness = aValue & 0xF
self._write_comm1()
self._write_comm3()
def _start(self):
self._dio.init(Pin.OUT)
sleep_us(50)
def _stop(self):
self._dio.init(Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
self._dio.init(Pin.IN)
sleep_us(50)
def _write_comm1(self):
self._start()
self._write_byte(_CMD1)
self._stop()
def _write_comm3(self):
self._start()
self._write_byte(_CMD3 + self._brightness + 7)
self._stop()
def _write_byte(self, b):
# send each bit
for i in range(8):
self._clk.init(Pin.OUT)
sleep_us(50)
self._dio.init(Pin.IN if b & 1 else Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
b >>= 1
self._clk.init(Pin.OUT)
sleep_us(50)
self._clk.init(Pin.IN)
sleep_us(50)
self._clk.init(Pin.OUT)
sleep_us(50)
def clear( self ) :
for v in self._buffer:
v = 0
def display( self ) :
if self.colon :
self._buffer[1] |= 0x80
else:
self._buffer[1] &= ~0x80
self._write_comm1()
self._start()
self._write_byte(_CMD2)
for b in self._buffer:
self._write_byte(b)
self._stop()
self._write_comm3()
def data( self, aIndex, aValue ) :
self._buffer[aIndex] = aValue
def digit( self, aIndex, aValue ) :
if 0 <= aValue < len(self._numbertable) :
self.data(aIndex, self._numbertable[aValue])
def char(self, aIndex, char):
"""Display a character 0-9, a-f, space or dash."""
o = ord(char)
c = -1
# space
if o == 32:
c = 16
# dash
if o == 45:
c = 17
# uppercase A-F
if 65 <= o <= 70:
c = o - 55
# lowercase a-f
if 97 <= o <= 102:
c = o - 87
# 0-9
if 48 <= o <= 57:
c = o - 48
self.digit(aIndex, c)
def clock(tm) :
rtc = pyb.RTC()
while True:
t = rtc.datetime()
tm.colon = t[6] & 1
tm.digit(0, t[4] // 10)
tm.digit(1, t[4] % 10)
tm.digit(2, t[5] // 10)
tm.digit(3, t[5] % 10)
tm.display()
# sleep(1 - time() % 1)

Wyświetl plik

@ -1,265 +0,0 @@
#Font used for ST7735 display.
#Each character uses 5 bytes.
#index using ASCII value * 5.
#Each byte contains a column of pixels.
#The character may be 8 pixels high and 5 wide.
sysfont = {"Width": 5, "Height": 8, "Start": 0, "End": 254, "Data": bytearray([
0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
0x18, 0x3C, 0x7E, 0x3C, 0x18,
0x1C, 0x57, 0x7D, 0x57, 0x1C,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
0x00, 0x18, 0x3C, 0x18, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
0x00, 0x18, 0x24, 0x18, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
0x30, 0x48, 0x3A, 0x06, 0x0E,
0x26, 0x29, 0x79, 0x29, 0x26,
0x40, 0x7F, 0x05, 0x05, 0x07,
0x40, 0x7F, 0x05, 0x25, 0x3F,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
0x7F, 0x3E, 0x1C, 0x1C, 0x08,
0x08, 0x1C, 0x1C, 0x3E, 0x7F,
0x14, 0x22, 0x7F, 0x22, 0x14,
0x5F, 0x5F, 0x00, 0x5F, 0x5F,
0x06, 0x09, 0x7F, 0x01, 0x7F,
0x00, 0x66, 0x89, 0x95, 0x6A,
0x60, 0x60, 0x60, 0x60, 0x60,
0x94, 0xA2, 0xFF, 0xA2, 0x94,
0x08, 0x04, 0x7E, 0x04, 0x08,
0x10, 0x20, 0x7E, 0x20, 0x10,
0x08, 0x08, 0x2A, 0x1C, 0x08,
0x08, 0x1C, 0x2A, 0x08, 0x08,
0x1E, 0x10, 0x10, 0x10, 0x10,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
0x30, 0x38, 0x3E, 0x38, 0x30,
0x06, 0x0E, 0x3E, 0x0E, 0x06,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14,
0x24, 0x2A, 0x7F, 0x2A, 0x12,
0x23, 0x13, 0x08, 0x64, 0x62,
0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x08, 0x07, 0x03, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x80, 0x70, 0x30, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02,
0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x42, 0x7F, 0x40, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46,
0x21, 0x41, 0x49, 0x4D, 0x33,
0x18, 0x14, 0x12, 0x7F, 0x10,
0x27, 0x45, 0x45, 0x45, 0x39,
0x3C, 0x4A, 0x49, 0x49, 0x31,
0x41, 0x21, 0x11, 0x09, 0x07,
0x36, 0x49, 0x49, 0x49, 0x36,
0x46, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x14, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41,
0x14, 0x14, 0x14, 0x14, 0x14,
0x00, 0x41, 0x22, 0x14, 0x08,
0x02, 0x01, 0x59, 0x09, 0x06,
0x3E, 0x41, 0x5D, 0x59, 0x4E,
0x7C, 0x12, 0x11, 0x12, 0x7C,
0x7F, 0x49, 0x49, 0x49, 0x36,
0x3E, 0x41, 0x41, 0x41, 0x22,
0x7F, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x49, 0x49, 0x49, 0x41,
0x7F, 0x09, 0x09, 0x09, 0x01,
0x3E, 0x41, 0x41, 0x51, 0x73,
0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x41, 0x7F, 0x41, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01,
0x7F, 0x08, 0x14, 0x22, 0x41,
0x7F, 0x40, 0x40, 0x40, 0x40,
0x7F, 0x02, 0x1C, 0x02, 0x7F,
0x7F, 0x04, 0x08, 0x10, 0x7F,
0x3E, 0x41, 0x41, 0x41, 0x3E,
0x7F, 0x09, 0x09, 0x09, 0x06,
0x3E, 0x41, 0x51, 0x21, 0x5E,
0x7F, 0x09, 0x19, 0x29, 0x46,
0x26, 0x49, 0x49, 0x49, 0x32,
0x03, 0x01, 0x7F, 0x01, 0x03,
0x3F, 0x40, 0x40, 0x40, 0x3F,
0x1F, 0x20, 0x40, 0x20, 0x1F,
0x3F, 0x40, 0x38, 0x40, 0x3F,
0x63, 0x14, 0x08, 0x14, 0x63,
0x03, 0x04, 0x78, 0x04, 0x03,
0x61, 0x59, 0x49, 0x4D, 0x43,
0x00, 0x7F, 0x41, 0x41, 0x41,
0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x41, 0x41, 0x41, 0x7F,
0x04, 0x02, 0x01, 0x02, 0x04,
0x40, 0x40, 0x40, 0x40, 0x40,
0x00, 0x03, 0x07, 0x08, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40,
0x7F, 0x28, 0x44, 0x44, 0x38,
0x38, 0x44, 0x44, 0x44, 0x28,
0x38, 0x44, 0x44, 0x28, 0x7F,
0x38, 0x54, 0x54, 0x54, 0x18,
0x00, 0x08, 0x7E, 0x09, 0x02,
0x18, 0xA4, 0xA4, 0x9C, 0x78,
0x7F, 0x08, 0x04, 0x04, 0x78,
0x00, 0x44, 0x7D, 0x40, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78,
0x7C, 0x08, 0x04, 0x04, 0x78,
0x38, 0x44, 0x44, 0x44, 0x38,
0xFC, 0x18, 0x24, 0x24, 0x18,
0x18, 0x24, 0x24, 0x18, 0xFC,
0x7C, 0x08, 0x04, 0x04, 0x08,
0x48, 0x54, 0x54, 0x54, 0x24,
0x04, 0x04, 0x3F, 0x44, 0x24,
0x3C, 0x40, 0x40, 0x20, 0x7C,
0x1C, 0x20, 0x40, 0x20, 0x1C,
0x3C, 0x40, 0x30, 0x40, 0x3C,
0x44, 0x28, 0x10, 0x28, 0x44,
0x4C, 0x90, 0x90, 0x90, 0x7C,
0x44, 0x64, 0x54, 0x4C, 0x44,
0x00, 0x08, 0x36, 0x41, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02,
0x3C, 0x26, 0x23, 0x26, 0x3C,
0x1E, 0xA1, 0xA1, 0x61, 0x12,
0x3A, 0x40, 0x40, 0x20, 0x7A,
0x38, 0x54, 0x54, 0x55, 0x59,
0x21, 0x55, 0x55, 0x79, 0x41,
0x21, 0x54, 0x54, 0x78, 0x41,
0x21, 0x55, 0x54, 0x78, 0x40,
0x20, 0x54, 0x55, 0x79, 0x40,
0x0C, 0x1E, 0x52, 0x72, 0x12,
0x39, 0x55, 0x55, 0x55, 0x59,
0x39, 0x54, 0x54, 0x54, 0x59,
0x39, 0x55, 0x54, 0x54, 0x58,
0x00, 0x00, 0x45, 0x7C, 0x41,
0x00, 0x02, 0x45, 0x7D, 0x42,
0x00, 0x01, 0x45, 0x7C, 0x40,
0xF0, 0x29, 0x24, 0x29, 0xF0,
0xF0, 0x28, 0x25, 0x28, 0xF0,
0x7C, 0x54, 0x55, 0x45, 0x00,
0x20, 0x54, 0x54, 0x7C, 0x54,
0x7C, 0x0A, 0x09, 0x7F, 0x49,
0x32, 0x49, 0x49, 0x49, 0x32,
0x32, 0x48, 0x48, 0x48, 0x32,
0x32, 0x4A, 0x48, 0x48, 0x30,
0x3A, 0x41, 0x41, 0x21, 0x7A,
0x3A, 0x42, 0x40, 0x20, 0x78,
0x00, 0x9D, 0xA0, 0xA0, 0x7D,
0x39, 0x44, 0x44, 0x44, 0x39,
0x3D, 0x40, 0x40, 0x40, 0x3D,
0x3C, 0x24, 0xFF, 0x24, 0x24,
0x48, 0x7E, 0x49, 0x43, 0x66,
0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
0xFF, 0x09, 0x29, 0xF6, 0x20,
0xC0, 0x88, 0x7E, 0x09, 0x03,
0x20, 0x54, 0x54, 0x79, 0x41,
0x00, 0x00, 0x44, 0x7D, 0x41,
0x30, 0x48, 0x48, 0x4A, 0x32,
0x38, 0x40, 0x40, 0x22, 0x7A,
0x00, 0x7A, 0x0A, 0x0A, 0x72,
0x7D, 0x0D, 0x19, 0x31, 0x7D,
0x26, 0x29, 0x29, 0x2F, 0x28,
0x26, 0x29, 0x29, 0x29, 0x26,
0x30, 0x48, 0x4D, 0x40, 0x20,
0x38, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x08, 0x38,
0x2F, 0x10, 0xC8, 0xAC, 0xBA,
0x2F, 0x10, 0x28, 0x34, 0xFA,
0x00, 0x00, 0x7B, 0x00, 0x00,
0x08, 0x14, 0x2A, 0x14, 0x22,
0x22, 0x14, 0x2A, 0x14, 0x08,
0xAA, 0x00, 0x55, 0x00, 0xAA,
0xAA, 0x55, 0xAA, 0x55, 0xAA,
0x00, 0x00, 0x00, 0xFF, 0x00,
0x10, 0x10, 0x10, 0xFF, 0x00,
0x14, 0x14, 0x14, 0xFF, 0x00,
0x10, 0x10, 0xFF, 0x00, 0xFF,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x14, 0x14, 0x14, 0xFC, 0x00,
0x14, 0x14, 0xF7, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x14, 0x14, 0xF4, 0x04, 0xFC,
0x14, 0x14, 0x17, 0x10, 0x1F,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0x1F, 0x00,
0x10, 0x10, 0x10, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x1F, 0x10,
0x10, 0x10, 0x10, 0x1F, 0x10,
0x10, 0x10, 0x10, 0xF0, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xFF, 0x10,
0x00, 0x00, 0x00, 0xFF, 0x14,
0x00, 0x00, 0xFF, 0x00, 0xFF,
0x00, 0x00, 0x1F, 0x10, 0x17,
0x00, 0x00, 0xFC, 0x04, 0xF4,
0x14, 0x14, 0x17, 0x10, 0x17,
0x14, 0x14, 0xF4, 0x04, 0xF4,
0x00, 0x00, 0xFF, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x14, 0x14,
0x14, 0x14, 0xF7, 0x00, 0xF7,
0x14, 0x14, 0x14, 0x17, 0x14,
0x10, 0x10, 0x1F, 0x10, 0x1F,
0x14, 0x14, 0x14, 0xF4, 0x14,
0x10, 0x10, 0xF0, 0x10, 0xF0,
0x00, 0x00, 0x1F, 0x10, 0x1F,
0x00, 0x00, 0x00, 0x1F, 0x14,
0x00, 0x00, 0x00, 0xFC, 0x14,
0x00, 0x00, 0xF0, 0x10, 0xF0,
0x10, 0x10, 0xFF, 0x10, 0xFF,
0x14, 0x14, 0x14, 0xFF, 0x14,
0x10, 0x10, 0x10, 0x1F, 0x00,
0x00, 0x00, 0x00, 0xF0, 0x10,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0xFF,
0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x38, 0x44, 0x44, 0x38, 0x44,
0x7C, 0x2A, 0x2A, 0x3E, 0x14,
0x7E, 0x02, 0x02, 0x06, 0x06,
0x02, 0x7E, 0x02, 0x7E, 0x02,
0x63, 0x55, 0x49, 0x41, 0x63,
0x38, 0x44, 0x44, 0x3C, 0x04,
0x40, 0x7E, 0x20, 0x1E, 0x20,
0x06, 0x02, 0x7E, 0x02, 0x02,
0x99, 0xA5, 0xE7, 0xA5, 0x99,
0x1C, 0x2A, 0x49, 0x2A, 0x1C,
0x4C, 0x72, 0x01, 0x72, 0x4C,
0x30, 0x4A, 0x4D, 0x4D, 0x30,
0x30, 0x48, 0x78, 0x48, 0x30,
0xBC, 0x62, 0x5A, 0x46, 0x3D,
0x3E, 0x49, 0x49, 0x49, 0x00,
0x7E, 0x01, 0x01, 0x01, 0x7E,
0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
0x44, 0x44, 0x5F, 0x44, 0x44,
0x40, 0x51, 0x4A, 0x44, 0x40,
0x40, 0x44, 0x4A, 0x51, 0x40,
0x00, 0x00, 0xFF, 0x01, 0x03,
0xE0, 0x80, 0xFF, 0x00, 0x00,
0x08, 0x08, 0x6B, 0x6B, 0x08,
0x36, 0x12, 0x36, 0x24, 0x36,
0x06, 0x0F, 0x09, 0x0F, 0x06,
0x00, 0x00, 0x18, 0x18, 0x00,
0x00, 0x00, 0x10, 0x10, 0x00,
0x30, 0x40, 0xFF, 0x01, 0x01,
0x00, 0x1F, 0x01, 0x01, 0x1E,
0x00, 0x19, 0x1D, 0x17, 0x12,
0x00, 0x3C, 0x3C, 0x3C, 0x3C
])}

Wyświetl plik

@ -1,100 +0,0 @@
terminalfont = {"Width": 6, "Height": 8, "Start": 32, "End": 127, "Data": bytearray([
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x5F, 0x06, 0x00,
0x00, 0x07, 0x03, 0x00, 0x07, 0x03,
0x00, 0x24, 0x7E, 0x24, 0x7E, 0x24,
0x00, 0x24, 0x2B, 0x6A, 0x12, 0x00,
0x00, 0x63, 0x13, 0x08, 0x64, 0x63,
0x00, 0x36, 0x49, 0x56, 0x20, 0x50,
0x00, 0x00, 0x07, 0x03, 0x00, 0x00,
0x00, 0x00, 0x3E, 0x41, 0x00, 0x00,
0x00, 0x00, 0x41, 0x3E, 0x00, 0x00,
0x00, 0x08, 0x3E, 0x1C, 0x3E, 0x08,
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,
0x00, 0x00, 0xE0, 0x60, 0x00, 0x00,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,
0x00, 0x62, 0x51, 0x49, 0x49, 0x46,
0x00, 0x22, 0x49, 0x49, 0x49, 0x36,
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,
0x00, 0x2F, 0x49, 0x49, 0x49, 0x31,
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,
0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0x00, 0xEC, 0x6C, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
0x00, 0x24, 0x24, 0x24, 0x24, 0x24,
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,
0x00, 0x02, 0x01, 0x59, 0x09, 0x06,
0x00, 0x3E, 0x41, 0x5D, 0x55, 0x1E,
0x00, 0x7E, 0x11, 0x11, 0x11, 0x7E,
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,
0x00, 0x7F, 0x41, 0x41, 0x41, 0x3E,
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,
0x00, 0x30, 0x40, 0x40, 0x40, 0x3F,
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,
0x00, 0x7F, 0x02, 0x04, 0x02, 0x7F,
0x00, 0x7F, 0x02, 0x04, 0x08, 0x7F,
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,
0x00, 0x7F, 0x09, 0x09, 0x19, 0x66,
0x00, 0x26, 0x49, 0x49, 0x49, 0x32,
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,
0x00, 0x3F, 0x40, 0x3C, 0x40, 0x3F,
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,
0x00, 0x71, 0x49, 0x45, 0x43, 0x00,
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,
0x00, 0x02, 0x04, 0x08, 0x10, 0x20,
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x00, 0x00, 0x03, 0x07, 0x00, 0x00,
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,
0x00, 0x7F, 0x44, 0x44, 0x44, 0x38,
0x00, 0x38, 0x44, 0x44, 0x44, 0x28,
0x00, 0x38, 0x44, 0x44, 0x44, 0x7F,
0x00, 0x38, 0x54, 0x54, 0x54, 0x08,
0x00, 0x08, 0x7E, 0x09, 0x09, 0x00,
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0x00, 0x7F, 0x04, 0x04, 0x78, 0x00,
0x00, 0x00, 0x00, 0x7D, 0x40, 0x00,
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,
0x00, 0x00, 0x00, 0x7F, 0x40, 0x00,
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,
0x00, 0x7C, 0x04, 0x04, 0x78, 0x00,
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,
0x00, 0xFC, 0x44, 0x44, 0x44, 0x38,
0x00, 0x38, 0x44, 0x44, 0x44, 0xFC,
0x00, 0x44, 0x78, 0x44, 0x04, 0x08,
0x00, 0x08, 0x54, 0x54, 0x54, 0x20,
0x00, 0x04, 0x3E, 0x44, 0x24, 0x00,
0x00, 0x3C, 0x40, 0x20, 0x7C, 0x00,
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,
0x00, 0x3C, 0x60, 0x30, 0x60, 0x3C,
0x00, 0x6C, 0x10, 0x10, 0x6C, 0x00,
0x00, 0x9C, 0xA0, 0x60, 0x3C, 0x00,
0x00, 0x64, 0x54, 0x54, 0x4C, 0x00,
0x00, 0x08, 0x3E, 0x41, 0x41, 0x00,
0x00, 0x00, 0x00, 0x77, 0x00, 0x00,
0x00, 0x00, 0x41, 0x41, 0x3E, 0x08,
0x00, 0x02, 0x01, 0x02, 0x01, 0x00,
0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C
])}