wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1163|回復: 16
收起左側

7位9腳數碼管驅動錯誤,不能正常顯示

  [復制鏈接]
ID:611626 發表于 2025-8-26 11:12 | 顯示全部樓層 |閱讀模式
7位9腳數碼管驅動錯誤,不能正常顯示,請指教問題所在位置
代碼如下:
#include "STC8G.h"
#include "intrins.h"

// 2921數碼管共9個引腳定義
sbit LED1 = P3^4;  // LED1腳(位選信號)
sbit LED2 = P3^5;  // LED2腳(位選信號)
sbit LED3 = P3^6;  // LED3腳(位選信號)
sbit LED4 = P3^7;  // LED4腳(位選信號)
sbit LED5 = P1^5;  // LED5腳(位選信號)
sbit LED6 = P1^6;  // LED6腳(位選信號)
sbit LED7 = P1^7;  // LED7腳(位選信號)
sbit LED8 = P5^4;  // 段選信號
sbit LED9 = P3^3;  // 段選信號

// 共陰數碼管段碼表 (0-9, A-F, 熄滅)
unsigned char code SEG_TABLE[17] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F, // 9
    0x77, // A
    0x7C, // B
    0x39, // C
    0x5E, // D
    0x79, // E
    0x71, // F
    0x00  // 熄滅
};

// ADC相關定義
#define ADC_POWER   0x80    // ADC電源控制位
#define ADC_FLAG    0x10    // ADC完成標志
#define ADC_START   0x08    // ADC開始控制位

// 函數聲明
void closeAllDigits();
void delay_ms(unsigned int ms);
void delay_us(unsigned int us);
void setSegments(unsigned char digit, unsigned char segCode);
void displayDigit(unsigned char digit, unsigned char num, bit dot);
void init();
void InitADC();
unsigned int ReadADC(unsigned char ch);
unsigned int GetAverageADC(unsigned char ch, unsigned char times);
float CalculateVoltage(unsigned int adcValue);
float CalculateCurrent(unsigned int adcValue);
void DisplayVoltage(float voltage);
void DisplayCurrent(float current);

// 關閉所有數碼管位選
void closeAllDigits() {
    LED1 = 1;  
    LED2 = 1;  
    LED3 = 1;  
    LED4 = 1;  
    LED5 = 1;  
    LED6 = 1;  
    LED7 = 1;  
}

// 延時函數
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}

// 短延時函數
void delay_us(unsigned int us) {
    while(us--) {
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
    }
}
//關閉相應段選
void closeAllseg(unsigned char digit, unsigned char segCode)
{
switch(digit) {
        case 1:  // LED1位選
            LED2 = 0;  // a段
            LED3 =  0;  // b段
            LED4 =  0;  // c段
            LED5 =  0;  // d段
            LED6 =  0;  // e段
            LED7 =  0;  // f段
            LED8 =  0;  // g段
            LED9 = 0;  // dp段
            break;

        case 2:  // LED2位選
            LED1 =  0;  // a段
            LED3 =  0;  // b段
            LED4 = 0;  // c段
            LED5 =  0;  // d段
            LED6 =  0;  // e段
            LED7 =  0;  // f段
            LED8 =  0;  // g段
            LED9 =  0;  // dp段
            break;

        case 3:  // LED3位選
            LED1 =  0;  // a段
            LED2 = 0;  // b段
            LED4 =  0;  // c段
            LED5 =  0;  // d段
            LED6 =  0;  // e段
            LED7 = 0;  // f段
            LED8 =  0;  // g段
            LED9 =  0;  // dp段
            break;

        case 4:  // LED4位選
            LED1 = 0;  // a段
            LED2 =  0;  // b段
            LED3 =  0;  // c段
            LED5 = 0;  // d段
            LED6 = 0;  // e段
            LED7 =  0;  // f段
            LED8 =  0;  // g段
            LED9 =  0;  // dp段
            break;

        case 5:  // LED5位選
            LED1 = 0;  // a段
            LED2 =  0;  // b段
            LED3 =  0;  // c段
            LED4 =  0;  // d段
            LED6 =  0;  // e段
            LED7 =  0;  // f段
            LED8 =  0;  // g段
            LED9 =  0;  // dp段
            break;

        case 6:  // LED6位選
            LED1 =  0;  // a段
            LED2 =  0;  // b段
            LED3 =  0;  // c段
            LED4 =  0;  // d段
            LED5 =  0;  // e段
            LED7 =  0;  // f段
            LED8 =  0;  // g段
            LED9 =  0;  // dp段
            break;
                        }
//delay_ms(10);
}

// 設置段碼,賦值段碼到相應引腳
void setSegments(unsigned char digit, unsigned char segCode) {
    // 先關閉所有LED段碼引腳
        /*
    LED1 = 0;
    LED2 = 0;
    LED3 = 0;
    LED4 = 0;
    LED5 = 0;
    LED6 = 0;
    LED7 = 0;
    LED8 = 0;
    LED9 = 0;
   */
        closeAllseg(); //先關閉所有段選
    // 根據不同數碼管設置相應的段碼
    switch(digit) {
        case 1:  // LED1位選
            LED2 = (segCode & 0x01) ? 1 : 0;  // a段
            LED3 = (segCode & 0x02) ? 1 : 0;  // b段
            LED4 = (segCode & 0x04) ? 1 : 0;  // c段
            LED5 = (segCode & 0x08) ? 1 : 0;  // d段
            LED6 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;

        case 2:  // LED2位選
            LED1 = (segCode & 0x01) ? 1 : 0;  // a段
            LED3 = (segCode & 0x02) ? 1 : 0;  // b段
            LED4 = (segCode & 0x04) ? 1 : 0;  // c段
            LED5 = (segCode & 0x08) ? 1 : 0;  // d段
            LED6 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;

        case 3:  // LED3位選
            LED1 = (segCode & 0x01) ? 1 : 0;  // a段
            LED2 = (segCode & 0x02) ? 1 : 0;  // b段
            LED4 = (segCode & 0x04) ? 1 : 0;  // c段
            LED5 = (segCode & 0x08) ? 1 : 0;  // d段
            LED6 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;

        case 4:  // LED4位選
            LED1 = (segCode & 0x01) ? 1 : 0;  // a段
            LED2 = (segCode & 0x02) ? 1 : 0;  // b段
            LED3 = (segCode & 0x04) ? 1 : 0;  // c段
            LED5 = (segCode & 0x08) ? 1 : 0;  // d段
            LED6 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;

        case 5:  // LED5位選
            LED1 = (segCode & 0x01) ? 1 : 0;  // a段
            LED2 = (segCode & 0x02) ? 1 : 0;  // b段
            LED3 = (segCode & 0x04) ? 1 : 0;  // c段
            LED4 = (segCode & 0x08) ? 1 : 0;  // d段
            LED6 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;

        case 6:  // LED6位選
            LED1 = (segCode & 0x01) ? 1 : 0;  // a段
            LED2 = (segCode & 0x02) ? 1 : 0;  // b段
            LED3 = (segCode & 0x04) ? 1 : 0;  // c段
            LED4 = (segCode & 0x08) ? 1 : 0;  // d段
            LED5 = (segCode & 0x10) ? 1 : 0;  // e段
            LED7 = (segCode & 0x20) ? 1 : 0;  // f段
            LED8 = (segCode & 0x40) ? 1 : 0;  // g段
            LED9 = (segCode & 0x80) ? 1 : 0;  // dp段
            break;
    }
}

// 顯示單個數碼管
void displayDigit(unsigned char digit, unsigned char num, bit dot) {
    unsigned char segCode;

    // 確保num在有效范圍內
    if (num > 9) num = 16;  // 只允許0-9的數字顯示 if (num > 9) num = 16;  

    // 關閉所有數碼管位選,防止串擾
    closeAllDigits();

    // 獲取段碼并設置小數點:segCode緩存=段碼表
   segCode = SEG_TABLE[num];
    if(dot) segCode |= 0x80;  // 設置小數點

    // 設置段碼
    setSegments(digit, segCode);

    // 打開對應的數碼管位選(共陰,低電平有效)
    switch(digit) {
        case 1: LED1 = 0; break;
        case 2: LED2 = 0; break;
        case 3: LED3 = 0; break;
        case 4: LED4 = 0; break;
        case 5: LED5 = 0; break;
        case 6: LED6 = 0; break;
    }

    // 短暫延時,確保顯示可見
    delay_ms(1);
}

// 初始化ADC
void InitADC() {
    P_SW2 |= 0x80;  // 擴展寄存器訪問使能
    ADC_CONTR = ADC_POWER | 0x08;  // 開啟ADC電源,使用內部參考電壓
    P_SW2 &= 0x7F;  // 關閉擴展寄存器訪問
    delay_ms(1);  // 等待ADC電源穩定
}

// 讀取單次ADC值
unsigned int ReadADC(unsigned char ch) {
    unsigned int adcValue;

    P_SW2 |= 0x80;  // 擴展寄存器訪問使能
    ADC_CONTR = ADC_POWER | ch | ADC_START;
    delay_us(20);  // 等待轉換開始

    while (!(ADC_CONTR & ADC_FLAG));  // 等待轉換完成
    ADC_CONTR &= ~ADC_FLAG;  // 清除轉換完成標志

    // 讀取ADC結果
    adcValue = (unsigned int)ADC_RES << 8;
    adcValue |= ADC_RESL;

    P_SW2 &= 0x7F;  // 關閉擴展寄存器訪問
    return adcValue;
}

// 讀取多次ADC并取平均值
unsigned int GetAverageADC(unsigned char ch, unsigned char times) {
    unsigned long sum = 0;
    unsigned char i;

    for(i = 0; i < times; i++) {
        sum += ReadADC(ch);
        delay_ms(1);
    }

    return (unsigned int)(sum / times);
}

// 計算電壓值
float CalculateVoltage(unsigned int adcValue) {
    float refVoltage = 3.3;
    float voltage = (adcValue * refVoltage) / 1023.0 * 10.0;

    if(voltage > 30.0) voltage = 30.0;
    return voltage;
}

// 計算電流值
float CalculateCurrent(unsigned int adcValue) {
    float refVoltage = 3.3;
    float current = (adcValue * refVoltage) / 1023.0 * 303.0;

    if(current > 999.0) current = 999.0;
    return current;
}

// 顯示電壓值 (LED1-3)
void DisplayVoltage(float voltage) {
    unsigned int integerPart;
    unsigned int decimalPart;

    // 確保電壓值在有效范圍內
    if(voltage < 0) voltage = 0;
    if(voltage > 30.0) voltage = 30.0;

    // 分離整數和小數部分
    integerPart = (unsigned int)voltage;
    decimalPart = (unsigned int)((voltage - integerPart) * 100);

    // 顯示12.3V的例子:
    // LED1顯示1,LED2顯示2(帶小數點),LED3顯示3
    if(integerPart >= 10) {
        // 兩位數電壓: XX.X
        displayDigit(1, integerPart / 10, 0);       // 十位
        displayDigit(2, integerPart % 10, 1);       // 個位(帶小數點)
        displayDigit(3, decimalPart / 10, 0);       // 小數第一位
    } else {
        // 一位數電壓: X.XX
        displayDigit(1, integerPart, 0);            // 個位
        displayDigit(2, decimalPart / 10, 1);       // 小數第一位(帶小數點)
        displayDigit(3, decimalPart % 10, 0);       // 小數第二位
    }
}

