|
你這代碼就是查理復(fù)用。沙發(fā)的一次只點(diǎn)亮一個(gè)燈,亮度為你現(xiàn)在驅(qū)動(dòng)的1/4,還沒你現(xiàn)在驅(qū)動(dòng)好。
消隱后要先準(zhǔn)備數(shù)據(jù),再拉低相應(yīng)腳,使需要亮的LED同時(shí)亮。
你代碼框架不好,整理了一下。
- #include "188.h"
- #include "delay.h"
- #include "intrins.h"
- #include "stc8g.h"
- sbit PSEG_1 = P3 ^ 6;
- sbit PSEG_2 = P3 ^ 5;
- sbit PSEG_3 = P3 ^ 4;
- sbit PSEG_4 = P3 ^ 3;
- sbit PSEG_5 = P3 ^ 2;
- #define PIN1_IN() \
- P3M1 |= 0x40; \
- P3M0 &= 0xbf; // 把單片機(jī)IO口配置為高阻輸入
- #define PIN2_IN() \
- P3M1 |= 0x20; \
- P3M0 &= 0xdf;
- #define PIN3_IN() \
- P3M1 |= 0x10; \
- P3M0 &= 0xef;
- #define PIN4_IN() \
- P3M1 |= 0x08; \
- P3M0 &= 0xf7;
- #define PIN5_IN() \
- P3M1 |= 0x04; \
- P3M0 &= 0xfb;
- #define PIN1_L() \
- P3M0 |= 0x40; \
- P3M1 &= 0xbf; \
- PSEG_1 = 0; // 配置為推挽輸出,且拉低
- #define PIN2_L() \
- P3M0 |= 0x20; \
- P3M1 &= 0xdf; \
- PSEG_2 = 0;
- #define PIN3_L() \
- P3M0 |= 0x10; \
- P3M1 &= 0xef; \
- PSEG_3 = 0;
- #define PIN4_L() \
- P3M0 |= 0x08; \
- P3M1 &= 0xf7; \
- PSEG_4 = 0;
- #define PIN5_L() \
- P3M0 |= 0x04; \
- P3M1 &= 0xfb; \
- PSEG_5 = 0;
- #define PIN1_H() \
- P3M0 |= 0x40; \
- P3M1 &= 0xbf; \
- PSEG_1 = 1; // 配置為推挽輸出,且拉高
- #define PIN2_H() \
- P3M0 |= 0x20; \
- P3M1 &= 0xdf; \
- PSEG_2 = 1;
- #define PIN3_H() \
- P3M0 |= 0x10; \
- P3M1 &= 0xef; \
- PSEG_3 = 1;
- #define PIN4_H() \
- P3M0 |= 0x08; \
- P3M1 &= 0xf7; \
- PSEG_4 = 1;
- #define PIN5_H() \
- P3M0 |= 0x04; \
- P3M1 &= 0xfb; \
- PSEG_5 = 1;
- /************************************************************************************/
- void LED_GPIO_Init(void) // 初始化IO口
- {
- P3PU &= 0x83; // 關(guān)閉上拉電阻
- P3M1 &= 0x83; // 設(shè)置P3.2~P3.6為推挽輸出
- P3M0 |= 0x7c;
- }
- /********************************熄滅所有數(shù)碼管***********************************/
- void Set_AllPin_INPUT(void)
- {
- PIN1_IN(); // 把單片機(jī)IO口配置為輸入模式
- PIN2_IN();
- PIN3_IN();
- PIN4_IN();
- PIN5_IN();
- }
- unsigned short display_sram = 0;
- void Display_Scan1(void)
- {
- // PIN1_L(); // 拉低Pin1,放后面能保證4個(gè)燈同時(shí)亮
- if (display_sram & 0x8000) // 取出最高位
- PIN2_H();
- if (display_sram & 0x4000)
- PIN3_H();
- if (display_sram & 0x2000)
- PIN4_H();
- if (display_sram & 0x1000)
- PIN5_H();
- PIN1_L(); // 拉低Pin1,放后面能保證4個(gè)燈同時(shí)亮
- }
- void Display_Scan2(void)
- {
- if (display_sram & 0x0800)
- PIN1_H();
- if (display_sram & 0x0400)
- PIN3_H();
- if (display_sram & 0x0200)
- PIN4_H();
- if (display_sram & 0x0100)
- PIN5_H();
- PIN2_L(); // 拉低Pin2
- }
- void Display_Scan3(void)
- {
- if (display_sram & 0x0080)
- PIN1_H();
- if (display_sram & 0x0040)
- PIN2_H();
- ;
- if (display_sram & 0x0020)
- PIN4_H();
- if (display_sram & 0x0010)
- PIN5_H();
- PIN3_L(); // 拉低Pin3
- }
- void Display_Scan4(void)
- {
- if (display_sram & 0x0008)
- PIN1_H();
- if (display_sram & 0x0004)
- PIN2_H();
- if (display_sram & 0x0002)
- PIN3_H();
- if (display_sram & 0x0001)
- PIN5_H();
- PIN4_L(); // 拉低Pin4
- }
- unsigned short code Segment[3][11] = {
- {0x0000, 0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, // 百位
- {0x0770, 0x0420, 0x0741, 0x0661, 0x0431, 0x0271, 0x0371, 0x0460, 0x0771, 0x0671, 0x0000}, // 十位
- {0xE888, 0x8080, 0xD808, 0xD880, 0xB080, 0x7880, 0x7888, 0x8880, 0xF888, 0xF880, 0x0000} // 個(gè)位
- };
- unsigned short g_display_sram = 0;
- void Dispaly_Dig(unsigned int dig) // 拆分
- {
- unsigned char bai = dig / 100;
- unsigned char shi = (dig / 10) % 10;
- unsigned char ge = dig % 10;
- unsigned short i16 = Segment[0][bai] | Segment[1][shi] | Segment[2][ge]; // 顯示百位,十位,個(gè)位
- EA = 0;
- // 改變g_display_sram不是原子操作,所以要關(guān)中斷。
- // 增加全局變量g_display_sram,是為了盡量減少中斷的運(yùn)算量
- g_display_sram = i16;
- EA = 1;
- }
- // 定時(shí)器中斷函數(shù),5ms運(yùn)行一次,掃描一輪需要4*5ms=20ms,
- // 也就是50Hz的刷新頻率,如果感覺閃爍,可以4ms運(yùn)行。
- void TM1_Isr() interrupt 3 // 定時(shí)器1
- {
- // static unsigned short display_sram = 0;
- static unsigned char case_cnt = 0; // 逐行掃描
- Set_AllPin_INPUT(); // 消影作用
- switch (case_cnt)
- {
- case 0x00:
- Display_Scan1();
- case_cnt++;
- break;
- case 0x01:
- Display_Scan2();
- case_cnt++;
- break;
- case 0x02:
- Display_Scan3();
- case_cnt++;
- break;
- case 0x03:
- Display_Scan4();
- case_cnt = 0;
- display_sram = g_display_sram; // 僅在此處改變display_sram
- break;
- default:
- case_cnt = 0;
- break;
- }
- }
復(fù)制代碼
- /*
- 0~999循環(huán)顯示
- */
- void Dispaly_Dig_loop()
- {
- unsigned short i16 = 0;
- while (1)
- {
- Dispaly_Dig(i16++);
- if (i16 == 1000)
- i16 = 0;
- delayMs(500);
- }
- }
復(fù)制代碼
|
|