?? ps._c
字號:
//***************************FileName:PS.C*************************//
//***************************ICCAVR6.30編譯************************//
//**************************MMI Firmware 1.0***********************//
//**************************Last Update:2005-3*********************//
#include <io8535v.h> //AT90S8535單片機寄存器定義
#include <macros.h> //宏
#include "Encode.h" //PS/2鍵盤譯碼表
#include "ZIMO.H" //LCD字模表
#define uchar unsigned char //數據類型說明
#define uint unsigned int //數據類型說明
uchar Row=0; //LCD當前行位置計數器
uchar Column=0; //LCD當前列位置計數器
uchar R_flag=0; //LCD換行標志;
uchar Int_Number; //中斷計數器;
uchar Key_Value; //鍵盤編碼值;
uchar Key_Up; //鍵盤被釋放標志;
uchar Byte_Flag; //鍵盤編碼接收完成標志;
uchar Status=0; //定義系統狀態0:登陸,1:選擇
uint Voltage_A //定義A點電壓采樣值
uint Voltage_B //定義B點電壓采樣值
uint Voltage_Diff; //定義AB點電壓采樣差之絕對值
uchar V_Flag; //定義AB點電壓差符號標志
uchar A_Data[3]; //定義A點電壓處理值
uchar B_Data[3]; //定義B點電壓處理值
uchar AB_Data[3]; //定義AB點電壓差處理值
uchar RE_Password[6]; //輸入密碼記錄
uchar Password[6]={2,0,0,5,0,3};//系統初試密碼:200503
//***************************延時函數**********************//
void DelayMs(uint time)
{uint temp;
for(;time!=0;time--)
for(temp=2000;temp!=0;temp--) ;
}
//***************************延時函數**********************//
void DelayUs(uchar time)
{uchar temp;
for(;time!=0;time--)
NOP();
}
//***************************AT90S8535 I/O口初始化*********//
void Init_IO(void)
{DDRA=0x00;
PORTA=0x00;
DDRB=0xff;
PORTB=0xff;
DDRC=0xff;
PORTC=0xff;
DDRD=0x80;
PORTD=0x80;
}
//***************************A/D轉換初始化函數*************//
void Init_ADC(void)
{ADMUX=0x00;
ADCSR=0xe6;
}
//***************************A/D轉換采樣電壓值*************//
//參數說明:
//Channel:0 A點電壓采樣;1:B點電壓采樣;2:A、B電壓差值
//返回值:電壓采樣值或者A、B點采樣差值
uint ADC_Convert(uchar Channel)
{uint temp1,temp2;
if(Channel!=2)
{ADMUX=Channel;
DelayUs(10);
temp1=(uint)ADCL;
temp2=(uint)ADCH;
temp2=(temp2<<8)+temp1;}
else
if(Voltage_A>Voltage_B)
{V_Flag=1;
temp2=Voltage_A-Voltage_B;}
else
{V_Flag=0;
temp2=Voltage_B-Voltage_A;}
return(temp2);
}
//***************************電壓數據處理******************//
//參數說明:
//temp:A、B點電壓采樣值或差值;
//pt[]:轉換數據處理,保留兩位小數,如3.51(V)。
void V_Process(uint temp,uchar *pt)
{uint temp1;
temp1=temp*5;
pt[0]=temp1/1023; //電壓整數值
temp1=temp1%1023;
temp1=temp1*10;
pt[1]=temp1/1023; //電壓第一位小數值
temp1=temp1%1023;
temp1=temp1*10;
pt[2]=temp1/1023; //電壓第二位小數值
}
//***************************密碼驗證函數******************//
//參數說明:pt[]:輸入密碼;
//返回值:6:密碼正確;其他:密碼錯誤;
uchar Check_Password(uchar *pt)
{uchar i,j=0;
for(i=0;i<6;i++)
if(pt[i]==Password[i]) j++;
return(j);
}
//sbit KEY_CLK=PD^3 //PS/2接口時鐘線
//sbit KEY_DATA=PD^2;//Interrupt
//***************************LCD函數開始********************//
//sbit DI=PB^0;
void Set_DI(uchar i)
{if(i==1) PORTB=PORTB|0x01;
else PORTB=PORTB&0xfe;}
//sbit RW=PB^1;
void Set_RW(uchar i)
{if(i==1) PORTB=PORTB|0x02;
else PORTB=PORTB&0xfd;}
//sbit ENABLE=PB^2;
void Set_EN(uchar i)
{if(i==1) PORTB=PORTB|0x04;
else PORTB=PORTB&0xfb;}
//sbit CS1=PB^3;
void Set_CS1(uchar i)
{if(i==1) PORTB=PORTB|0x08;
else PORTB=PORTB&0xf7;}
//sbit CS2=PB^4;
void Set_CS2(uchar i)
{if(i==1) PORTB=PORTB|0x10;
else PORTB=PORTB&0xbf;}
//sbit RST=PB^5;
void Set_RST(uchar i)
{if(i==1) PORTB=PORTB|0x40;
else PORTB=PORTB&0x7f;}
//***************************LCD顯示開關控制命令***********//
//參數說明:i=0開顯示,i=1關顯示
void DisplayOnOff(uchar i)
{uchar j;
Set_RW(0); // RW=0;
Set_DI(0); //DI=0;
Set_EN(0); //ENABLE=0;
PORTC=62+i; //P0=0x3e+i;
DelayUs(10); //_DelayUs_();
Set_EN(1); //ENABLE=1;
DelayUs(10); //_DelayUs_();
DelayUs(10); //_DelayUs_();
Set_EN(0); //ENABLE=0;
}
//***************************設置LCD顯示起始行*************//
//參數說明:i=0~63
void SetStartLine(uchar i)
{Set_RW(0); //RW=0;
Set_DI(0); //DI=0;
Set_EN(0); //ENABLE=0;
PORTC=0xc0+i; //PORTC=0xc0+i;
DelayUs(10); //_DelayUs_();
Set_EN(1); //ENABLE=1;
DelayUs(10); //_DelayUs_();
DelayUs(10); //_DelayUs_();
Set_EN(0); //ENABLE=0;
}
//***************************設置頁(行)地址**************//
//參數說明:i=0~7
void SetX(uchar i)
{Set_RW(0); //RW=0;
Set_DI(0); //DI=0;
Set_EN(0); //ENABLE=0;
PORTC=0xb8+i; //P0=0xb8+i;
DelayUs(10); //_DelayUs_();
Set_EN(1); //ENABLE=1;
DelayUs(100); // _DelayUs_();
DelayUs(100); //_DelayUs_();
Set_EN(0); //ENABLE=0;
}
//***************************設置Y(列)地址***************//
//參數說明:i=0~63
void SetY(uchar i)
{Set_RW(0); //RW=0;
Set_DI(0); //DI=0;
Set_EN(0); //ENABLE=0;
PORTC=0x40+i; // P0=0x40+i;
DelayUs(10); //_DelayUs_();
Set_EN(1); //ENABLE=1;
DelayUs(10); //_DelayUs_();
DelayUs(10); //_DelayUs_();
Set_EN(0); //ENABLE=0;
}
//***************************寫顯示數據********************//
//參數說明:i為送DDRAM的數據
void WriteByte(uchar i)
{Set_RW(0); //RW=0;
Set_DI(1); //DI=1;
Set_EN(0); //ENABLE=0;
PORTC=i; //P0=i;
DelayUs(10); //_DelayUs_();
Set_EN(1); //ENABLE=1;
DelayUs(10); //_DelayUs_();
DelayUs(10); //_DelayUs_();
Set_EN(0); //ENABLE=0;
}
//***************************LCD復位***********************//
void Reset(void)
{Set_RST(0); //RST=0;
DelayMs(1);
Set_RST(1); //RST=1;
}
//***************************LCD清屏幕*********************//
//參數說明:LCD從k(0~7)行開始清屏幕
void ClearScreen(uchar k)
{uchar i,j;
Set_CS1(1); //CS1=1;選中右屏幕
Set_CS2(1); //CS2=1;選中左屏幕
for(i=k;i<8;i+=1)
{SetX(i); //設置起始行
for(j=0;j<64;j++)
WriteByte(0x00); //向DDRAM寫0清屏幕
}
}
//***************************LCD初始化*********************//
void Init_LCD(void)
{Reset(); //LCD復位
DelayMs(1);
ClearScreen(0); //LCD清屏
DisplayOnOff(1); //開啟顯示
SetStartLine(0); //設置起始行
}
//***************************LCD圖象顯示函數***************//
//參數說明:disp[]:圖象數組名;i:LCD的起始行;j:LCD的結束行
//函數功能:從LCD的i行到j行顯示數組disp[]所存的圖象
void WritePIC(const uchar *disp,uchar i,uchar j)
{uchar ii=0;
uchar jj=0;
uchar kk=0;
SetX(0);
SetY(0);
for(ii=i;ii<j;ii++)
{for(kk=0;kk<64;kk++)
{Set_CS1(0); //選擇左屏幕
Set_CS2(1);
SetX(ii); //設置頁地址
SetY(kk); //設置列地址
WriteByte(*disp); //寫數據
disp++;}
for(kk=0;kk<64;kk++)
{Set_CS1(1); //選擇右屏幕
Set_CS2(0);
SetX(ii); //設置頁地址
SetY(kk); //設置列地址
WriteByte(*disp); //寫數據
disp++;}}
}
//***************************LCD中文漢字顯示函數***********//
//參數說明:disp[]:漢字字模數組名;
//參數說明:x:LCD的頁地址;y:LCD的列地址
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -