#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_VAL 0xEF //P1.4 增加
#define KEYDOWN_VAL 0xDF //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();
}
此帖出自
小平头技术问答
另外,我喜欢把数码管驱动部分放进定时器,由定时器来控制,效果更好。
一周热门 更多>