⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text2.c

📁 基于Keil C平台的单片机源程序
💻 C
字号:
//*****添加头文件
#include<at89x52.h>
#include<absacc.h>


//***宏定义*****
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//*****键盘显示器控制7279I/O定义******
#define KLCS P2_0            //key and led
#define KLCLK P2_1
#define KLDAT P2_2
#define KLKEY P2_3
//*****D/A端口定义*****
#define DADIN P1_0
#define DACLR P1_1
#define DACLK P1_2
#define DACS P1_3
//*****A/D端口定义*****
#define ADCLK P1_4
#define ADCS P1_5
#define ADDOUT P1_6
//******HD7279A指令******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
//***键盘按键功能定义***
#define F1 //888888888888888888888888
#define F2 //888888888888888888888888
#define UP //888888888888888888888888
#define DOWN //8888888888888
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


//***函数定义***
//&&&&&延时函数&&&&&&&
void delay(void);
void long_delay(void);
void short_delay(void);
void delay10ms(unsigned char);
//&&&&&&&&7279函数&&&&&&&&&&&&&&&&&&&&&&
void write7279(unsigned char,unsigned char);  //向7279传数据
unsigned char read7279(unsigned char);        //从7279读数据
void send_byte(unsigned char);                //发送一个字节
unsigned char receive_byte(void);             //接收一个字节
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
uint setcount(void);    //接受键盘输入并返回输入初值
uint setstep(void);    //设置步进值
uint upcount(void);     //步进递增
uint downcount(void);   //步进递减
uint readnum(void);     //读取键盘输入数字量
//&&&&&D/A函数&&&&&&&&&&&&
void dabit(uint);  //D/A传输函数
void LED0(uint);  //低四位LED显示
void LED1(uint);  //高四位LED显示
uint readnum(void); //读键盘输入数值
uint bcd(uint);  //4位16进制转BCD码

//****定义全局变量******

uchar key_number;
uint tmr;
ulong wait_time;
uint count;  //计数值
uint countstep; //步进值
uint recount;  //A/D返回值


//88888888888888888888888888888888888888888888888888888
main()
{
uchar j;
uchar adflag;  //A/D转换结束标志
uchar admsb;   //A/D高位检测标志
j=0;


//***欢迎界面开机复位***
for(tmr=0;tmr<0x2000;tmr++);//上电延迟
send_byte(CMD_RESET); //复位7279

//***欢迎界面***
send_byte(CMD_TEST);
 for(j=0;j<1;j++)
	{
	delay10ms(100);
	}

send_byte(CMD_RESET);

//***循环显示全亮进行欢迎***
write7279(UNDECODE+7,0xff);
delay10ms(50);
for(j=0;j<7;j++)
  {
  send_byte(RTR_CYCLE);  //循环右移7次
  delay10ms(12);
  }
send_byte(CMD_RESET);


//操作开始
count=0x0000;
countstep=2;
key_number=0xff;
wait_time=0;

while(1)
{

//***扫描键盘***
	do
	{
		if(!KLKEY)//如果有按键按下
		{
		key_number=read7279(CMD_READ);
			switch(key_number)
			{
			case 24 : 
			  count=setcount();
			  break;
			case 0 :
		      countstep=setstep();
			  break;
			case 16 : 
			  count=upcount();
			  break;
			case 8 : 
			  count=downcount();
			  break;
			default :
			  count=0;
			  break;
			}
		while(!KLKEY);  //等待放开按键
		wait_time=0;
		}
		wait_time++;
	}while(wait_time<0x30000&&key_number!=24&&key_number!=0&&key_number!=16&&key_number!=8);

//理论值显示
LED0(count/2);


//输出给D/A
DACLR=1;
DACS=1;
DACLK=1;

//延迟等待后级电路处理
for(j=0;j<2;j++)
{
delay10ms(50);
}   

//读取A/D数值
ADCS=1;
delay();
adflag=0;
//待查询ADOUT是否为高电平,考察转换是否结束
while(!adflag)
{
	if(ADDOUT==1)
	{
	long_delay();
      if(ADDOUT==1)
      {
      adflag=1; //转换结束标志
      }
   	}
delay();
}

ADCLK=1;
delay();
//取最高位1信号
ADCLK=0;
admsb=ADDOUT;

ADCLK=1;
delay();
if(admsb==1)   //以DOUT第一位来检测是否正常,若否则recount输出0xfff     //???如果有时正常有时不正常则可修改此句
{
//输出转换后数据
	for(j=0;j<12;j++)
	{
	ADCLK=0;
	delay();
    recount=recount*2;
     if(ADDOUT)
     {recount=recount|0x0001;}
    ADCLK=1;
    delay(); 
	}
recount=recount&0x0fff; //取低12位,屏蔽高四位
}
else recount = 0xffff;

//输出值显示
LED1(recount);

}
}



//***********函数定义**************
void write7279(unsigned char cmd,unsigned char dta)
{
   send_byte(cmd);
   send_byte(dta);
}

unsigned char read7279(unsigned char command)
{
   send_byte(command);
   return(receive_byte());
}

void send_byte(unsigned char out_byte)
{
   unsigned char i;
   KLCS=0;
   long_delay();    
   for(i=0;i<8;i++)
	{
		if(out_byte&0x80)
		{
		KLDAT=1;
		}
		else
		{
		KLDAT=0;
		}
		KLCLK=1;
		short_delay();
		KLCLK=0;
		short_delay();
		out_byte=out_byte*2;
	}
	KLDAT=0;
}


unsigned char receive_byte(void)
{
	unsigned char i,in_byte;
	KLDAT=1;
	long_delay();
	for(i=0;i<8;i++)
	{
		KLCLK=1;
		short_delay();
		in_byte=in_byte*2;
			if(KLDAT)
			{
			in_byte=in_byte|0x01;
			}
		KLCLK=0;
		short_delay();
	}
	KLDAT=0;
	return(in_byte);
}


void long_delay(void)
{
unsigned char i;
for(i=0;i<0x30;i++);
}

void short_delay(void)
{
unsigned char i;
for(i=0;i<8;i++);
}


void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
	for(i=0;i<time;i++)
	{
		for(j=0;j<0x390;j++)
		{
			if(!KLKEY)                         ///????????????????????需要修改
			{
			//key_int();
			}
		}
	}
}


void delay(void)
{
unsigned char i,j;
for(i=0;i<0xff;i++);
for(j=0;j<0x2f;j++);
}


void dabit(uint a)
{
uchar i;
uint b;
	for(i=0;i<16;i++)
	{
	b=a&0x8000;
    if(b==0x8000)
	  DADIN=1;
	else DADIN=0;
	DACLK=1;
	short_delay();
	DACLK=0;
	short_delay();
	a=a<<1;
	}
}


uint upcount(void)
{
uint tscount;
tscount=count+countstep;
if(tscount<0x0fff)   //记数最大值位4094,使输出电流最大为2047mA
  {
  return(tscount);
  }
else return(0x0ffe);
}


uint downcount(void)
{
if(count > countstep)
  {
  return(count-countstep);
  }
else return(0x0000);
}

uint setcount(void)
{
uint var1;
var1=readnum();
if(var1>=0&&var1<=0x07ff)    //置初值范围为0~2047
{return(var1*2);}
else return(0x0ffe);    //输出4094,对应电流为2047mA
}


uint setstep(void)
{
uint var2;
var2=readnum();
if(var2>=0&&var2<=0x03e8)    //步进<1000mA
  {
  return(var2*2);
  }
else return(2); 
}


uint readnum(void)
{
uint finalval;
uchar keynum;
ulong readwait;
uchar keyvalue[4]; //键盘所代表的数值
uchar k;  //按键次数标记
uchar i=0;
//***输入等待,闪烁显示下划线***
write7279(BLINKCTL,0x00);
	for(i=0;i<4;i++)
	{
	write7279(UNDECODE+i,0x08);
	}

k=0;
readwait=0;
keynum=0xff;
finalval=0x0000;  //最终输出值置0;
do
{
	if(!KLKEY)
	{
	keynum=read7279(CMD_READ);
    switch(keynum)
		{
		case 27 :keyvalue[k]=1;break;
		case 19 :keyvalue[k]=2;break;
		case 11 :keyvalue[k]=3;break;
	   	case 3  :keyvalue[k]=4;break;
		case 26 :keyvalue[k]=5;break;
		case 18 :keyvalue[k]=6;break;
		case 10 :keyvalue[k]=7;break;
		case 2  :keyvalue[k]=8;break;
		case 17 :keyvalue[k]=9;break;
		case 9  :keyvalue[k]=0;break;
		default :keyvalue[k]=0x0f;break;
		}
	write7279(DECODE1+3-k,keyvalue[k]);
		if(keyvalue[k]!=0x0f)
		{
	    finalval=finalval*10+keyvalue[k];
		k++;
		}
    while(!KLKEY);
	readwait=0;
   	}
readwait++;
}while(readwait<0x30000&&k<4&&keynum!=0x00);   //0健表示确认

write7279(BLINKCTL,0xff);  //输入完成去闪烁

LED0(finalval);           //确认后完整输出显示

return(finalval);

}


uint bcd(uint hx)
{
uint bcdnum=0xffff;  //输出bcd码
uint quotient;   //商
uint remainder;  //余数
uint A; 
A=hx;
if(A>=0&&A<=9999)
	{
	quotient=A/1000;
    remainder=A%1000;
    bcdnum=(quotient&0x000f)<<12;
       if(remainder!=0)
			{
			quotient=remainder/100;
            remainder=remainder%100;				
            bcdnum=bcdnum|(quotient&0x000f)<<8;
               if(remainder != 0)
                   {
                   quotient=remainder/10;
                   remainder=remainder%10;
      			   bcdnum=bcdnum|(quotient&0x000f)<<4;
                       if(remainder != 0)
                          {
                          bcdnum=bcdnum|remainder&0x000f;
						  }
                   }
			}
    }
return(bcdnum);

}


void LED0(uint a)    //低四位LED显示
{
uint A;
uchar i,var;
A=bcd(a);
for(i=0;i<4;i++)
	{
	var=A&0x000f;
	write7279(DECODE1+i,var);
	A=A/16;
	}
}

void LED1(uint a)    //高四位LED显示
{
uint A;
uchar i,var;
A=bcd(a);
for(i=4;i<8;i++)
    {
    var=A&0x000f;
	write7279(DECODE1+i,var);
	A=A/16;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -