无所谓的橙子 无所谓的橙子
关注数: 25 粉丝数: 89 发帖数: 639 关注贴吧数: 93
程序烧进去,怎么数码管显示一直闪烁 #include <reg51.h> #include <intrins.h> #include "XPT2046.h" //--定义使用的IO--// #define GPIO_DIG P0//数码管IO口 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; #define GPIO_KEY P1 //独立键盘用P1口 #define KEYUP_VAL0xEF//P1.4 增加 #defineKEYDOWN_VAL0xDF//P1.5 减小 const unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; static uchar DisplayData[8];//用来存放要显示的8位数的值 static unsigned int g_iPressVal;//压力数据 static unsigned int g_iSpeedVal;//速度数据 static unsigned int g_iPowerVal;//功率数据 void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } //void disp_init(void) { unsigned char i; for(i = 0;i < 8;i++) { DisplayData[i] = 0; } } // void disp_setVal(unsigned int Val) { DisplayData[0]=DIG_CODE[0]; DisplayData[1]=DIG_CODE[0]; DisplayData[2]=DIG_CODE[0]; DisplayData[3]=DIG_CODE[Val%100000/10000]; DisplayData[4]=DIG_CODE[Val%10000/1000]; DisplayData[5]=DIG_CODE[Val%1000/100]; DisplayData[6]=DIG_CODE[Val%100/10]; DisplayData[7]=DIG_CODE[Val%10/1];//最低位 } void DigDisplay(void) { unsigned char i; unsigned int j; for(i=0;i<8;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } GPIO_DIG=DisplayData[i];//发送段码 j=5; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00;//消隐 } } unsigned char Key_Scan() { unsigned char keyValue = 0 , i; //保存键值 //--检测按键--// if (GPIO_KEY != 0xFF)//检测按键否按下 { Delay10ms(1);//消除抖动 if (GPIO_KEY != 0xFF)//再次检测按键是否按下 { keyValue = GPIO_KEY; i = 0; while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开 { Delay10ms(1); i++; } } } return keyValue; //将读取到键值的值返回 } unsigned int sys_getTorque(void)//获得扭矩 { unsigned int resVal; resVal = Read_AD_Data(0x94);//AIN0 电位器模拟压力 /*原始的AD数据范围为0~4095,需要转换的在下面对resVal利用公式转换成压力*/ /*这里没有转换,相当于压力从0N~4095N*/ return resVal; } void timer_init(void) { TMOD=0X01;//设置定时器1为模式一,即16位计算模式 TH0=(65536-50000)/256;//给计数寄存器赋值,50毫秒时间 TL0=(65536-50000)%256; EA=1;//开启总中断 ET0=1;//开启定时器0中断 TR0=1;//启定定时器0 } void main(void) { unsigned char keyVal; g_iSpeedVal = 4725; disp_init(); timer_init();//定时中断初始化 while(1) { keyVal = Key_Scan(); switch(keyVal)//根据按键调节速度 { case KEYUP_VAL: g_iSpeedVal += 200; break; case KEYDOWN_VAL: if(g_iSpeedVal > 200) { g_iSpeedVal -= 200; } else { g_iSpeedVal = 0; } break; default: break; } DigDisplay();//更新显示的数据 } } void timer_task(void) { static unsigned int _clock = 0; _clock += 1; if(_clock == 50000) { _clock = 0; } switch(_clock % 10)//分配500ms任务周期 { case 0: g_iPressVal = sys_getTorque();//在这里获取扭矩的压力数据 break; case 1://计算功率 g_iPowerVal = ((unsigned long)g_iPressVal * (unsigned long)g_iSpeedVal) / 9545; break; case 2: //更新显示数据 disp_setVal(g_iPowerVal); break; default: break; } } void timer() interrupt 1 { TH0=(65536-50000)/256;//重新赋值 TL0=(65536-50000)%256; timer_task(); }
大神求助啊,程序烧进去,数码管一直在闪烁, #include <reg51.h> #include <intrins.h> #include "XPT2046.h" //--定义使用的IO--// #define GPIO_DIG P0//数码管IO口 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; #define GPIO_KEY P1 //独立键盘用P1口 #define KEYUP_VAL0xEF//P1.4 增加 #defineKEYDOWN_VAL0xDF//P1.5 减小 const unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; static uchar DisplayData[8];//用来存放要显示的8位数的值 static unsigned int g_iPressVal;//压力数据 static unsigned int g_iSpeedVal;//速度数据 static unsigned int g_iPowerVal;//功率数据 void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } //void disp_init(void) { unsigned char i; for(i = 0;i < 8;i++) { DisplayData[i] = 0; } } // void disp_setVal(unsigned int Val) { DisplayData[0]=DIG_CODE[0]; DisplayData[1]=DIG_CODE[0]; DisplayData[2]=DIG_CODE[0]; DisplayData[3]=DIG_CODE[Val%100000/10000]; DisplayData[4]=DIG_CODE[Val%10000/1000]; DisplayData[5]=DIG_CODE[Val%1000/100]; DisplayData[6]=DIG_CODE[Val%100/10]; DisplayData[7]=DIG_CODE[Val%10/1];//最低位 } void DigDisplay(void) { unsigned char i; unsigned int j; for(i=0;i<8;i++) { switch(i) //位选,选择点亮的数码管, { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } GPIO_DIG=DisplayData[i];//发送段码 j=5; //扫描间隔时间设定 while(j--); GPIO_DIG=0x00;//消隐 } } unsigned char Key_Scan() { unsigned char keyValue = 0 , i; //保存键值 //--检测按键--// if (GPIO_KEY != 0xFF)//检测按键否按下 { Delay10ms(1);//消除抖动 if (GPIO_KEY != 0xFF)//再次检测按键是否按下 { keyValue = GPIO_KEY; i = 0; while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开 { Delay10ms(1); i++; } } } return keyValue; //将读取到键值的值返回 } unsigned int sys_getTorque(void)//获得扭矩 { unsigned int resVal; resVal = Read_AD_Data(0x94);//AIN0 电位器模拟压力 /*原始的AD数据范围为0~4095,需要转换的在下面对resVal利用公式转换成压力*/ /*这里没有转换,相当于压力从0N~4095N*/ return resVal; } void timer_init(void) { TMOD=0X01;//设置定时器1为模式一,即16位计算模式 TH0=(65536-50000)/256;//给计数寄存器赋值,50毫秒时间 TL0=(65536-50000)%256; EA=1;//开启总中断 ET0=1;//开启定时器0中断 TR0=1;//启定定时器0 } void main(void) { unsigned char keyVal; g_iSpeedVal = 4725; disp_init(); timer_init();//定时中断初始化 while(1) { keyVal = Key_Scan(); switch(keyVal)//根据按键调节速度 { case KEYUP_VAL: g_iSpeedVal += 200; break; case KEYDOWN_VAL: if(g_iSpeedVal > 200) { g_iSpeedVal -= 200; } else { g_iSpeedVal = 0; } break; default: break; } DigDisplay();//更新显示的数据 } } void timer_task(void) { static unsigned int _clock = 0; _clock += 1; if(_clock == 50000) { _clock = 0; } switch(_clock % 10)//分配500ms任务周期 { case 0: g_iPressVal = sys_getTorque();//在这里获取扭矩的压力数据 break; case 1://计算功率 g_iPowerVal = ((unsigned long)g_iPressVal * (unsigned long)g_iSpeedVal) / 9545; break; case 2: //更新显示数据 disp_setVal(g_iPowerVal); break; default: break; } } void timer() interrupt 1 { TH0=(65536-50000)/256;//重新赋值 TL0=(65536-50000)%256; timer_task(); }
1 下一页