?? 打包機.txt
字號:
}
void main()
{
while(1)
{
unsigned char j;
for(j=0;j<5;j++)
{
dat[j]= ReadData7705();
}
_nop_();
}
}*/
//-------------------------讀取AD7705轉換數據函數--
//入口參數:無
//出口參數:去掉最大值和最小值后的平均值(5個數據)
//------------------------------------------------
unsigned int ReadData7705()
{
unsigned int fiter[5],fiter_d;
unsigned char read_num;
unsigned long temp;
bit sort_flag;
ad7705_ini();
for(read_num=0;read_num<5;read_num++)
{
reset_AD7705();
write_AD7705_byte(0x20);//寫通信寄存器,選擇通道1,將下一次操作設為寫時鐘寄存器
write_AD7705_byte(0x01);//寫時鐘寄存器,不分頻,更新頻率25Hz
write_AD7705_byte(0x10);//寫通信寄存器,選擇通道1
write_AD7705_byte(0x3e);//寫設置寄存器4,單極性,非緩沖模式,清除濾波器同步,不啟動對1通道的自校準
while(ad7705_rdy); //等待轉換結束
write_AD7705_byte(0x38);//寫通信寄存器,下一次操作為讀數據寄存器
fiter[read_num]= read_AD7705_word();
}
sort_flag = 1;//排序程序
while( sort_flag )
{
unsigned char i;
sort_flag = 0;
for( i=0; i<4; i++ )
{
if( fiter[i] > fiter[i+1] )
{
fiter_d = fiter[i];
sort_flag = 1;
}
}
}
temp=((unsigned long)fiter[1]+fiter[2]+fiter[3])/3;
fiter_d=(unsigned int) temp;
return fiter_d;
}
//-------------------------------------------
//函數:reset_AD7705
//功能:AD7705串行接口失步后將其復位。復位后要延時500us再訪問
//-------------------------------------------
void reset_AD7705()
{
unsigned char i;
ad7705_din=1;
for( i=0; i<36; i++ )
{
ad7705_clk=0;
ad7705_clk=1;
}
}
//------------------------------------------
//函數:write_AD7705_byte
//功能:往AD7705寫8位數據
//------------------------------------------
void write_AD7705_byte(unsigned char wr_dat)
{
unsigned char i;
for(i=0; i<8;i++)
{
ad7705_clk=0;
ad7705_din=(bit)(wr_dat&0x80);
ad7705_clk=1;
wr_dat=wr_dat<<1;
}
}
//------------------------------------------
//函數:read_AD7705_word
//功能:從AD7705讀一個字的數據,共16bit
//------------------------------------------
unsigned int read_AD7705_word()
{
unsigned int read_dat=0;
unsigned char i;
for(i=0;i<16;i++)
{
read_dat=read_dat<<1;
ad7705_clk=0;
if(ad7705_dout)read_dat++;
ad7705_clk=1;
}
return read_dat;
}
//------------------------------------------
//函數:AD7705_ini
//功能:AD7705初始化
//------------------------------------------
void ad7705_ini()
{
reset_AD7705();
write_AD7705_byte(0x20);//寫通信寄存器,選擇通道1,將下一次操作設為寫時鐘寄存器
write_AD7705_byte(0x01);//寫時鐘寄存器,不分頻,更新頻率25Hz
write_AD7705_byte(0x10);//寫通信寄存器,選擇通道1
write_AD7705_byte(0x7e);//寫設置寄存器4,單極性,非緩沖模式,清除濾波器同步,啟動對1通道的自校準
}
void key_main (volatile unsigned char Key)
{
EX0 = 0;
EA = 0;
switch (Key)
{
case key_set:
pkey_set();
key_press=0;
break;
case key_sw0:
pkey_sw0();
key_press=0;
break;
case key_aim:
pkey_aim();
key_press=0;
break;
default:
break;
}
EX0 = 1;
}
void ZLG7289Tdis_f(unsigned char f_num)
{
ZLG7289T_Hide(0xff);
ZLG7289T_Download(0, 0, 0, 0x0a);
ZLG7289T_Download(0, 5, 0, 0x0a);
}
void ZLG7289dis_f(unsigned char f_num)
{
ZLG7289_Hide(0xff);
ZLG7289_Download(0, 0, 0, 0x0a);
ZLG7289_Download(0, 5, 0, 0x0a);
}
array_l(unsigned char num,unsigned char start_num,unsigned char dat)
{
unsigned char data i;
for(i=num;i>0;i--)
{
dis_6[start_num+i-1]=dis_6[start_num+i-2];
}
dis_6[start_num]=dat;
}
unsigned char pkey_l(unsigned char num,unsigned char start_num)
{
unsigned char data aim_over;
switch (Key)
{
case key_ok:
aim_over=0x01;
break;
case key_back:
aim_over=0x02;
break;
case key_set:
aim_over=0x04;
break;
default:
aim_over=0x00;
break;
}
return aim_over;
}
void pkey_aim()
{
unsigned char data keysgn_aim=0;
bit ok_back=1;
Read_N_Bytes(dis_6,ZLG7289T_N,pack_2402);
ZLG7289dis_f(l_aim);
while(!keysgn_aim|ok_back)
{
Key = ZLG7289_Key();
keysgn_aim=pkey_l(l_num,0);
switch (keysgn_aim)
{
case 1:
ok_back=0;
Write_A_Page(dis_6,ZLG7289T_N,pack_2402);
break;
case 2:
ok_back=0;
break;
case 3:
ZLG7289T_dissapear( ZLG7289_N,l_num,dis_6,1);
ok_back=1;
break;
default:
break;
}
}
}
void pkey_sw0()
{
unsigned char data i;
bit sw0_over=1;
for(i=0;i<6;i++)
{
dis_6[i]=0;
}
ZLG7289_dissapear( ZLG7289_N,dis_6);
ZLG7289Tdis_f(l_sw0);
while(sw0_over)
{
Key = ZLG7289_Key();
Delay(20);
switch (Key)
{
unsigned char data ad7730_dat8[2];
unsigned int data ad7730_dat;
case key_ok:
ad7730_dat8[1]=ad7730_dat>>8;
Write_A_Page(ad7730_dat8,2,sw0Ah_2402);
sw0_over=0;
break;
case key_back:
sw0_over=0;
break;
default:
sw0_over=1;
break;
}
}
}
void pkey_sw1()
{
unsigned char data loop ,keysgn_sw1=0;
bit ok_back=1;
for(loop=0;loop<6;loop++)
{
dis_6[loop]=0;
}
ZLG7289_dissapear( ZLG7289_N,dis_6);
ZLG7289Tdis_f(l_sw1);
while(!keysgn_sw1|ok_back)
{
Key = ZLG7289_Key();
Delay(20);
keysgn_sw1=pkey_l(ZLG7289_N,0);
switch (keysgn_sw1)
{
unsigned char data ad7730_dat8[2];
unsigned int ad7730_dat;
case 1:
ok_back=0;
ad7730_dat8[1]=ad7730_dat>>8;
Write_A_Page(ad7730_dat8,2,sw1Ah_2402);
break;
case 2:
ok_back=0;
break;
case 3:
ZLG7289_dissapear( ZLG7289_N,dis_6);
ok_back=1;
break;
default:
break;
}
}
}
void pkey_setdis(unsigned char file_n)
{
unsigned char idata loop;
for(loop=0;loop<6;loop++){dis_6[loop]=0;}
if(file_n==4)
{
Read_N_Bytes(dis_6,2,big_2402);
ZLG7289_dissapear( ZLG7289_N,dis_6);
ZLG7289Tdis_f(file_n);
}
if(file_n==5)
{
dis_6[0]=Read_One_Byte(point_2402);
ZLG7289_dissapear( ZLG7289_N,dis_6);
ZLG7289Tdis_f(file_n);
}
}
void pkey_set()
{
while(!keysgn_set|ok_back)
{
unsigned char idata led_num,led_start,addr2402;
bit one_two;
Key = ZLG7289_Key();
Delay(20);
switch (file_n)
{
case 4:
led_num=0x02;
led_start=0x00;
addr2402=big_2402;
one_two=0;
break;
case 5:
led_num=0x01;
led_start=0x00;
addr2402=point_2402;
one_two=0;
break;
}
keysgn_set=pkey_l(led_num,led_start);
switch (keysgn_set)
{
case 1:
ok_back=0;
if(file_n==6)
{
dis_6[point]&=0x7f;
}
Write_A_Page(dis_6,led_num,addr2402);
break;
case 2:
ok_back=0;
break;
case 3:
if(file_n==5)
{
if(dis_6[0]>point_max)dis_6[0]=0;
}
break;
case 4:
file_n++;
if(file_n>7)file_n=4;
ok_back=1;
pkey_setdis(file_n);
break;
default:
break;
}
}
}
/*宏定義:ZLG7289_ShortDelay()
功能:短延時
說明:延時(ZLG7289_Delay_t*2+2)個機器周期*/
#define ZLG7289_ShortDelay() {unsigned char t = ZLG7289_Delay_t;while ( --t != 0 );}
/*宏定義:ZLG7289_LongDelay()
功能:長延時
說明:延時(ZLG7289_Delay_t*12+8)個機器周期*/
#define ZLG7289_LongDelay() {unsigned char t = ZLG7289_Delay_t * 6;while ( --t != 0 );}
/*
函數:ZLG7289_SPI_Write()
功能:向SPI 總線寫入1 個字節的數據
參數:
dat:要寫入的數據
*/
void ZLG7289_SPI_Write(char dat) reentrant
{
unsigned char data t = 8;
do
{
ZLG7289_pinDIO = (bit)(dat & 0x80);
dat <<= 1;
ZLG7289_pinCLK = 1;
ZLG7289_ShortDelay();
ZLG7289_pinCLK = 0;
ZLG7289_ShortDelay();
} while ( --t != 0 );
}
/*函數:ZLG7289_SPI_Read()
功能:從SPI 總線讀取1 個字節的數據
返回:
讀取到的數據*/
char ZLG7289_SPI_Read() reentrant
{
char data dat;
unsigned char data t = 8;
ZLG7289_pinDIO = 1; //讀取數據之前DIO 引腳要置1 以切換到輸入狀態
do
{
ZLG7289_pinCLK = 1;
ZLG7289_ShortDelay();
dat <<= 1;
if ( ZLG7289_pinDIO ) dat++;
ZLG7289_pinCLK = 0;
ZLG7289_ShortDelay();
} while ( --t != 0 );
return dat;
}
/*
函數:ZLG7289_cmd()
功能:執行ZLG7289 純指令
參數:
cmd:命令字
*/
void ZLG7289_cmd(char cmd)
{
char data sav = IE;
IE &= 0xFA; //關閉外部中斷
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
IE = sav; //恢復IE
}
/*
函數:ZLG7289_cmd_dat()
功能:執行ZLG7289 帶數據指令
參數:
cmd:命令字
dat:數據
*/
void ZLG7289_cmd_dat(char cmd, char dat)
{
char data sav = IE;
IE &= 0xFA; //關閉外部中斷
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_LongDelay();
ZLG7289_SPI_Write(dat);
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
IE = sav; //恢復IE
}
/*
函數:ZLG7289_Download()
功能:下載數據
參數:
mod=0:下載數據且按方式0 譯碼
mod=1:下載數據且按方式1 譯碼
mod=2:下載數據但不譯碼
x:數碼管編號(橫坐標),取值0~7
dp=0:小數點不亮
dp=1:小數點亮
dat:要顯示的數據
說明:
譯碼方式的具體含義請參考數據手冊
*/
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat)
{
code char ModDat[3] = {0x80,0xC8,0x90};
char data d1;
char data d2;
if ( mod > 2 ) mod = 2;
d1 = ModDat[mod];
x &= 0x07;
d1 |= x;
d2 = dat & 0x7F;
if ( dp ) d2 |= 0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*
功能:執行ZLG7289 鍵盤命令
返回:
返回讀到的按鍵值:0~63
如果返回0xFF 則表示沒有鍵按下
*/
char ZLG7289_Key() reentrant
{
char data key;
ZLG7289_pinCS = 0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(0x15);
ZLG7289_LongDelay();
key = ZLG7289_SPI_Read();
ZLG7289_pinCS = 1;
ZLG7289_LongDelay();
return key;
}
/*
函數:ZLG7289_Init()
功能:ZLG7289 初始化
參數:
t:SPI 總線的延時值設置,取值1-40(超出范圍可能導致錯誤)
說明:
t的取值可以參照以下公式:t >= 5 * f1 / f2,其中f1 表示80C51 的
晶振頻率,f2 表示ZLG7289 的晶振頻率
*/
void ZLG7289_Init()
{
//I/O 口初始化
ZLG7289_pinCS = 1;
ZLG7289_pinCLK = 0;
ZLG7289_pinDIO = 1;
ZLG7289_pinINT = 1;
}
/*
函數:dis( unsigned char r,unsigned char num,unsigned char *pdis)
功能:數碼管的常規顯示
參數:num:數碼管顯示的位數
*pdis:數碼管組顯示的數字指針
*/
void ZLG7289_dis( unsigned char num,unsigned char *pdis)
{
unsigned char bdata i,dat;
bit dp;
for (i=num;i>0; i--)
{
dat=pdis[num-i];
dp=(bit)(dat&0x80); //最高位為小數點位
ZLG7289_Download(0,num-i,dp,dat);
}
}
/*
函數:dis( unsigned char r,unsigned char num,unsigned char *pdis)
功能:數碼管消隱顯示
參數:num:數碼管顯示的位數
*pdis:數碼管組顯示的數字指針
*/
void ZLG7289_dissapear(unsigned char num,unsigned char *pdis)
{
unsigned int bdata dis_x=0xff;//消隱控制位
unsigned char data i=num-1,dis_num=num;
dis_x=_iror_(dis_x,8-num);
while((pdis[i]==0)&(i!=0))
{
dis_x=_iror_(dis_x,1);
dis_num--;
i--;
}
i=dis_x;
ZLG7289_Hide(i);
ZLG7289_dis( 6,pdis);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -