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

📄 ps.c

📁 AVRkaifashili.rar
💻 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 + -