📄 text2.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 + -