?? caiji.c
字號:
/*往上位機中傳輸數據時,只傳原始數據。
采集上來的原始數據存放在0XF0~0XF2中,
0XF0為高位,0XF1為低位,0XF2為符號位。
處理后的數據存放在0XE0~0XE9 10個單元中,為原碼的BCD碼,符號位在0XEA中。 */
#include <AT89X52.H>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define PA_8255 XBYTE[0x00FF] //8255_PA
#define PB_8255 XBYTE[0x80ff] //8255_PB
#define PC_8255 XBYTE[0x40ff] //8255_PC
#define CON_8255 XBYTE[0xDFFF] //8255_CON
#define CON4052 P3_2 //4052使能端
#define key_cy P2_5 //采樣開關
/************全局變量定義**************/
uchar int_flag; //中斷標志
uchar ExpectData[10]; //計算結果存儲區
uint XmtDat[5]; //顯示緩存
/*************函數說明********************/
void Send_Byte(uchar byte);
void Send_Data(void);
void Clear_Lcd(void); //清空LCD
void Init_Lcd(void); //LCD初始化
void Init(void); //系統初始化
void Init_232(void); //232初始化
void delay(uint i); //延時
void delay10ms(void); //延時程序10ms
void delay10us(void); //延時10us
uchar shift(uchar); //移位程序
void Hex_Bcd(ulong Hex,uchar *); //hex 2 bcd
key_press(void); //檢測鍵盤子程序
void Caculate(void); //計算
void PC_232(void); //232傳輸程序
void display(void); //顯示
/************************************************/
/***********LCD顯示子程序***************/
//#define DIPIN 0x01 //P1.0-->DI
//#define CLKPIN 0x02 //P1.1-->CLK
//各段
#define a 0x04
#define b 0x08
#define c 0x40
#define d 0x20
#define e 0x10
#define f 0x02
#define g 0x01
#define h 0x80
void Clear_Lcd(void);
uchar Digit[10]={ a+b+c+d+e+f, //0
b+c, //1
a+b+d+e+g, //2
a+b+c+d+g, //3
b+c+f+g, //4
a+c+d+f+g, //5
a+c+d+e+f+g, //6
a+b+c, //7
a+b+c+d+e+f+g, //8
a+b+c+d+f+g //9
};
uchar Hello[5]={ //顯示'Hello'
b+c+e+f+g,
a+d+e+f+g,
d+e+f,
d+e+f,
a+b+c+d+e+f};
uchar zero[5]={
a+b+c+d+e+f,
a+b+c+d+e+f,
a+b+c+d+e+f,
a+b+c+d+e+f,
a+b+c+d+e+f,
};
uchar Over[5]={ //顯示'-OVER'
g,
a+b+c+d+e+f,
b+c+d+e+f,
a+d+e+f+g,
a+b+c+f+e+g
};
//-----------------------------------
//清空LCD顯示
//----------------------------------
void Clear_Lcd(void)
{
uchar i;
for(i=0;i<5;i++)
{
Send_Byte(0xff);
}
delay10us();
//return (0);
}
void Init_Lcd(void)
{
P1_0|=1; //P1.0 out
P1_1|=1; //P1.1 out
Clear_Lcd();
}
void delay(uint i) //延時
{
uint j,k;
for(j=0;j<i;j++)
for(k=0;k<150;k++);
}
void delay10us(void) //延時10us
{
uchar k;
for(k=0;k<3;k++){};
return;
}
//--------------------------------------------------
//發送一字節數據
//--------------------------------------------------
void Send_Byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if((byte&0x01)==0x01)
P1_0=1; //假如此位是1,P1.0 set 1
else
P1_0=0; //假如 0,P1.0 reset 0
P1_1=1; //P1.1 SET 1
_nop_;
P1_1=0; //P1.1 RESET 0
_nop_();
P1_1=1;
_nop_();
byte=byte>>1; //SHIFT
}
}
//----------------------------------
//發送一批數據
//----------------------------------
void Send_Data(void)
{
uchar i;
Clear_Lcd();
for(i=0;i<5;i++)
{
Send_Byte(XmtDat[i]);
}
delay10us();
}
//----------------------------------
void display(void) //顯示
{
uchar i;
uchar temp;
//uint pp; //需要顯示的第一位地址為0xe3
_nop_();
//pp=0xE3;
if(DBYTE[0xE2]==0x00&&DBYTE[0xE1]==0x00&&DBYTE[0xE0]==0x00){
//for(i=1;i<5;i++){
XmtDat[1]=~(Digit[DBYTE[0XE3]]&0xff);
XmtDat[2]=~(Digit[DBYTE[0XE4]]&0xff);
XmtDat[3]=~(Digit[DBYTE[0XE5]]&0xff);
XmtDat[4]=~(Digit[DBYTE[0XE6]]&0xff);
//pp++;
//}
if(DBYTE[0xEA]==0x00)XmtDat[0]=0xff;
else XmtDat[0]=~(Over[0]&0xff);
Send_Data();
delay(20);
}
else{
for(i=0;i<5;i++)
XmtDat[i]=~(Over[i]&0xff); //Display "-over"
Send_Data();
delay(20);
return;
} //是否顯示溢出?
}
//-----------------------------------------
/*****************************************/
uchar shift(uchar dat)
{
dat=(dat>>4)|(dat<<4);
dat=((dat&0xcc)>>2)|((dat&0x33)<<2);
dat=((dat&0xaa)>>1)|((dat&0x55)<<1);
return dat;
}
void Hex_Bcd(ulong Hex,uchar *ExpectData)
{
ulong data va;
uchar data i;
uchar idata DivBcd[10];
va=1000000000;
for(i=9;i;i--)
{
DivBcd[i]=0;
while ((Hex>=va)&&(va>9))
{
Hex-=va;
DivBcd[i]++;
}
va/=10;
}
DivBcd[0]=Hex;
for(i=0;i<10;i++) ExpectData[i]=DivBcd[9-i];
}
////////////////////////////////////////////
void Init(void){
CON_8255=0x9B; //PA,PB,PC為輸入
key_cy=1;
EA=0; //disable interrupt
EX1=1; //enable interrupt1
IT1=1; //邊沿觸發
EX0=0;
TMOD=0x20; //定時器T1 方式2
TH1=0xfd;TL1=0xfd; //波特率9600
PCON&=0x00; //SMOD=0
SCON=0x50; //串行口工作在方式1,并允許接收
TR1=1; //啟動T1
ES=0; //中斷0關閉
}
void delay10ms(void){ //延時程序10ms
uchar i;
for(i=0;i<200;i++){}
}
key_press(void){ //檢測鍵盤子程序
if(key_cy==0) delay10ms(); //延時10ms
if(key_cy==0){
delay10ms(); //延時10ms
return 1;
}
else
return 0;
}
void scom(void){ //232傳輸程序
uchar idata buf[4];
uchar i;
int ain;
buf[0]=DBYTE[0xF0];
buf[1]=DBYTE[0xF1];
buf[2]=DBYTE[0xF2];
buf[3]=DBYTE[0xF3];
if(RI==1)
{ain=SBUF;
RI=0;
SBUF=ain;
while(TI==0);TI=0;
}
for(i=0;i<4;i++)
{SBUF=buf[i];
while(TI==0);TI=0;
}
_nop_();
}//232傳輸
void Int1()interrupt 2 using 2{ //外部中斷1
////////////////////////
ulong shuju;
uchar i;
uchar j=0xE0; //BCD碼的結果保存到以0xE0
uchar fuhao; //開始的10個單元中
////////////////////////
EA=0; //關閉中斷
CON4052=1; //關閉4052輸入
/************從8255中讀取數據******************/
DBYTE[0xF0]=0x00;
DBYTE[0xF1]=0x00;
DBYTE[0xF2]=0x00;
DBYTE[0xF3]=0x00;
DBYTE[0xF2]=PA_8255; //符號位
DBYTE[0xF2]=shift(DBYTE[0xF2]);
DBYTE[0xF0]=PB_8255; //高位
DBYTE[0xF0]=shift(DBYTE[0xF0]);
DBYTE[0xF1]=PC_8255; //低位
DBYTE[0xF1]=shift(DBYTE[0xF1]);
int_flag=1; //中斷標志置位
//EA=1; //開中斷
//CON4052=0; //打開4052
_nop_();
//scom();
_nop_();
////////////////////////////////////////////
for(i=0;i<11;i++,j++)
DBYTE[j]=0x00;
j=0xE0;
shuju=DWORD[0x78]; //因為是字,所以為0XE0/2=0X78
fuhao=DBYTE[0xF2];
if((fuhao>0x00)&&(fuhao<0x0f)) return;//如果符號位不正確,退出計算
DBYTE[0xEA]=DBYTE[0xF2]; //符號位保存在0xEA中
if((fuhao>0x0f)&&(fuhao<=0xFf))shuju=0X0000FFFF&(~(shuju-1)); //求補碼
shuju*=248;
Hex_Bcd(shuju,ExpectData); //結果的轉換
for(i=0;i<10;i++,j++)
DBYTE[j]=ExpectData[i]; //把結果存儲到緩沖區中
_nop_();
////////////////////////////////////////////
// Caculate();
display();
scom();
// EA=1; //開中斷
CON4052=1;
}
/************************************************/
void main(void)
{
uchar i;
Init_Lcd(); //LCD初始化
Init(); //系統初始化
for(i=0;i<5;i++)
XmtDat[i]=~(Hello[i]&0xff); //Display "Hello"
Send_Data();
delay(1000);
for(i=0;i<5;i++)
XmtDat[i]=~(zero[i]&0xff); //Display "00000"
Send_Data();
int_flag=0;
CON4052=0; //打開4052
_nop_();
DBYTE[0xF3]=0x00;
//EA=1;
//while(1)
//{
// if(!P2_5)scom();
//}
while(1)
{
if(!P2_5)
{
delay10ms();
if(!P2_5) EA=1; //開中斷.開CD4052
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -