1. 点屏示例(MIPI)

本章节主要介绍点亮执行K2000的所有初始化(包括背光板,主控板等等的初始化),User_Fun()类解析,加载画面,写初始化代码,上下电控制,按键控制程序,整体点屏示例。

主要内容:

  • 1 执行K2000的所有初始化(包括背光板,主控板等等的初始化)

  • 2 User_Fun()类解析。

  • 3 run函数解析

  • 4 加载画面。

  • 5 写初始化代码。

  • 6 上下电控制.

  • 7 按键控制程序:实现 按键“上翻”、“下翻”切换画面,ON/OFF 开关显示

  • 8 整体点屏示例

注意

while 循环里需要放置10ms的延时,来维持系统的正常运行。

1.1. 执行K2000的所有初始化(包括背光板,主控板等等的初始化)

先创建了一个名为 SHARP_user 的 User_Fun 对象。然后,通过检查 __main__ 模块是否为当前模块,如果当前模块是主程序(即直接运行的脚本文件),则会输出 “Enter Python OK !” 这条调试信息,并调用 run() 函数来执行主要的代码逻辑。

SHARP_user=User_Fun()
if __name__ == '__main__':
    user_mode.DEBUG("Enter Python OK !")
run()

1.2. User_Fun()类解析

这是一个名为User_Fun的类定义,包含了一些属性和方法。以下是该类的一些说明:

Project_Site_Name :字符串类型,表示项目站点名称。

GetLockCodestr :字符串类型,表示获取锁代码的字符串。

My_Board :Set_Board_All()类型的对象,表示主控板对象,包含电源板、背光板和GPU板。

My_MIPI_Board :MIPI类型的对象,表示mipi板对象,但在此处还没有被初始化。

My_Rest_Pin、My_PORTSWAO_Pin、My_EN1PORT_Pin、My_IT_ON_OFF_Pin、My_IT_MTP_Pin、My_QR_Pin :Pin_Device类型的对象,分别表示重置引脚、端口切换引脚、使能1引脚、IT开关引脚、IT MTP引脚和QR引脚。

frame、display_on、auto_switch_mode :整数类型,表示帧数、显示开关和自动切换模式。

class User_Fun():

Project_Site_Name = '2.56_D1_B_V0.7.5'
GetLockCodestr = "0"

My_Board = Set_Board_All()                                    # 主控板对象 里面包含电源板 背光板 GPU板
My_MIPI_Board : MIPI                                          # mipi板对象 此时还没初始化

My_Rest_Pin = Pin_Device(REST,Pin_Device.OUT)
My_PORTSWAO_Pin = Pin_Device(PORTSWAO,Pin_Device.OUT)
My_EN1PORT_Pin = Pin_Device(EN1PORT,Pin_Device.OUT)
My_IT_ON_OFF_Pin = Pin_Device(IT_ON_OFF,Pin_Device.IN)
My_IT_MTP_Pin = Pin_Device(IT_MTP,Pin_Device.IN)

frame = 0
display_on = 0
auto_switch_mode = 0

1.3. run函数解析

该函数中包含了一些硬件初始化、屏幕参数配置、中断处理和异常处理等操作。具体来说,以下是主要的步骤:

  • 初始化

    • 调用 SHARP_user.My_Board.IOVOL_Set(1.8) 来设置 IO 电压为 1.8V。

    • 定义并设置项目名称为 “2.56_D1_B_V0.7.5”。

    ##########################初始化##########################
    SHARP_user.My_Board.IOVOL_Set(1.8)
    Boxui.Project_Name_Page3("2.56_D1_B_V0.7.5")            #第三页显示工程名
    
  • 配置 MiPi 屏幕参数

    • 创建 MiPi_struct 结构体,并为其设置各种参数,如刷新率、时钟频率、传输速率、同步模式、数据位数等。

    ##########################配置MIPI屏幕参数##########################
    MiPi_struct = mipi_panel_par()
    ''' 点屏参数配置 '''
    MiPi_struct.autoPanelFre = 90  # 屏幕刷新率 ,此值设置之后,pclk设置无效
    MiPi_struct.pclk = 0  # PCLK时钟
    MiPi_struct.HS_Mbps = 1100  # MIPI传输速率
    MiPi_struct.Burst = MIPI.NONBURST_SYNC_EVENTS  # 突发还是非突发
    MiPi_struct.CmdOrVideo = MIPI.VIDEO  # Video还是Command模式
    MiPi_struct.TypeLane = MIPI.D_PHY_4LANE  # DPHY或者CPHY类型与Lane数
    
    MiPi_struct.h_active = 720  # 水平的有效像素
    MiPi_struct.h_back_porch = 33  # 水平的后沿
    MiPi_struct.h_front_porch = 54  # 水平的前沿
    MiPi_struct.h_pulse_width = 20  # 水平的脉冲
    
    MiPi_struct.v_active = 2160  # 垂直的有效像素
    MiPi_struct.v_back_porch = 4 # 垂直的后沿 29
    MiPi_struct.v_front_porch = 57  # 垂直的前沿220
    MiPi_struct.v_pulse_width = 4  # 垂直的脉冲 1
    
    MiPi_struct.bit_mode = MIPI.MiPi_24_BIT  # 数据位数
    MiPi_struct.pclk_edge = MIPI.MiPi_FALLING_EDGE  # pclk锁存边缘
    MiPi_struct.h_active_edge = MIPI.MiPi_LOW_ACTIVE  # h脉冲有效电平
    MiPi_struct.v_active_edge = MIPI.MiPi_LOW_ACTIVE  # v脉冲有效电平
    MiPi_struct.de_active_edge = MIPI.MiPi_HIGH_ACTIVE  # de脉冲有效电平
    
  • 初始化 MiPi

    • 创建 SHARP_user.My_MIPI_Board 实例,通过传入 MiPi_struct 参数进行初始化。

    • 调用一些函数获取或设置 MiPi 相关参数,并将结果输出到调试信息中。

    ##########################初始化MIPI##########################
    SHARP_user.My_MIPI_Board = MIPI(MiPi_struct.autoPanelFre, MiPi_struct)
    
    user_mode.DEBUG("Frame Pclk %.3fMhz\n"%MiPi_struct.pclk)
    user_mode.DEBUG("FPS:%.2fhz\n"%SHARP_user.My_MIPI_Board.UserMipi_GetPanelFre(MiPi_struct))
    user_mode.DEBUG("Need PHY HS:%.2fMbps\n"%SHARP_user.My_MIPI_Board.UserMipi_GetPanelHS_Mbps(MiPi_struct))
    user_mode.DEBUG("Set PHY HS:%.2fMbps\n"%MiPi_struct.HS_Mbps)
    
    SHARP_user.auto_switch_mode = 0
    
  • 中断处理和异常处理配置

    • 设置两个引脚的中断处理函数(ON_OFF_IRQHandler 和 MTP_IRQHandler)。

    • 调用 LoadFrame() 函数加载帧,可能是显示屏相关的操作

    ###################中断处理和异常处理配置####################
    SHARP_user.My_IT_ON_OFF_Pin.IO_irq(Pin_Device.EDGE_UP,ON_OFF_IRQHandler)
    SHARP_user.My_IT_MTP_Pin.IO_irq(Pin_Device.EDGE_UP,MTP_IRQHandler)
    LoadFrame()#加载图片
    
  • 运行循环

    • 进入一个无限循环,不断调用 run_while() 函数。

    • 捕获 ITException 和其他异常,并进行相应的处理和输出

    #########################运行循环###########################
    while True:
        try:
            run_while()
        # SHARP_user.My_Board[2].MONITOR_SetBee(1)
        except ITException as e:    #IO口中断异常处理  不可修改
                user_mode.DEBUG("ITException ERR\r")
    
        except Exception as e:      #其他异常处理   不可修改
                user_mode.DEBUG("Exception ERR\r")
                traceback = user_mode.traceback_exception(e)    #获取异常信息
                user_mode.DEBUG(traceback)                      #显示盒打印异常信息
                user_mode.DEBUG("\n")                           #打印换行 不可删除
    
                raise e #上报错误信息
    

更多详情可参考 MIPI点屏模块

1.4. 加载画面

  • 这段代码是一个名为LoadFrame的函数,主要是用于加载画面。本示例程序画面加载的是来自 SD 卡的图片。

  • Img_SDCard_BMP函数第一个参数是加载画面的文件名,第二个参数是画面保持时间,通过调用image.Img_SDCard_BMP函数来实现图像文件的加载。加载完成后,会输出调试信息”Load image OK”表示加载完成。

注意

目前K2000还不支持预加载用户自行编写的画面,相信在不远的将来能实现这个功能。

user_mode.DEBUG("Load image..\r\n")
image.Img_SDCard_BMP('/sdcard/Full Red_compresed.bmp',0)
image.Img_SDCard_BMP('/sdcard/Full Green_compresed.bmp',0)
image.Img_SDCard_BMP('/sdcard/Full Blue_compresed.bmp',0)
image.Img_SDCard_BMP('/sdcard/Flicker_compresed.bmp',0)
user_mode.DEBUG("Load image OK\n")

1.5. 写初始化代码

  • 写初始化代码使用的是方法 SHARP_MIPI_WR(mp_tuple),参数 mp_tuple为元组不定长数据,格式: mipi_data = ((0x29,0x11),(0x29,0x29))。

  • 此段代码将在后续使用display_on函数时用到

mipi_90HZ_data = (

    (0x29,0xB0,0x04),
    (0x29,0xB1,0x00),
    (0x29,0xB2,0x00,0x00,0x00,0x00,0x00,0x01,0x00),
    (0x29,0xB3,0x00),
    (0x29,0xB4,0x00,0x00,0x0A),
    (0x29,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x26,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00),
    (0x29,0xB6,0x30,0x6B,0x00,0x06,0x33,0x8A,0x00,0x1A,0x7A),
    (0x29,0xB7,0x54,0x00,0x00,0x00),
    (0x29,0xB9,0x15,0x8E,0x02,0x64),
)
def MIPI_90_Init():
for i in mipi_90HZ_data:
    SHARP_user.My_MIPI_Board.MIPI_WR(i)
return 1

1.6. 上下电控制

设置液晶模组所需的电源电压、背光电流,上下电顺序等。体现在 Display_ON_Trad() 和 Display_OFF()两个函数。

设置电源电压

设置某VDD通道电压使用的方法为 POWER_SetVDD( ch, v)

ch :通道号, =1 代表VDD1 v :要输出的电压值,单位V,精度 0.1V

更多电源功能函数使用可参考 电源板功能

  • Display_ON_Trad() 代码如下:

def Display_ON_Trad():
user_mode.DEBUG("Display_ON ...\n")

SHARP_user.My_Board.POWER_SetVDD(1, 1.8)
user_mode.Delay_ms(10)

LCD_PORTSWAO_H()
LCD_EN1PORT_H()

SHARP_user.My_Board.POWER_SetVDD(4, 5.8)
user_mode.Delay_ms(5)
SHARP_user.My_Board.POWER_SetVDD(5, -5.8)
user_mode.Delay_ms(40)

LCD_RST_1()
user_mode.Delay_ms(10)
LCD_RST_0()
user_mode.Delay_ms(10)
LCD_RST_1()
user_mode.Delay_ms(70)

SwitchFrame(SHARP_user.frame)

SHARP_user.My_MIPI_Board.UserMipi_ON()
SHARP_user.My_MIPI_Board.SSD28_LP()

Panel_Read()#回读屏幕寄存器

MIPI_90_Init()

########################向MIPI总线写入一系列特定的命令和参数########################
SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x04))

if SHARP_user.All_Test_Mask['OTPEnable']== 0 :#烧录前才会调用默认值
        # MIPI_WR((0x29,0xD5,0x02,0x4A,0x02,0x4A,0x02,0x4A))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xD5,0x02,0x65,0x02,0x65,0x02,0x65))

SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xD6,0x00))
SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x03))
SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x35,0x00))# 开TE信号
SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x36,0x01))
SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x26,0x01))
SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x03,0x01))
user_mode.Delay_ms(20)
SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x04))
SHARP_user.My_MIPI_Board.MIPI_WR((0x05,0x11))
user_mode.Delay_ms(20)
SHARP_user.My_MIPI_Board.MIPI_WR((0x05,0x29))
#################################################################################
user_mode.Delay_ms(30)
SHARP_user.My_MIPI_Board.SSD28_EnterConfigMode()
SHARP_user.frame=0 #设置为第0个画面
SwitchFrame(SHARP_user.frame)#显示画面

for i in range(1,13):
    SHARP_user.My_Board.LED_SetI(i, 47.7)

SHARP_user.My_Board.Set_blHorL(1)
SHARP_user.My_Board.LED_ON(0xff)
SHARP_user.My_Board.LED_ExPWMOn()
user_mode.Delay_ms(300)

SHARP_user.display_on = 1

user_mode.DEBUG("Display_ON END\n")
  • Display_OFF() 代码如下:

def Display_OFF():

    SHARP_user.display_on = 0
    SHARP_user.frame = 0
    SHARP_DEBUG("Display_OFF  ...\n")

    res=SHARP_LED_OFF(SHARP_user.Power_Flag)
    SHARP_DEBUG("LED_OFF res=%d\r\n"%res)

    SHARP_MIPI_WR((0x39, 0XFF, 0X10))
    SHARP_MIPI_WR((0x05, 0x28))
    SHARP_Delay_ms(20)
    SHARP_MIPI_WR((0x05, 0x10))
    SHARP_Delay_ms(120)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 5, 0)
    SHARP_Delay_ms(70)

    LCD_RST_0()
    SHARP_Delay_ms(15)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 4, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 2, 0)
    SHARP_Delay_ms(20)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 1, 0)
    SHARP_Delay_ms(10)

    SHARP_POWER_SetVDD(SHARP_user.Power_Flag, 3, 0)
    SHARP_Delay_ms(10)


    SHARP_UserMipi_OFF()
    SHARP_DEBUG("Display_OFF END\n")

1.7. 按键控制程序

按键需要实时回读,实时处理.因此需要放在while循环里执行。

key_str = Key_Device.read_key_lift(500)
if key_str.find('key_onoff_lift') != -1:
    print('key_onoff_lift')
    if SHARP_user.display_on == 0:
            user_mode.Delay_ms(50)
            # 上电时序
            Display_ON_Trad()
            SHARP_user.display_on = 1
            frame_hold_cnt = user_mode.MeasureTimeStart_ms()
    else :
        print('KEY_OFF')
        # 下电时序
        Display_OFF()

elif key_str.find('key_down_lift') != -1:
    print('key_down_lift')
    if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
        if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
            frame_hold_cnt = user_mode.MeasureTimeStart_ms()
            print('KEY_DOWN')
            SHARP_user.frame += 1
            if  SHARP_user.frame >= image.frame_num :
                SHARP_user.frame = 0

            SwitchFrame(SHARP_user.frame)

elif key_str.find('key_up_lift') != -1:
    print('KEY_UP')
    if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
        if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
            frame_hold_cnt = user_mode.MeasureTimeStart_ms()
            print('KEY_DOWN')
            if SHARP_user.frame == 0 :
                SHARP_user.frame = image.frame_num - 1
            else :
                SHARP_user.frame -= 1
            SwitchFrame(SHARP_user.frame)

elif key_str.find('key_enter_lift') != -1:
    print('KEY_enter')
    PowerMea = SHARP_user.My_Board.POWER_GetPowerMea()
    print(PowerMea[0].VDD_V)
    PowerMea = SHARP_user.My_Board.POWER_GetLEDMea()
    print(PowerMea[0].LED_V)
elif key_str.find('key_add_lift') != -1:
    print('KEY5_add')


elif key_str.find('key_sub_lift') != -1:
    print('KEY6_sub')


elif key_str.find('key_spare_lift') != -1:
    print('key_spare_lift')

if SHARP_user.auto_switch_mode == 1 and SHARP_user.display_on == 1 :
    if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
        frame_hold_cnt = user_mode.MeasureTimeStart_ms()
        if SHARP_user.frame < (image.frame_num - 1) :
            SHARP_user.frame += 1
        else :
            SHARP_user.frame = 0
        SwitchFrame(SHARP_user.frame)

1.8. 整体点屏示例

from sharp_user import Key_Device,Pin_Device,user_mode
from sharp_display_mipi import mipi_panel_par,MIPI
from sharp_boxui import Boxui
from sharp_img import image
from sharp_app_mod import Set_Board_All

REST = Pin_Device.LCD_RST__IO_3
PORTSWAO = Pin_Device.LCD_ID2__IO_2
EN1PORT = Pin_Device.LCD_ID1__IO_1
IT_ON_OFF = Pin_Device.LCD__IO_5
IT_MTP = Pin_Device.LCD__IO_6
QR = Pin_Device.LCD__IO_7|Pin_Device.LCD__IO_8

class User_Fun():

    Project_Site_Name = '2.56_D1_B_V0.7.5'
    GetLockCodestr = "0"

    My_Board = Set_Board_All()                                          # 主控板对象 里面包含电源板 背光板 GPU板
    My_MIPI_Board : MIPI                                          # mipi板对象 此时还没初始化

    My_Rest_Pin = Pin_Device(REST,Pin_Device.OUT)
    My_PORTSWAO_Pin = Pin_Device(PORTSWAO,Pin_Device.OUT)
    My_EN1PORT_Pin = Pin_Device(EN1PORT,Pin_Device.OUT)
    My_IT_ON_OFF_Pin = Pin_Device(IT_ON_OFF,Pin_Device.IN)
    My_IT_MTP_Pin = Pin_Device(IT_MTP,Pin_Device.IN)

    frame = 0
    display_on = 0
    auto_switch_mode = 0

def LCD_RST_1():
    SHARP_user.My_Rest_Pin.IO_BitSet()

def LCD_RST_0():
    SHARP_user.My_Rest_Pin.IO_BitReset()

def LCD_PORTSWAO_H():
    SHARP_user.My_PORTSWAO_Pin.IO_BitSet()

def LCD_PORTSWAO_L():
    SHARP_user.My_PORTSWAO_Pin.IO_BitReset()

def LCD_EN1PORT_H():
    SHARP_user.My_EN1PORT_Pin.IO_BitSet()

def LCD_EN1PORT_L():
    SHARP_user.My_EN1PORT_Pin.IO_BitReset()

def ON_OFF_IRQHandler(index,pin):      #中断回调
    print('ON_OFF index = %x,pin = %x'%(index,pin))
    #===============点亮的情况下才执行中断=======================================================
    if pin == Pin_Device.LCD__IO_5 and SHARP_user.display_on == 1:
        user_mode.Delay_ms(10)
        print('IO_55 ONOFF')
            # SHARP_Reset_Run(1)

def MTP_IRQHandler(index,pin):      #中断回调
    print('MTP index = %x,pin = %x'%(index,pin))
    #===============点亮的情况下才执行中断=======================================================
    if pin ==Pin_Device.LCD__IO_6 and SHARP_user.display_on == 1:
        user_mode.Delay_ms(10)
        print('IO_66 MTP')
            # SHARP_Reset_Run(1)

def LoadFrame():
    user_mode.DEBUG("Load image..\r\n")
    image.Img_SDCard_BMP('/sdcard/Full Red_compresed.bmp',0)
    image.Img_SDCard_BMP('/sdcard/Full Green_compresed.bmp',0)
    image.Img_SDCard_BMP('/sdcard/Full Blue_compresed.bmp',0)
    image.Img_SDCard_BMP('/sdcard/Flicker_compresed.bmp',0)
    user_mode.DEBUG("Load image OK\n")

def SwitchFrame(frame):
    SHARP_user.My_MIPI_Board.SSD28_DisplayFrame(frame)  # 切图

def NetWork_read(data,data_len):
    if data_len > 0:
        # 获取到的字节流 解码 为字符串
        data_decode = data.decode()
        print(data_decode, end='')

def run():
    ##########################初始化##########################
    SHARP_user.My_Board.IOVOL_Set(1.8)
    Boxui.Project_Name_Page3("2.56_D1_B_V0.7.5")            #第三页显示工程名
    ##########################配置MIPI屏幕参数##########################
    MiPi_struct = mipi_panel_par()
    ''' 点屏参数配置 '''
    MiPi_struct.autoPanelFre = 90  # 屏幕刷新率 ,此值设置之后,pclk设置无效
    MiPi_struct.pclk = 0  # PCLK时钟
    MiPi_struct.HS_Mbps = 1100  # MIPI传输速率
    MiPi_struct.Burst = MIPI.NONBURST_SYNC_EVENTS  # 突发还是非突发
    MiPi_struct.CmdOrVideo = MIPI.VIDEO  # Video还是Command模式
    MiPi_struct.TypeLane = MIPI.D_PHY_4LANE  # DPHY或者CPHY类型与Lane数

    MiPi_struct.h_active = 720  # 水平的有效像素
    MiPi_struct.h_back_porch = 33  # 水平的后沿
    MiPi_struct.h_front_porch = 54  # 水平的前沿
    MiPi_struct.h_pulse_width = 20  # 水平的脉冲

    MiPi_struct.v_active = 2160  # 垂直的有效像素
    MiPi_struct.v_back_porch = 4 # 垂直的后沿 29
    MiPi_struct.v_front_porch = 57  # 垂直的前沿220
    MiPi_struct.v_pulse_width = 4  # 垂直的脉冲 1

    MiPi_struct.bit_mode = MIPI.MiPi_24_BIT  # 数据位数
    MiPi_struct.pclk_edge = MIPI.MiPi_FALLING_EDGE  # pclk锁存边缘
    MiPi_struct.h_active_edge = MIPI.MiPi_LOW_ACTIVE  # h脉冲有效电平
    MiPi_struct.v_active_edge = MIPI.MiPi_LOW_ACTIVE  # v脉冲有效电平
    MiPi_struct.de_active_edge = MIPI.MiPi_HIGH_ACTIVE  # de脉冲有效电平
    ##########################初始化MIPI##########################
    SHARP_user.My_MIPI_Board = MIPI(MiPi_struct.autoPanelFre, MiPi_struct)

    user_mode.DEBUG("Frame Pclk %.3fMhz\n"%MiPi_struct.pclk)
    user_mode.DEBUG("FPS:%.2fhz\n"%SHARP_user.My_MIPI_Board.UserMipi_GetPanelFre(MiPi_struct))
    user_mode.DEBUG("Need PHY HS:%.2fMbps\n"%SHARP_user.My_MIPI_Board.UserMipi_GetPanelHS_Mbps(MiPi_struct))
    user_mode.DEBUG("Set PHY HS:%.2fMbps\n"%MiPi_struct.HS_Mbps)

    SHARP_user.auto_switch_mode = 0
    ###################中断处理和异常处理配置####################
    SHARP_user.My_IT_ON_OFF_Pin.IO_irq(Pin_Device.EDGE_UP,ON_OFF_IRQHandler)
    SHARP_user.My_IT_MTP_Pin.IO_irq(Pin_Device.EDGE_UP,MTP_IRQHandler)
    LoadFrame()#加载图片
    #########################运行循环###########################
    while True:
        try:
            run_while()
        # SHARP_user.My_Board[2].MONITOR_SetBee(1)
        except ITException as e:    #IO口中断异常处理  不可修改
                user_mode.DEBUG("ITException ERR\r")

        except Exception as e:      #其他异常处理   不可修改
                user_mode.DEBUG("Exception ERR\r")
                traceback = user_mode.traceback_exception(e)    #获取异常信息
                user_mode.DEBUG(traceback)                      #显示盒打印异常信息
                user_mode.DEBUG("\n")                           #打印换行 不可删除

                raise e #上报错误信息

def run_while():
    SHARP_user.My_Board.MONITOR_SetBee(1)
    user_mode.Delay_ms(100)
    SHARP_user.My_Board.MONITOR_SetBee(0)
    while True:
        key_str = Key_Device.read_key_lift(500)
        if key_str.find('key_onoff_lift') != -1:
            print('key_onoff_lift')
            if SHARP_user.display_on == 0:
                    user_mode.Delay_ms(50)
                    # 上电时序
                    Display_ON_Trad()
                    SHARP_user.display_on = 1
                    frame_hold_cnt = user_mode.MeasureTimeStart_ms()
            else :
                print('KEY_OFF')
                # 下电时序
                Display_OFF()

        elif key_str.find('key_down_lift') != -1:
            print('key_down_lift')
            if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
                if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
                    frame_hold_cnt = user_mode.MeasureTimeStart_ms()
                    print('KEY_DOWN')
                    SHARP_user.frame += 1
                    if  SHARP_user.frame >= image.frame_num :
                        SHARP_user.frame = 0

                    SwitchFrame(SHARP_user.frame)

        elif key_str.find('key_up_lift') != -1:
            print('KEY_UP')
            if SHARP_user.auto_switch_mode == 0 and SHARP_user.display_on == 1 :
                if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
                    frame_hold_cnt = user_mode.MeasureTimeStart_ms()
                    print('KEY_DOWN')
                    if SHARP_user.frame == 0 :
                        SHARP_user.frame = image.frame_num - 1
                    else :
                        SHARP_user.frame -= 1
                    SwitchFrame(SHARP_user.frame)

        elif key_str.find('key_enter_lift') != -1:
            print('KEY_enter')
            PowerMea = SHARP_user.My_Board.POWER_GetPowerMea()
            print(PowerMea[0].VDD_V)
            PowerMea = SHARP_user.My_Board.POWER_GetLEDMea()
            print(PowerMea[0].LED_V)
        elif key_str.find('key_add_lift') != -1:
            print('KEY5_add')


        elif key_str.find('key_sub_lift') != -1:
            print('KEY6_sub')


        elif key_str.find('key_spare_lift') != -1:
            print('key_spare_lift')

        if SHARP_user.auto_switch_mode == 1 and SHARP_user.display_on == 1 :
            if user_mode.GetMeasureTime_ms(frame_hold_cnt) >= image.frame_hold_cnt[SHARP_user.frame] :
                frame_hold_cnt = user_mode.MeasureTimeStart_ms()
                if SHARP_user.frame < (image.frame_num - 1) :
                    SHARP_user.frame += 1
                else :
                    SHARP_user.frame = 0
                SwitchFrame(SHARP_user.frame)

'''
* 函数名: Panel_Read
* 描述  : 读取模组的寄存器
* 参数  : 无
* 返回  : 无
'''
def Panel_Read():
    Read_Code = []
    SHARP_user.My_MIPI_Board.SSD28_LP()

    SHARP_user.My_MIPI_Board.MIPI_WR((0x29, 0xB0, 0x04))

    Read_Code = SHARP_user.My_MIPI_Board.DcsReadDT06(1,0XD5,2)          # 1 mipi端口 A口  0xD5获取寄存器 2-数据个数
    # if len(Read_Code) !=0:
    #     SHARP_user.All_Test_Mask['RVCOM_Val'] = Read_Code[0][0]<<8|Read_Code[0][1]
    # user_mode.DEBUG("VCOM = 0x%04X\r"%(SHARP_user.All_Test_Mask['RVCOM_Val']))

def Display_ON_Trad():
    user_mode.DEBUG("Display_ON ...\n")

    SHARP_user.My_Board.POWER_SetVDD(1, 1.8)
    user_mode.Delay_ms(10)

    LCD_PORTSWAO_H()
    LCD_EN1PORT_H()

    SHARP_user.My_Board.POWER_SetVDD(4, 5.8)
    user_mode.Delay_ms(5)
    SHARP_user.My_Board.POWER_SetVDD(5, -5.8)
    user_mode.Delay_ms(40)

    LCD_RST_1()
    user_mode.Delay_ms(10)
    LCD_RST_0()
    user_mode.Delay_ms(10)
    LCD_RST_1()
    user_mode.Delay_ms(70)

    SwitchFrame(SHARP_user.frame)

    SHARP_user.My_MIPI_Board.UserMipi_ON()
    SHARP_user.My_MIPI_Board.SSD28_LP()

    Panel_Read()#回读屏幕寄存器

    MIPI_90_Init()

    ########################向MIPI总线写入一系列特定的命令和参数########################
    SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x04))

    # if SHARP_user.All_Test_Mask['OTPEnable']== 0 :#烧录前才会调用默认值
    #         # MIPI_WR((0x29,0xD5,0x02,0x4A,0x02,0x4A,0x02,0x4A))
    #     SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xD5,0x02,0x65,0x02,0x65,0x02,0x65))

    SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xD6,0x00))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x03))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x35,0x00))# 开TE信号
    SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x36,0x01))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x26,0x01))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x15,0x03,0x01))
    user_mode.Delay_ms(20)
    SHARP_user.My_MIPI_Board.MIPI_WR((0x29,0xB0,0x04))
    SHARP_user.My_MIPI_Board.MIPI_WR((0x05,0x11))
    user_mode.Delay_ms(20)
    SHARP_user.My_MIPI_Board.MIPI_WR((0x05,0x29))
    #################################################################################
    user_mode.Delay_ms(30)
    SHARP_user.My_MIPI_Board.SSD28_EnterConfigMode()
    SHARP_user.frame=0 #设置为第0个画面
    SwitchFrame(SHARP_user.frame)#显示画面

    for i in range(1,13):
        SHARP_user.My_Board.LED_SetI(i, 47.7)

    SHARP_user.My_Board.Set_blHorL(1)
    SHARP_user.My_Board.LED_ON(0xff)
    SHARP_user.My_Board.LED_ExPWMOn()
    user_mode.Delay_ms(300)

    SHARP_user.display_on = 1

    user_mode.DEBUG("Display_ON END\n")

def Display_OFF():
    SHARP_user.display_on = 0
    SHARP_user.frame = 0
    user_mode.DEBUG("Display_OFF  ...\n")

    SHARP_user.My_Board.LED_ExPWMOff()
    SHARP_user.My_Board.LED_OFF()

    SHARP_user.My_MIPI_Board.MIPI_WR((0x05, 0x28))
    user_mode.Delay_ms(20)
    SHARP_user.My_MIPI_Board.MIPI_WR((0x05, 0x10))
    user_mode.Delay_ms(120)

    SHARP_user.My_Board.POWER_SetVDD(5, 0)
    user_mode.Delay_ms(70)

    LCD_RST_0()
    user_mode.Delay_ms(15)

    SHARP_user.My_Board.POWER_SetVDD(5, 0)
    user_mode.Delay_ms(10)

    SHARP_user.My_Board.POWER_SetVDD(4, 0)
    user_mode.Delay_ms(20)

    SHARP_user.My_Board.POWER_SetVDD(1, 0)
    user_mode.Delay_ms(10)

    LCD_PORTSWAO_H()
    LCD_EN1PORT_L()

    user_mode.Delay_ms(10)

    SHARP_user.My_MIPI_Board.UserMipi_OFF()
    user_mode.DEBUG("Display_OFF END\n")

mipi_90HZ_data = (

    (0x29,0xB0,0x04),
    (0x29,0xB1,0x00),
    (0x29,0xB2,0x00,0x00,0x00,0x00,0x00,0x01,0x00),
    (0x29,0xB3,0x00),
    (0x29,0xB4,0x00,0x00,0x0A),
    (0x29,0xB5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x26,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00),

)

'''
*函數名:MIPI_90_Init
*描述  :写90HZ初始化
*返回  :无
'''
def MIPI_90_Init():
    for i in mipi_90HZ_data:
        SHARP_user.My_MIPI_Board.MIPI_WR(i)
    return 1

SHARP_user=User_Fun()
if __name__ == '__main__':
    user_mode.DEBUG("Enter Python OK !")
    run()