您好我这边按照您的驱动程序重新写了数码管的驱动程序,但是还是出现了显示错误的问题。
主函数:
- #include "Config.h"
-
- #include "SMG.h"
- #include "Delay.h"
- #include "Timer.h"
- //========================================================================
- void Sys_Init(void);
- void Project_Task(void);
-
- //========================================================================
-
- //========================================================================
- // 主函数
- void main()
- {
- Sys_Init();
-
- while(1)
- {
- Project_Task();
- }
- }
-
- //========================================================================
- void Sys_Init(void)
- {
- P_SW2 |= 0x80; // 使能访问XSFR
-
- // 配置引脚
- //P10_PWM1P,冷白
- //P12_PWM2P,红色
- //P14_PWM3P,绿色
- //P16_PWM4P,蓝色
- //P17_PWM5_2,暖白
- //P33_INT1,人体
- //P34_ADC12,光敏
- //P32_INT0_ADC10,拨键
- //P30_INT4,按键1
- //P37_INT3,按键2
- //数码管
- //P13->P1
- //P15->P2
- //P54->P3
- //P11->P4
- //P31->P5
- //P36_INT2_ADC14,充电
- //P35_ADC13,电池电压
- P1M1 = BIN(00101010);
- P1M0 = BIN(11010101);
- P3M1 = BIN(01111110);
- P3M0 = BIN(00000000);
- P5M1 = BIN(00010000);
- P5M0 = BIN(00000000);
-
- P10 = 0;
- P12 = 0;
- P14 = 0;
- P16 = 0;
- P17 = 0;
-
- SMG_GPIO_Init();
- Timer0_Init();
- Timer1_Init();
- EA = 1;
- }
-
- //========================================================================
- void Project_Task(void)
- {
- display(0,0,0,0,1);
- }
复制代码
数码管驱动:
- #include "SMG.h"
-
- //数码管
- //P13->P1
- //P15->P2
- //P54->P3
- //P11->P4
- //P31->P5
- //高阻输入
- #define P0_MODE_IN_HIZ(Pin) P0M1 |= (Pin), P0M0 &= ~(Pin);
- #define P1_MODE_IN_HIZ(Pin) P1M1 |= (Pin), P1M0 &= ~(Pin);
- #define P2_MODE_IN_HIZ(Pin) P2M1 |= (Pin), P2M0 &= ~(Pin);
- #define P3_MODE_IN_HIZ(Pin) P3M1 |= (Pin), P3M0 &= ~(Pin);
- #define P4_MODE_IN_HIZ(Pin) P4M1 |= (Pin), P4M0 &= ~(Pin);
- #define P5_MODE_IN_HIZ(Pin) P5M1 |= (Pin), P5M0 &= ~(Pin);
- #define P6_MODE_IN_HIZ(Pin) P6M1 |= (Pin), P6M0 &= ~(Pin);
- #define P7_MODE_IN_HIZ(Pin) P7M1 |= (Pin), P7M0 &= ~(Pin);
- //推挽输出
- #define P0_MODE_OUT_PP(Pin) P0M1 &= ~(Pin), P0M0 |= (Pin);
- #define P1_MODE_OUT_PP(Pin) P1M1 &= ~(Pin), P1M0 |= (Pin);
- #define P2_MODE_OUT_PP(Pin) P2M1 &= ~(Pin), P2M0 |= (Pin);
- #define P3_MODE_OUT_PP(Pin) P3M1 &= ~(Pin), P3M0 |= (Pin);
- #define P4_MODE_OUT_PP(Pin) P4M1 &= ~(Pin), P4M0 |= (Pin);
- #define P5_MODE_OUT_PP(Pin) P5M1 &= ~(Pin), P5M0 |= (Pin);
- #define P6_MODE_OUT_PP(Pin) P6M1 &= ~(Pin), P6M0 |= (Pin);
- #define P7_MODE_OUT_PP(Pin) P7M1 &= ~(Pin), P7M0 |= (Pin);
- //准双向口
- #define P0_MODE_IO_PU(Pin) P0M1 &= ~(Pin), P0M0 &= ~(Pin);
- #define P1_MODE_IO_PU(Pin) P1M1 &= ~(Pin), P1M0 &= ~(Pin);
- #define P2_MODE_IO_PU(Pin) P2M1 &= ~(Pin), P2M0 &= ~(Pin);
- #define P3_MODE_IO_PU(Pin) P3M1 &= ~(Pin), P3M0 &= ~(Pin);
- #define P4_MODE_IO_PU(Pin) P4M1 &= ~(Pin), P4M0 &= ~(Pin);
- #define P5_MODE_IO_PU(Pin) P5M1 &= ~(Pin), P5M0 &= ~(Pin);
- #define P6_MODE_IO_PU(Pin) P6M1 &= ~(Pin), P6M0 &= ~(Pin);
- #define P7_MODE_IO_PU(Pin) P7M1 &= ~(Pin), P7M0 &= ~(Pin);
-
- sbit PSEG_1 = P1^3;
- sbit PSEG_2 = P1^5;
- sbit PSEG_3 = P5^4;
- sbit PSEG_4 = P1^1;
- sbit PSEG_5 = P3^1;
-
- #define PIN1_IN() P1_MODE_IN_HIZ(0x08); //把单片机IO口配置为高阻输入
- #define PIN2_IN() P1_MODE_IN_HIZ(0x20);
- #define PIN3_IN() P5_MODE_IN_HIZ(0x10);
- #define PIN4_IN() P1_MODE_IN_HIZ(0x02);
- #define PIN5_IN() P3_MODE_IN_HIZ(0x02);
-
- #define PIN1_OUT_L() P1_MODE_OUT_PP(0x08);PSEG_1 = 0; //配置为推挽输出,且拉低
- #define PIN2_OUT_L() P1_MODE_OUT_PP(0x20);PSEG_2 = 0;
- #define PIN3_OUT_L() P5_MODE_OUT_PP(0x10);PSEG_3 = 0;
- #define PIN4_OUT_L() P1_MODE_OUT_PP(0x02);PSEG_4 = 0;
- #define PIN5_OUT_L() P3_MODE_OUT_PP(0x02);PSEG_5 = 0;
-
- #define PIN1_OUT_H() P1_MODE_OUT_PP(0x08);PSEG_1 = 1; //配置为推挽输出,且拉高
- #define PIN2_OUT_H() P1_MODE_OUT_PP(0x20);PSEG_2 = 1;
- #define PIN3_OUT_H() P5_MODE_OUT_PP(0x10);PSEG_3 = 1;
- #define PIN4_OUT_H() P1_MODE_OUT_PP(0x02);PSEG_4 = 1;
- #define PIN5_OUT_H() P3_MODE_OUT_PP(0x02);PSEG_5 = 1;
-
-
- //各个LED灯珠代表的位
- //#define A1 0x00000001
- #define B1 0x00000002
- #define C1 0x00000004
- //#define D1 0x00000008
- //#define E1 0x00000010
- //#define F1 0x00000020
- //#define G1 0x00000040
-
- #define A2 0x00000080
- #define B2 0x00000100
- #define C2 0x00000200
- #define D2 0x00000400
- #define E2 0x00000800
- #define F2 0x00001000
- #define G2 0x00002000
-
- #define A3 0x00004000
- #define B3 0x00008000
- #define C3 0x00010000
- #define D3 0x00020000
- #define E3 0x00040000
- #define F3 0x00080000
- #define G3 0x00100000
-
- #define DP1 0x00200000
- #define DP2 0x00400000
- #define K1 0x00800000
- #define K2 0x01000000
-
-
- u32 xdata display_num;
-
- //第一个7段码从0~9对应的编码
- code u32 digit1[11] =
- {
- 0, //0
- B1|C1, //1
- 0, //2
- 0, //3
- 0, //4
- 0, //5
- 0, //6
- 0, //7
- 0, //8
- 0, //9
- 0, //黑 消隐
- };
-
- //第二个7段码从0~9对应的编码
- code u32 digit2[11] =
- {
- A2|B2|C2|D2|E2|F2, //0
- B2|C2, //1
- A2|B2|D2|E2|G2, //2
- A2|B2|C2|D2|G2, //3
- B2|C2|F2|G2, //4
- A2|C2|D2|F2|G2, //5
- A2|C2|D2|E2|F2|G2, //6
- A2|B2|C2, //7
- A2|B2|C2|D2|E2|F2|G2, //8
- A2|B2|C2|D2|F2|G2, //9
- 0, //黑 消隐
- };
-
- //第三个7段码从0~9对应的编码
- code u32 digit3[11] =
- {
- A3|B3|C3|D3|E3|F3, //0
- B3|C3, //1
- A3|B3|D3|E3|G3, //2
- A3|B3|C3|D3|G3, //3
- B3|C3|F3|G3, //4
- A3|C3|D3|F3|G3, //5
- A3|C3|D3|E3|F3|G3, //6
- A3|B3|C3, //7
- A3|B3|C3|D3|E3|F3|G3, //8
- A3|B3|C3|D3|F3|G3, //9
- 0, //黑 消隐
- };
- /************************************************************************************/
- void SMG_GPIO_Init(void)//初始化IO口
- {
- Set_AllPin_INPUT();
- }
- /********************************熄灭所有数码管***********************************/
- void Set_AllPin_INPUT(void)
- {
- // P11 = 1;
- // P13 = 1;
- // P15 = 1;
- // P31 = 1;
- // P54 = 1;
-
- PIN1_IN();//把单片机IO口配置为输入模式
- PIN2_IN();
- PIN3_IN();
- PIN4_IN();
- PIN5_IN();
- }
-
- void display(u16 num,bit dp_1,bit dp_2,bit KK1,bit KK2)
- {
- u8 num1,num2,num3;
- num1 = num / 100; //拆分出百位
- num2 = (num % 100) / 10; //拆分出十位
- num3 = num % 10; //拆分出个位
- display_num = digit1[num1] | digit2[num2] | digit3[num3];
- if(dp_1) display_num |= DP1; //暂未写消隐功能 可根据小数点位置和小数点前数字为零处理消隐
- if(dp_2) display_num |= DP1;
- if(KK1) display_num |= K1;
- if(KK2) display_num |= K2;
- }
-
-
- //刷数码管定时器 1000Hz 三个数码管平均333Hz
- void Timer0_Isr(void) interrupt 1
- {
- static u8 sta;
- Set_AllPin_INPUT(); //关闭数码管
- switch (sta)
- {
- case 1:
- PIN1_OUT_L();
- if(display_num & B3) PIN2_OUT_H(); //1 B3 D3 F3 G3
- if(display_num & D3) PIN3_OUT_H();
- if(display_num & F1) PIN4_OUT_H();
- if(display_num & G2) PIN5_OUT_H();
- sta++;
- break;
- case 2:
- PIN2_OUT_L();
- if(display_num & A3) PIN1_OUT_H(); //2 A3 B2 D2 E2
- if(display_num & B2) PIN3_OUT_H();
- if(display_num & D2) PIN4_OUT_H();
- if(display_num & E2) PIN5_OUT_H();
- // if(display_num & DP1) PIN1_OUT_H();
- sta++;
- break;
- case 3:
- PIN3_OUT_L();
- if(display_num & C3) PIN1_OUT_H(); //3 C3 A2 C2 F2
- if(display_num & A2) PIN2_OUT_H();
- if(display_num & C2) PIN4_OUT_H();
- if(display_num & F2) PIN5_OUT_H();
- // if(display_num & DP2) PIN1_OUT_H();
- sta++;
- break;
- case 4:
- PIN4_OUT_L();
- if(display_num & E3) PIN1_OUT_H(); //4 E3 C1 B1 G2
- if(display_num & C1) PIN2_OUT_H();
- if(display_num & B1) PIN3_OUT_H();
- if(display_num & G2) PIN5_OUT_H();
- sta++;
- break;
- case 5:
- PIN5_OUT_L();
- if(display_num & DP1) PIN1_OUT_H(); //5 DP1 DP2 K1 K2
- if(display_num & DP2) PIN4_OUT_H();
- if(display_num & K1) PIN3_OUT_H();
- if(display_num & K2) PIN2_OUT_H();
- sta = 1;
- break;
- // case 6:
- // PIN6_OUT_L();
- // if(display_num & E2) PIN3_OUT_H(); //6 E2 D3 F3
- // if(display_num & D3) PIN4_OUT_H();
- // if(display_num & F3) PIN5_OUT_H();
- // sta = 1;
- // break;
- default:
- sta = 1;
- break;
- }
- }
-
复制代码
定时器初始化函数:
- #include "Timer.h"
-
- void Timer0_Init(void) //1毫秒@24.000MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x40; //设置定时初始值
- TH0 = 0xA2; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
-
- void Timer1_Init(void) //10毫秒@24.000MHz
- {
- AUXR &= 0xBF; //定时器时钟12T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0xE0; //设置定时初始值
- TH1 = 0xB1; //设置定时初始值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- ET1 = 1; //使能定时器1中断
- }
复制代码
麻烦您帮我看一下 |