// 顯示電流值 (LED4-6)
void DisplayCurrent(float current) {
    unsigned int currInt;
    unsigned int integerPart;
    unsigned int decimalPart;

    // 確保電流值在有效范圍內
    if(current < 0) current = 0;
    if(current > 999.0) current = 999.0;

    // 顯示45.6mA的例子:
    // LED4顯示4,LED5顯示5(帶小數點),LED6顯示6
    if(current >= 100) {
        // 三位數電流: XXX
        currInt = (unsigned int)current;
        displayDigit(4, currInt / 100, 0);          // 百位
        displayDigit(5, (currInt / 10) % 10, 0);    // 十位
        displayDigit(6, currInt % 10, 0);           // 個位
    } else {
        // 帶小數的電流: X.XX
        integerPart = (unsigned int)current;
        decimalPart = (unsigned int)((current - integerPart) * 100);
        displayDigit(4, integerPart, 0);            // 個位2D
        displayDigit(5, decimalPart / 10, 1);       // 小數第一位(帶小數點)3B
        displayDigit(6, decimalPart % 10, 0);       // 小數第二位
    }
}

// 初始化函數
void init() {
    // 設置IO口為推挽輸出
    P3M0 = 0xF8;  // P3.3-P3.7推挽輸出
    P3M1 = 0x00;
    P1M0 = 0xE0;  // P1.5-P1.7推挽輸出
    P1M1 = 0x00;
    P5M0 = 0x10;  // P5.4推挽輸出
    P5M1 = 0x00;

    // 初始關閉所有數碼管
    closeAllDigits();

    // 初始化ADC
    InitADC();
}

// 主函數
void main() {
    unsigned int adcVoltage, adcCurrent;
    float voltage, current;
    int i;  // 聲明在循環外,兼容C89標準

    init();

    while(1) {
        // 使用測試值
      //  voltage = 22.8;  // 應該顯示在LED1-3: 1, 2., 3
        current = 45.6;  // 應該顯示在LED4-6: 4, 5., 6

        // 循環顯示電壓和電流,增加刷新頻率

         //   DisplayVoltage(voltage);
            DisplayCurrent(current); //顯示電流
                       
         delay_ms(1);
    }
}


數碼管.jpg
回復

使用道具 舉報

ID:69038 發表于 2025-8-26 13:52 | 顯示全部樓層
感覺你這樣的驅動方法不對!
你搜一下本壇的關鍵詞:“查理復用”
回復

使用道具 舉報

ID:611626 發表于 2025-8-26 18:04 | 顯示全部樓層
#include "STC8G.h"
#include "intrins.h"

// 引腳定義
sbit LED1 = P3^4;  // 位選1
sbit LED2 = P3^5;  // 位選2
sbit LED3 = P3^6;  // 位選3
sbit LED4 = P3^7;  // 位選4
sbit LED5 = P1^5;  // 位選5
sbit LED6 = P1^6;  // 位選6
sbit LED7 = P1^7;  // 位選7(指示燈)
sbit LED8 = P5^4;  // 段選G
sbit LED9 = P3^3;  // 段選DP

// 共陰數碼管段碼表(0-9) - 修正版
// 位定義: bit0=A, bit1=B, bit2=C, bit3=D, bit4=E, bit5=F, bit6=G, bit7=DP
unsigned char code SEG_TABLE[10] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

// 顯示緩沖區 - 上排固定381,下排4顯示7,5和6不顯示
unsigned char dispBuffer[6] = {3, 8, 1, 7, 0xFF, 0xFF}; // 0xFF表示不顯示
bit indicatorState = 1;
unsigned char slot = 0;
unsigned int scanCounter = 0;

// 延時函數(約150us@24MHz) - 縮短延時減少閃爍
void Delay150us(void) {
    unsigned int i;
    for(i = 0; i < 360; i++);
}

// 所有引腳設置為高阻
void SetAllHighZ(void) {
    P3M0 = 0x00; P3M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
   
    LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1;
    LED6 = 1; LED7 = 1; LED8 = 1; LED9 = 1;
}

// 配置引腳為推挽輸出
void SetPushPull(unsigned char pin) {
    switch(pin) {
        case 1: P3M0 |= 0x10; P3M1 &= ~0x10; break;
        case 2: P3M0 |= 0x20; P3M1 &= ~0x20; break;
        case 3: P3M0 |= 0x40; P3M1 &= ~0x40; break;
        case 4: P3M0 |= 0x80; P3M1 &= ~0x80; break;
        case 5: P1M0 |= 0x20; P1M1 &= ~0x20; break;
        case 6: P1M0 |= 0x40; P1M1 &= ~0x40; break;
        case 7: P1M0 |= 0x80; P1M1 &= ~0x80; break;
        case 8: P5M0 |= 0x10; P5M1 &= ~0x10; break;
        case 9: P3M0 |= 0x08; P3M1 &= ~0x08; break;
    }
}

// 驅動時隙0: LED1作為COM (上排第1位顯示3)
void DriveSlot0(void) {
    unsigned char seg = SEG_TABLE[dispBuffer[0]];
   
    SetAllHighZ();
   
    // 配置COM為推挽低電平
    SetPushPull(1);
    LED1 = 0;
   
    // 配置段選 - 修正映射關系
    SetPushPull(2); LED2 = seg & 0x01;     // A1
    SetPushPull(3); LED3 = (seg >> 1) & 0x01; // B1
    SetPushPull(4); LED4 = (seg >> 2) & 0x01; // C1
    SetPushPull(5); LED5 = (seg >> 3) & 0x01; // D1
    SetPushPull(6); LED6 = (seg >> 4) & 0x01; // E1
    SetPushPull(7); LED7 = (seg >> 5) & 0x01; // F1
    SetPushPull(8); LED8 = (seg >> 6) & 0x01; // G1
    SetPushPull(9); LED9 = 0; // 關閉小數點
   
    Delay150us();
}

// 驅動時隙1: LED2作為COM (上排第2位顯示8)
void DriveSlot1(void) {
    unsigned char seg = SEG_TABLE[dispBuffer[1]];
   
    SetAllHighZ();
   
    SetPushPull(2);
    LED2 = 0;
   
    SetPushPull(1); LED1 = seg & 0x01;     // A2
    SetPushPull(3); LED3 = (seg >> 1) & 0x01; // B2
    SetPushPull(4); LED4 = (seg >> 2) & 0x01; // C2
    SetPushPull(5); LED5 = (seg >> 3) & 0x01; // D2
    SetPushPull(6); LED6 = (seg >> 4) & 0x01; // E2
    SetPushPull(7); LED7 = (seg >> 5) & 0x01; // F2
    SetPushPull(8); LED8 = (seg >> 6) & 0x01; // G2
    SetPushPull(9); LED9 = 0;
   
    Delay150us();
}

// 驅動時隙2: LED3作為COM (上排第3位顯示1)
void DriveSlot2(void) {
    unsigned char seg = SEG_TABLE[dispBuffer[2]];
   
    SetAllHighZ();
   
    SetPushPull(3);
    LED3 = 0;
   
    SetPushPull(1); LED1 = seg & 0x01;     // A3
    SetPushPull(2); LED2 = (seg >> 1) & 0x01; // B3
    SetPushPull(4); LED4 = (seg >> 2) & 0x01; // C3
    SetPushPull(5); LED5 = (seg >> 3) & 0x01; // D3
    SetPushPull(6); LED6 = (seg >> 4) & 0x01; // E3
    SetPushPull(7); LED7 = (seg >> 5) & 0x01; // F3
    SetPushPull(8); LED8 = (seg >> 6) & 0x01; // G3
    SetPushPull(9); LED9 = 0;
   
    Delay150us();
}

// 驅動時隙3: LED4作為COM (下排第4位顯示7)
void DriveSlot3(void) {
    unsigned char seg = SEG_TABLE[dispBuffer[3]];
   
    SetAllHighZ();
   
    SetPushPull(4);
    LED4 = 0;
   
    SetPushPull(1); LED1 = seg & 0x01;     // A4
    SetPushPull(2); LED2 = (seg >> 1) & 0x01; // B4
    SetPushPull(3); LED3 = (seg >> 2) & 0x01; // C4
    SetPushPull(5); LED5 = (seg >> 3) & 0x01; // D4
    SetPushPull(6); LED6 = (seg >> 4) & 0x01; // E4
    SetPushPull(7); LED7 = (seg >> 5) & 0x01; // F4
    SetPushPull(8); LED8 = (seg >> 6) & 0x01; // G4
    SetPushPull(9); LED9 = 0;
   
    Delay150us();
}

// 驅動時隙4: LED5作為COM (下排第5位不顯示)
void DriveSlot4(void) {
    SetAllHighZ();
    // 僅關閉COM,不設置任何段選
    SetPushPull(5);
    LED5 = 1; // 不激活位選
    Delay150us();
}

// 驅動時隙5: LED6作為COM (下排第6位不顯示)
void DriveSlot5(void) {
    SetAllHighZ();
    // 僅關閉COM,不設置任何段選
    SetPushPull(6);
    LED6 = 1; // 不激活位選
    Delay150us();
}

// 驅動時隙6: LED7作為指示燈
void DriveSlot6(void) {
    SetAllHighZ();
   
    SetPushPull(7);
    LED7 = 0; // 激活指示燈
   
    SetPushPull(1); LED1 = indicatorState;
    SetPushPull(2); LED2 = indicatorState;
   
    Delay150us();
}

// 掃描所有時隙
void ScanSlots(void) {
    switch(slot) {
        case 0: DriveSlot0(); break;
        case 1: DriveSlot1(); break;
        case 2: DriveSlot2(); break;
        case 3: DriveSlot3(); break;
        case 4: DriveSlot4(); break;
        case 5: DriveSlot5(); break;
        case 6: DriveSlot6(); break;
    }
   
    slot++;
    if(slot >= 7) slot = 0;
   
    // 降低指示燈閃爍頻率
    if(++scanCounter >= 4000) {
        scanCounter = 0;
        indicatorState = !indicatorState;
    }
}

// 主函數
void main(void) {
    SetAllHighZ();
   
    while(1) {
        // 高頻掃描確保顯示穩定
        ScanSlots();
    }
}
LED.jpg
回復

使用道具 舉報

ID:1133081 發表于 2025-8-26 20:33 | 顯示全部樓層
zhuls 發表于 2025-8-26 13:52
感覺你這樣的驅動方法不對!
你搜一下本壇的關鍵詞:“查理復用”

這種數碼管不適用“查理復用”方式,9個腳有7個是段位輪換共用?梢园盐籦it插入段碼編一個int型2維數組,也就是7位8段。
回復

使用道具 舉報

ID:1034262 發表于 2025-8-26 22:52 | 顯示全部樓層
驅動這種數碼管,N個IO最多可以驅動N(N-1)個LED,9個IO最多可以驅動9*8=72段,即9個帶小數點的數碼管。
驅動原則是:
分N個時隙驅動,每次驅動時一個IO做COM驅動,另外(N-1)個IO做SEG驅動。
先把所有IO設置為高阻。
對于共陰,不顯示的SEG為高阻,顯示的SEG推挽輸出1, COM推挽輸出0。
對于共陽,不顯示的SEG為高阻,顯示的SEG推挽輸出0, COM推挽輸出1。
回復

使用道具 舉報

ID:384109 發表于 2025-8-26 22:52 | 顯示全部樓層
查理復用好像需要引進有硬件高阻功能才行
回復

使用道具 舉報

ID:69038 發表于 2025-8-27 00:01 | 顯示全部樓層
WL0123 發表于 2025-8-26 20:33
這種數碼管不適用“查理復用”方式,9個腳有7個是段位輪換共用。可以把位bit插入段碼編一個int型2維數組 ...

你在主樓“數碼管.jpg "圖中所展示的邏輯,就是要用“查理復用”的方式來驅動。。
9個腳最多可驅動9*8=72個LED。也就是最多可驅動9位8段(7段+小數點),
所以你才7位,算是富余了。
回復

使用道具 舉報

ID:69038 發表于 2025-8-27 00:43 | 顯示全部樓層
你要有兩個數組做緩存,一個是顯示內容,另一個是段碼映射表,
比如你要顯示“0123456”7個數字,就要有段表buf[7];//7位屏
再來個輸出映射表,比如dis[9];//共9個掃描線
當你buf[7]中7個要顯示數字有改變時,要根據圖中所示邏輯表映射到dis[9]中:
如我這個是6線驅動4位時鐘屏,剛好30個LED(6*5=30)
這是映射關系:
  1. // void trans4_6(unsigned char sec_point)   
  2. //{
  3. //   char i;
  4. //        for(i=0;i<6;i++) dis[i]=0;             // 清顯示緩存
  5. //        dis[0] |= (buf[0] & 0x1F) << 1;           // dis0的bit[5:1]=buf0的bit[4:0]
  6. //        dis[1] |= (buf[0] & 0x20) >> 5;           // dis1的bit[0]=buf0的bit[5]
  7. //        dis[1] |= (buf[0] & 0x40) >> 4;           // dis1的bit[2]=buf0的bit[6]
  8. //        dis[1] |= (buf[1] & 0x07) << 3;           // dis1的bit[5:3]=buf1的bit[2:0]
  9. //        dis[2] |= (buf[1] & 0x18) >> 3;           // dis2的bit[1:0]=buf1的bit[4:3]
  10. //        dis[2] |= (buf[1] & 0x60) >> 2;           // dis2的bit[4:3]=buf1的bit[6:5]
  11. //        dis[2] |= (buf[2] & 0x01) << 5;           // dis2的bit[5]=buf2的bit[0]
  12. //        dis[3] |= (buf[2] & 0x0E) >> 1;           // dis3的bit[2:0]=buf2的bit[3:1]
  13. //        dis[3] |= (buf[2] & 0x30) ;               // dis3的bit[5:4]=buf2的bit[5:4]
  14. //        dis[4] |= (buf[2] & 0x40) >> 6;           // dis4的bit[0]=buf2的bit[6]
  15. //        dis[4] |= (buf[3] & 0x07) << 1;           // dis4的bit[3:1]=buf3的bit[2:0]
  16. //        dis[4] |= (buf[3] & 0x08) << 2;           // dis4的bit[5]=buf3的bit[3]
  17. //        dis[5] |= (buf[3] & 0x70) >> 4;           // dis5的bit[2:0]=buf3的bit[6:4]
  18. //        if(sec_point & 0x01) dis[5] |= 0x08; //顯示上秒點
  19. //        if(sec_point & 0x02) dis[5] |= 0x10; //顯示下秒點
  20. //}
復制代碼
然后再在中斷中掃描dis[9]:
比如:
  1. // void scan_led_io(unsigned char line)
  2. //{
  3. //  unsigned char i;
  4. //  unsigned char io;
  5. //  unsigned char tdat;
  6. //
  7. //   io=scan_io_tbl[line];   //掃描線轉IO口bit[x]  ;//因為掃描線不是連續的,才要有此動作。
  8. //   dat=dis[line];                   //當前掃描線對應的數值
  9. //
  10. //   led_input();                       //所有掃描線均為輸入高阻態
  11. //   led_pp_out(io);                   //當前掃描線為PP輸出,(且為低--代碼共用,不想改了)
  12. //   P1 |= check_tbl[line];  //當前掃描線輸出高
  13. //
  14. //   for(i=0;i<6;i++)                   //共6條線
  15. //   {
  16. //            if(i==io)  continue;            //是當掃描線,跳過
  17. //            if(dat & check_tbl[i])//負極線,且有效
  18. //         led_pp_out(i);               //輸出低
  19. //   }
  20. //}
復制代碼
以上是以IO線為掃描基準,當某些IO
輸出能力不足時,會LED顯示亮度不均!
還有一種方法是,以單個LED為基準,一次掃描一個LED,可以解決亮度問題,但掃描代碼要更改。。
個人更喜歡用單點掃顯方式,省去 void trans4_6(unsigned char sec_point) 映射動作,不過要多做一個表,
如(這個是8線56燈):
  1. unsigned int code led_map[led_num]={
  2.                         0x0001,        //1A 第一個[0]是buf[0],第二個[0]是bit[0],第3個[0]是正極P1[0],第4個[1]是負極P1[1],下同,略;
  3.                         0x0102,        //1B
  4.                         0x0203,        //1C
  5.                         0x0304,        //1D
  6.                         0x0405,        //1E
  7.                         0x0506,        //1F
  8.                         0x0607,        //1G
  9.                         0x0763,        //1H

  10. 。

復制代碼
然后,在中斷掃描:
  1. //tim0中斷
  2. //每進中斷掃顯一個LED,亮度均勻,但整體亮度略低。。。
  3. //占用0.5ms時視頻不閃,1ms時視頻微閃,2ms時視頻明顯見閃;
  4. //以祼眼視覺為準  。
  5. void tim0_Isr() interrupt 1           //
  6. {
  7.         tms++;
  8.     buf_index = led_map[tim_count]>>12 & 0x0f;
  9.         bit_index = led_map[tim_count]>>8 & 0x0f;
  10.         led_p   = led_map[tim_count]>>4 & 0x0f;
  11.         led_n   = led_map[tim_count]& 0x0f;
  12.        
  13.         led_input();//所有LED相關的IO均置輸入(高阻,滅所有LED)
  14.         //檢測buf[0-6]中[bit0:bit7]的值,為“1”需點亮,為“0”不點亮
  15.         if( buf[buf_index] & 1 << bit_index )
  16.         {
  17.                 led_pp_out(led_p,1);           //當前正極線為PP輸出,且置高
  18.                 led_pp_out(led_n,0);       //對應LED輸出低
  19.         }
  20.         tim_count++;        //下一次要掃描的IO
  21.     tim_count%=led_num;   //全屏共8個IO復用
  22. }


復制代碼
說了這么多, 以上內容希望能幫到你。。。



回復

使用道具 舉報

ID:1133081 發表于 2025-8-27 07:11 | 顯示全部樓層
zhuls 發表于 2025-8-27 00:01
你在主樓“數碼管.jpg "圖中所展示的邏輯,就是要用“查理復用”的方式來驅動。。
9個腳最多可驅動9*8=7 ...

你的觀點是對的,我在4樓的方法不成熟,行不通。
回復

使用道具 舉報

ID:611626 發表于 2025-8-27 08:56 | 顯示全部樓層
zhuls 發表于 2025-8-27 00:01
你在主樓“數碼管.jpg "圖中所展示的邏輯,就是要用“查理復用”的方式來驅動。。
9個腳最多可驅動9*8=7 ...

現在測試中感覺是時序不正確,出現亂碼,有的位不顯示現象
回復

使用道具 舉報

ID:69038 發表于 2025-8-27 13:53 | 顯示全部樓層
宏達工控 發表于 2025-8-27 08:56
現在測試中感覺是時序不正確,出現亂碼,有的位不顯示現象

你可以單獨測試,只顯示一個數字,比如第一位顯示“1”,234567位不顯,再第二位顯示“2”,134567位不顯。。。
看看能不能正常?
回復

使用道具 舉報

ID:584814 發表于 2025-8-27 18:12 | 顯示全部樓層
7位9腳是啥意思 ?
1、通常一位數碼管有8只腳(不要點的7只腳),加上7位引腳至少是15腳;
2、如果是7位數碼管共只有9只引腳,是查理利用方式驅動,這個沒專用芯片是單片機直驅。
如果是1,建議買個成品的驅動芯片只要幾毛錢;如果是2,就找查理復用驅動法。
回復

使用道具 舉報

ID:774370 發表于 2025-8-28 15:12 | 顯示全部樓層
看圖片確實為查理復用的數碼管
回復

使用道具 舉報

14#
無效樓層,該帖已經被刪除
ID:611626 發表于 2025-8-29 17:47 | 顯示全部樓層
void Io_init (void)// 模式初值設置
{
    P1M0 &= ~(0xE0); P1M1 |= 0xE0;   // 設置P1.5, P1.6, P1.7為高阻: 11100000 -> M0=0, M1=1: 高阻
    P3M0 &= ~(0xF8); P3M1 |= 0xF8;   // 設置P3.3~P3.7為高阻: 11111000 -> 0xF8
    P5M0 &= ~(0x10); P5M1 |= 0x10;   // P5.4設置P5.4為高阻: 00010000
}
void DG1(int a)
{
   Io_init ();
         switch(a) //2A3B4=P3.3dp9-3.5-9.7 C5D6E7F=P1.5-1.7 P3.4配置雙向口  9DP
                {  //顯示0=abcdef 234 567 P35-P37 P15-P17
            //P3M1 =0000 0111=07        P3M0 =1111 1000=F8        設置為推挽        P3=11101000=E8
                        case 0:{
                                                        P3M1 = 0x07;  P3M0 = 0xF8;  P3 = 0xE8;   delay(x);    //1ABC   //0.                               
                    P1M1 = 0x1F;  P1M0 = 0xE0;  P1 = 0xE0;   delay(x);    //1DEF
                                                        P5M1 = 0xFF;  P5M0 = 0x00;  P5 = 0x00;   delay(x);    //1G
                               
                                                        break;}
      //顯示1=bc=34 =1  1=0    錯誤 同時點亮第二位1第五第六位CD段//DP        11111000=F8  P3M0 &= ~(0xF8)
//                        P3M1 =0010 1111=2F0x27 P3M0 =1101 0000=D0        0xC8;        P3=1100 0000=C0
                        case 1:{
                                        /*                        P3M1 |= 0x2F;  P3M0 |= 0XD8;  P3 = 0xC0;   delay(x);    //1BC  0xC8 //1.               
                                                        P1M1 |= 0xFF;  P1M0 |= 0x00;  P1 = 0x00;   delay(x);    //1DEF
                                                        P5M1 |= 0xFF;  P5M0 |= 0x00;  P5 = 0x00;   delay(x);    //1G   */
                                P3M1 &= 0x20;  P3M0 |= 0xD8;  P3 = 0xC0;   delay(x);
                                P1M0 &= ~(0xE0); P1M1 |= 0xE0; P1 = 0x00;   delay(x); //
                                P5M0 &= ~(0x10); P5M1 |= 0x10; P5 = 0x00; delay(x); //
                                                        break;}
}
請解釋:當前顯示1,為啥顯示成這樣

LED.jpg
回復

使用道具 舉報

ID:69038 發表于 2025-8-29 21:25 | 顯示全部樓層
宏達工控 發表于 2025-8-29 17:47
void Io_init (void)// 模式初值設置
{
    P1M0 &= ~(0xE0); P1M1 |= 0xE0;   // 設置P1.5, P1.6, P1.7 ...

看你這圖中的LED的管腳,不是高(紅)就是低(藍)。。高阻或辦入態的應該是灰色才對
不知道是不是沒有開高阻,或是Proteus中的51模型不能正確設為高阻?
回復

使用道具 舉報

ID:1133081 發表于 2025-8-29 22:12 | 顯示全部樓層
宏達工控 發表于 2025-8-29 17:47
void Io_init (void)// 模式初值設置
{
    P1M0 &= ~(0xE0); P1M1 |= 0xE0;   // 設置P1.5, P1.6, P1.7 ...

樓主想多了,Proteus根本不能正常仿真查理復用驅動LED,更無法仿真查理復用驅動數碼管。不信你仿真PWM調LED亮度試試。
回復

使用道具 舉報

ID:611626 發表于 2025-8-30 08:41 | 顯示全部樓層
WL0123 發表于 2025-8-29 22:12
樓主想多了,Proteus根本不能正常仿真查理復用驅動LED,更無法仿真查理復用驅動數碼管。不信你仿真PWM調L ...

我說哪,瞎忙活 了幾天,邏輯怎么修改都不行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
99热这里只有精品8| 91蝌蚪91九色| 精品国产精品国产偷麻豆| 中文字幕av一区二区三区免费看| 7777在线视频| 在线观看视频网站你懂得| 国产精品美女久久久久久久| 成年人观看网站| 日本中文字幕在线观看| 欧美区在线观看| 男女羞羞免费视频| 日韩极品在线| 成人在线视频网| 樱花草在线观看www| 久久久久国产精品免费免费搜索| 手机在线成人免费视频| а√天堂中文在线资源8| 亚洲国内高清视频| 国产女优在线播放| 国产情侣一区| 精品一区二区成人免费视频 | 亚洲欧洲一区二区天堂久久| 国产精品入口免费| 狠狠操在线视频| 4438x亚洲最大成人网| 精品一区二区三区四| 国产精品vip| 宅男在线精品国产免费观看| 色多多视频在线观看| 亚洲精品视频在线播放| 精品人妻一区二区三区蜜桃 | 久久久久久夜| 99re6这里有精品热视频| 三级外国片在线观看视频| 亚洲欧美综合v| 中文字幕专区| 国产精品久久福利| 国产黄在线免费观看| 国产精品二区影院| 欧美一级片免费播放| 亚洲四虎影院| 444亚洲人体| 亚洲天天影视| 欧美极品美女视频网站在线观看免费| 国产精品9区| 欧洲生活片亚洲生活在线观看| 在线视频你懂得| 国产91精品在线| 中出嫩模无套| 欧美日韩国产片| av无码精品一区二区三区宅噜噜| 国产网红主播福利一区二区| 51精品免费网站| 精品一区二区三区免费播放| 亚洲女则毛耸耸bbw| 欧美成免费一区二区视频| 欧洲xxxxx| 高清久久精品| 欧美亚洲另类在线一区二区三区| 欧美韩日亚洲| 成人在线中文字幕| 成人女同在线观看| 国产精品扒开腿做| 精品欧美不卡一区二区在线观看| 久久激情五月丁香伊人| 国产主播在线资源| 久久精品视频在线播放| 一二三四中文在线| 九色精品免费永久在线| 日本在线аv| 精品中文字幕在线| 男人久久精品| 国产精品mp4| 91精选在线| 99精品国产高清在线观看| 在线免费观看的av| 亚洲综合一区二区不卡| 日本在线啊啊| 欧美精品一区二区视频| www999久久| 国自产拍偷拍精品啪啪一区二区| 日韩久久久久| 亚洲精品无码一区二区| 日韩精品视频网站| 夫妇交换中文字幕| 白白色亚洲国产精品| 欧美三级一区二区三区| 亚洲人成亚洲人成在线观看图片| 亚洲h视频在线观看| 欧美性色欧美a在线播放| xxxxwwww欧美| 色偷偷偷亚洲综合网另类| 精品国产一区二区三区四区阿崩| 欧美最顶级的aⅴ艳星| 超黄网站在线观看| 日日夜夜精品网站| 欧美电影《睫毛膏》| 国产xxx在线观看| 国产精品18久久久久久久久久久久| 久草视频在线观| 色老汉一区二区三区| 美女被黑人爆操网站| 午夜免费久久久久| 超碰超碰人人人人精品| 日韩国产一级片| 国产精品老牛| 久久午夜无码鲁丝片午夜精品| 亚洲国产精品一区二区www| ed2k情侣啪啪91av| 26uuu国产精品视频| 久久人体大尺度| 毛片av免费在线观看| 久久精品理论片| 国产男女猛烈无遮挡| 亚洲国模精品私拍| 91网址在线观看| www污在线观看| 美女免费视频一区| av综合在线观看| 中文字幕免费精品一区高清| a级大胆欧美人体大胆666| 日韩国产欧美亚洲| 久久精品国产77777蜜臀| www.黄色片| 在线观看欧美视频| 久久免费资源| 一级片手机在线观看| 午夜欧美一区二区三区在线播放| 老司机在线免费视频| 亚洲成avwww人| 黄色网址在线免费| 激情视频免费网站| 亚洲啪啪综合av一区二区三区| 99免费看香蕉视频| 午夜精品亚洲一区二区三区嫩草| 蜜臀av一区二区在线观看| 天天干天天色天天| 成人黄色av播放免费| 国产在线日韩| 欧美一区二区三区激情| 91成人在线观看国产| 97色伦图片97综合影院| aaa毛片在线观看| 国产盗摄视频一区二区三区| 十大免费污污软件| 视频一区二区在线| 97se亚洲国产综合自在线观| 极品尤物av丝袜美腿在线观看| 色噜噜色狠狠狠狠狠综合色一| 国产精品香蕉一区二区三区| 99免费视频| 人妻熟妇乱又伦精品视频| 亚洲人成人一区二区在线观看| 三级在线电影| 一级黄色免费视频| 亚洲成人av片| 欧美亚洲色图校园春色| 在线免费av片| 91精品久久久久久久久不口人| 嫩草成人www欧美| 美女又爽又黄| 国产中文字幕免费观看| 欧美日韩精品二区| 唐人社导航福利精品| 久久精品久久国产| 18一19gay欧美视频网站| 久久一区二区三区四区五区| www日本黄色| 国产高清视频网站| 亚洲国产精品999| 日韩在线高清| 日本免费黄色| wwwwxxxx日韩| 亚洲国产精品yw在线观看| 精品国产乱码久久久| 欧美最猛黑人xxxxwww| 毛片电影在线| 99鲁鲁精品一区二区三区| 国内精品久久久久久| 日韩av一级片| 青草久久伊人| 性欧美精品男男| 欧美超级乱淫片喷水| 香蕉久久夜色精品| 91视频综合网| 国产成人av网| 久久精品视频一区二区三区| 在线看一级片| 波多野结衣小视频| 免费av在线一区二区| 日韩欧美在线字幕| 久久不卡国产精品一区二区| 又长又粗又大又爽| 人妻av一区二区三区| 久久福利视频网| 日本不卡123| 神马电影在线观看| 亚洲黄色三级视频| 神马一区二区影院| 欧美久久久久中文字幕| 天天做天天爱天天爽综合网| 天天综合天天操| 久久午夜夜伦鲁鲁片| 日本精品一区二区三区在线| 国产欧美日韩不卡| 日韩精品成人在线观看| 8x8x拔插拔插影库永久免费| 亚洲精品免费一区亚洲精品免费精品一区 | 亚洲AV无码乱码国产精品牛牛| 波多野结衣 作品| 伊人青青综合网站| 国产在线国偷精品产拍免费yy| av人人综合网| 一道精品视频一区二区三区男同 | 亚洲伦理在线观看| 日韩中文字幕组| 91av视频在线免费观看| 亚洲精品久久久蜜桃| 你微笑时很美电视剧整集高清不卡| 成人免费乱码大片a毛片软件| 高潮毛片无遮挡| 精品国产日本| 91蝌蚪porny九色| 动漫视频在线一区| 啦啦啦在线视频免费观看高清中文 | 大西瓜av在线| 久久精品99国产精品酒店日本 | 一区二区三区精品99久久| a级精品国产片在线观看| 欧美一级网址| 成年网站在线观看视频| 国产真实夫妇交换视频| 久久国产精品视频在线观看| 国产69精品99久久久久久宅男| 亚洲色图欧美在线| 亚洲久色影视| www.日韩| hbad中文字幕| 国产精品免费无遮挡| 6080国产精品| 久久青青草综合| 久久亚洲一区二区三区四区五区高| 亚洲免费资源在线播放| 1024成人| 国产精品成人**免费视频| 米奇.777.com| 中国女人精69xxxxxx视频| 成年人视频软件| 国产一区二区三区精彩视频 | 欧美激情一区二区三区在线视频观看| 亚洲大片一区二区三区| 美女脱光内衣内裤视频久久影院| 999国产精品一区| free性欧美hd另类精品| jizzjizz16| 国产免费高清av| 国产午夜精品久久久久久久久| 国产911在线观看| 91精品久久久久久久99蜜桃 | 99久久er热在这里只有精品15| 91超碰成人| 精品国产亚洲日本| 米奇777四色精品人人爽| 天堂网www在线网| 精品毛片在线观看| 日韩 欧美 综合| 国产一二三四五区| 青青草久久伊人| 四虎4hu永久免费入口| 成人午夜两性视频| 国内久久久精品| 亚洲精品久久在线| 欧美日韩一区二区欧美激情| 国产精品视频免费| 成人一区二区三区| 国产亚洲永久域名| 日韩免费看片| 国产毛片久久久| 欧美v亚洲v综合v国产v仙踪林| 麻豆视频在线| yw视频在线观看| 免费播放片a高清在线观看| 国产激情无码一区二区三区| 亚洲自拍偷拍区| 亚洲色图17p| 日韩在线观看免费网站| 欧美成人午夜免费视在线看片| 欧美精品在线免费观看| 91极品女神在线| 97在线视频免费观看| 亚洲欧洲视频在线| 精品国产百合女同互慰| 91.成人天堂一区| 欧美视频在线视频| 亚洲一区在线免费观看| 国产女人水真多18毛片18精品视频| 久久99精品国产.久久久久久| 亚洲国产影院| 国模大胆一区二区三区| 最新国产精品| 91精品推荐| 午夜国产精品视频免费体验区| 精品72久久久久中文字幕| 99re6热只有精品免费观看| 深夜福利一区| 天天躁日日躁成人字幕aⅴ| 天堂av一区二区三区在线播放| 精品亚洲成人| 俺要去色综合狠狠| 国产精品二区影院| 卡一卡二国产精品| jiyouzz国产精品久久| 国产精品你懂的| 精品国产999| 亚洲精品国产精品国自产在线| 亚洲女人被黑人巨大进入| 超在线视频97| 91美女片黄在线观| 亚洲欧美一区二区原创| 成年人午夜免费视频| 能看毛片的网站| 亚洲国产美女视频| 国产精品久久婷婷| 国产1区2区| 国产91福利| www在线免费观看视频| 久久久久伊人| 色喇叭免费久久综合网| 免费高清在线一区| 国产精品久久久久久久久久免费看| 婷婷久久综合九色国产成人 | 欧美日韩卡一卡二| 欧美美最猛性xxxxxx| 99久热re在线精品视频| 欧美另类一区| 国产精品视频地址| 少妇一晚三次一区二区三区| 99在线视频免费| 嫩草影院永久一二三入口| 欧美在线一卡| 欧美在线观看视频一区| 国产欧美日韩精品a在线观看| 日韩精品视频三区| 国产成人免费电影| 中文字幕在线视频一区二区三区| 免费在线观看h片| 日韩欧美伦理电影院| 免费a级毛片在线观看| 国产乱人伦丫前精品视频| 日韩精品成人一区二区三区| 亚洲免费在线观看视频| 亚洲视频视频在线| 欧美久久在线| 国产精品成人一区二区三区电影毛片| 国产精品乱码一区二区| 男女午夜网站| 成人av集中营| 日韩电影一区二区三区四区| 精品毛片网大全| 欧美激情女人20p| 国内精品视频一区二区三区| 四虎永久免费地址| 成人国产精品毛片| 国产自产自拍视频在线观看| 亚洲美女毛片| 欧美三级中文字| 国产精品一区二区三区不卡| 999精品免费视频| 午夜在线视频免费| 黄色视屏免费在线观看| 激情丁香综合| 欧美日韩国产一级二级| 成人情视频高清免费观看电影| 黑人巨大猛交丰满少妇| 天天色综合久久| 天天色天天射天天综合网| 亚洲一区黄色| 欧美在线看片a免费观看| 成人两性免费视频| 醉酒壮男gay强迫野外xx| 久久久久久国产视频 | 毛片免费不卡| 在线电影一区| 欧美一区二区三区免费在线看| 黑人巨大精品欧美一区二区小视频| 萌白酱视频在线| 校园春色影音先锋| 亚洲成av人电影| 欧美片网站yy| 少妇高潮流白浆| 国产精品永久久久久久久久久| youjizz在线播放| 日本成人在线一区| 在线精品播放av| 三级黄色片免费观看| 欧洲有码在线视频| 精品亚洲成人| 日韩精品最新网址| 丰满人妻中伦妇伦精品app| 亚洲在线视频免费|