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

📄 venus.c

📁 继电保护测试仪开发程序。已经是项目式的文档
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************/
/* Copyright (c) 2004, 通信工程学院陈斌 */
/* All rights reserved.                 */
/* 作    者:陈斌                       */
/****************************************/

//屏宽:240
//屏高:128

#include <reg51.h>
/*  P1口  */
sbit P17   = 0x97;
sbit P16   = 0x96;
sbit P15   = 0x95;
sbit P14   = 0x94;
sbit P13   = 0x93;
sbit P12   = 0x92;
sbit P11   = 0x91;
sbit P10   = 0x90;
sbit P31   = 0xB1;
sbit P30   = 0xB0;

#include <intrins.h>
#include <absacc.h>
#include <key.h>
#include <extern_val.h>
//
#define lcd_page1		                        0x00//液晶第一屏
#define lcd_page2		                        0x0F//液晶第二屏
#define lcd_graphic_columns	                    30  //液晶图形区行长度
#define lcd_text_columns	                    30  //液晶文本区行长度
#define hzk_page	                             0  //存放汉字库的FLASH页
#define cshsj_page	                             0  //存放初始化数据的FLASH页
#define ID	                                     0  //内核模块ID号
//

unsigned char xdata Lcd_Data_Port      _at_         0xFFFA; //液晶数据口
unsigned char xdata Lcd_Code_Port      _at_         0xFFFB; //液晶指令口
unsigned char xdata Ram_Page           _at_         0xFFFC; //RAM页控制口
unsigned char xdata Flash_Page         _at_         0xFFFD; //FLASH页控制口
unsigned char xdata Reset_Port         _at_         0xFFF9; //设备复位控制口
unsigned char xdata com_reg[16]        _at_         0xFFE0; //SCC2692的寄存器组
unsigned char data  Ram_Reg;                                //RAM页控制口寄存器
unsigned char data  Flash_Reg;                              //FLASH页控制口寄存器
unsigned char xdata lcd_buf[20];                            //液晶显示缓冲区
unsigned char xdata font_data[32];                          //汉字字模缓冲区

//串口通信使用的全局变量
unsigned char xdata rxa_buf[500],txa_buf[500],rxb_buf[500],txb_buf[500];
unsigned char xdata *rxa_point;
unsigned char xdata *txa_point;
unsigned char xdata *rxb_point;
unsigned char xdata *txb_point;
unsigned int data txa_lenth,txb_length,rxa_length,rxb_length;
unsigned char data combstatu,checksum;
bit txa_en=0,txb_en=0;
bit rxa_first=0,rxa_second=0,rxa_third=0,rxa_num=0,rxa_en=0,rxa_ok=0,dsp_connect=0;
bit rxb_first=0,rxb_second=0,rxb_third=0,rxb_num=0,rxb_en=0,rxb_ok=0,dsp_ack=0,dsp_nack=0;
lcd_cls(unsigned char i);
lcd_init();
sys_init();
print_c16(unsigned int lcd_ram_addr);
fprint_c16(unsigned int lcd_ram_addr);
print_bmp(unsigned int lcd_ram_addr,unsigned char code *bmpdata,unsigned char width,length);
reset_flash();
erase_flash(unsigned char sector);
program_flash(unsigned int k,unsigned char x);
com_a_fs(unsigned int k);
com_b_fs(unsigned int k);
unsigned char getchar();
move_data(unsigned char xdata *m,unsigned char xdata *n,unsigned int k);
long d_to_hex(unsigned char xdata *k);
void SetPCF8563(unsigned char timetype,unsigned char value);
bhsy();
xtcssd();
gzsd();
load_data(unsigned char i,unsigned char code *m,unsigned char j,unsigned char xdata *n,unsigned int k)
        {
                unsigned char Flash_Reg_B,Ram_Reg_B;
                EA=0;   //关闭中断
                Flash_Reg_B=Flash_Reg;
                Ram_Reg_B=Ram_Reg;
                Flash_Reg=i;
                Flash_Page=Flash_Reg;
                Ram_Reg=j;
                Ram_Page=Ram_Reg;
                while (k!=0)
                        {
                                *n=*m;
                                n++;
                                m++;
                                k--;
                        }
                Flash_Reg=Flash_Reg_B;
                Ram_Reg=Ram_Reg_B;
                Flash_Page=Flash_Reg;
                Ram_Page=Ram_Reg;
                EA=1;   //打开中断
        }	
/*串口通信中断处理程序,占用INT0*/
void comtx(void) interrupt 0 using 1
{
	unsigned char i,j;
	i=com_reg[5];
	if (i&0x1)     //通道A发送中
	{
		if (txa_en)
		{
			com_reg[3]=*txa_point;
			txa_point++;
			txa_lenth--;
			if (txa_lenth==0) {txa_en=0;com_reg[2]=0x09;}     //同时关闭发送通道A
		}
	}
	if (i&0x2)     //通道A接收中
	{
		j=com_reg[3];
		if (rxa_en)
		{
			*rxa_point=j;
			rxa_point++;
			rxa_length--;
			if (rxa_length==0) {rxa_en=0;rxa_ok=1;}
		}
		else if (rxa_third)
		{
			rxa_third=0;
			rxa_en=1;
			rxa_length=rxa_length+j;
			rxa_point=&rxa_buf;
			if (rxa_length==0)  {rxa_en=0;}
		}
		else if (rxa_second)
		{
			rxa_second=0;
			rxa_third=1;
			rxa_length=j*256;
		}
		else if (rxa_first)
		{
			rxa_first=0;
			if (j==0x55) {rxa_second=1;}
		}
		else if (j==0xaa) {rxa_first=1;}//收包头
	}
	if (i&0x10)    //通道B发送中
	{
		if (txb_en)
		{
			com_reg[11]=*txb_point;
			txb_point++;
			txb_length--;
			if (txb_length==0) {txb_en=0;com_reg[10]=0x09;}     //同时关闭发送通道B
		}
	}
	if (i&0x20)    //通道B接收中
	{
		j=com_reg[11];
		if (rxb_en)
		{
			*rxb_point=j;
			rxb_point++;
			rxb_length--;
			if (rxb_length==0) {rxb_en=0;rxb_ok=1;}
		}
		else if (rxb_third)
		{
			rxb_third=0;
			rxb_en=1;
			rxb_length=rxb_length+j;
			rxb_point=&rxb_buf;
			if (rxb_length==0)  {rxb_en=0;}
		}
		else if (rxb_second)
		{
			rxb_second=0;
			rxb_third=1;
			rxb_length=j*256;
		}
		else if (rxb_first)
		{
			rxb_first=0;
			if (j==0x55) {rxb_second=1;}
		}
		else if (j==0xaa) {rxb_first=1;}//收包头
        }
}
main()
{
//        unsigned char code TABLE01[9]={17,18,19,20,21,16,16,16,0xFF};//系统联机中...
        unsigned char code TABLE02[6]={24,14,25,26,27,0xFF};//VENUS
        unsigned char code TABLE03[5]={29,30,31,32,0xFF};//保护试验
        unsigned char code TABLE04[5]={28,12,33,34,0xFF};//PC主控
        unsigned char code TABLE05[5]={35,36,37,38,0xFF};//结果处理
        unsigned char code TABLE06[5]={17,18,39,40,0xFF};//系统设置
        unsigned int code  MENU_ADD[4]={TABLE03,TABLE04,TABLE05,TABLE06};//菜单代码地址数组
        unsigned int code  MENU_DIS[4]={0x1e0,0x3c0,0x5a0,0x780};//菜单显示位置数组
        unsigned char i,counter_old,counter_new;
        sys_init();
        lcd_init();
        SetPCF8563(0x2,0);   //设置秒
        SetPCF8563(0x3,10);  //设置分
        SetPCF8563(0x4,9);   //设置小时
        SetPCF8563(0x5,1);   //设置日
        SetPCF8563(0x6,6);   //设置星期
        SetPCF8563(0x7,1);   //设置月
        SetPCF8563(0x8,05);  //设置年
        counter_new=0x0;
        counter_old=0x0;
        lcd_cls(lcd_page1);
        lcd_cls(lcd_page2);
        load_data(0,&TABLE02,0,&lcd_buf,6);
        print_c16(0x8);
        load_data(0,&TABLE03,0,&lcd_buf,5);
        print_c16(MENU_DIS[0]);
        load_data(0,&TABLE04,0,&lcd_buf,5);
        print_c16(MENU_DIS[1]);
        load_data(0,&TABLE05,0,&lcd_buf,5);
        print_c16(MENU_DIS[2]);
        load_data(0,&TABLE06,0,&lcd_buf,5);
        print_c16(MENU_DIS[3]);
        while (1)
                {
                        load_data(0,MENU_ADD[counter_new],0,&lcd_buf,20);
                        fprint_c16(MENU_DIS[counter_new]);
                        counter_old=counter_new;
                        i=getchar();
                        if (i==UP) {counter_new--;}
                        if (i==DOWN) {counter_new++;}
                        if (i==ENTER)
                                {
                                        switch (counter_new)
                                        {
                                                case  0:{ gzsd();}break;
                                                case  1:{ bhsy();}break;
                                                case  2:{ xtcssd();}break;
                                                case  3:{ ;}break;
                                        }
                                }
                        counter_new=counter_new&0x3;
                        load_data(0,MENU_ADD[counter_old],0,&lcd_buf,20);
                        print_c16(MENU_DIS[counter_old]);
                }
}
lcd_busy()
        {
                while (Lcd_Code_Port!=0x3);
        }
lcd_cls(unsigned char i)
        {
                unsigned int k;
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Data_Port=i;
                lcd_busy();
                Lcd_Code_Port=0x24;              //SET ADDRESS POINTER
                lcd_busy();
                Lcd_Code_Port=0xB0;
                for (k=0;k<0xF00;k++)
                        {
                                lcd_busy();
                                Lcd_Data_Port=0x0;
                        }
                lcd_busy();
                Lcd_Code_Port=0xB2;
        }
lcd_init()
        {
                lcd_busy();
                Lcd_Code_Port=0x81;              //"XOR" MODE
                lcd_cls(lcd_page1);
                lcd_cls(lcd_page2);
                lcd_busy();
                Lcd_Code_Port=0x9C;              //graphic
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Code_Port=0x42;              //GRAPHIC HOME ADDRESS #0000H
                lcd_busy();
                Lcd_Data_Port=lcd_graphic_columns;
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Code_Port=0x43;              //GRAPHIC AREA 30 COLUMNS
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Data_Port=0xF;
                lcd_busy();
                Lcd_Code_Port=0x40;              //TEXT HOME ADDRESS #0F00H
                lcd_busy();
                Lcd_Data_Port=lcd_text_columns;
                lcd_busy();
                Lcd_Data_Port=0x0;
                lcd_busy();
                Lcd_Code_Port=0x41;              //TEXT AREA 30 COLUMNS
        }
sys_init()
        {
                unsigned int i;
                Flash_Reg=0x00;
                Ram_Reg=0x0;
                Flash_Page=Flash_Reg;
                Ram_Page=Ram_Reg;
                Reset_Port=0x03;                //设置LCD,USB复位,不能使FLASH复位
                for (i=0x2000;i!=0;i--);
                Reset_Port=0x5;                 //清除LCD,USB复位
                //串口设备通道A初始化
                com_reg[0]=0x13;                //MR1A
                com_reg[0]=0x07;                //MR2A
                com_reg[1]=0xcc;                //CSRA
                com_reg[2]=0x09;                //CRA
                com_reg[4]=0x60;                //ACR
                com_reg[5]=0x33;                //IMR
                //串口设备通道B初始化
                com_reg[8]=0x13;                 //MR1B
                com_reg[8]=0x07;                 //MR2B
                com_reg[9]=0xcc;                 //CSRB
                com_reg[10]=0x09;                //CRB
                combstatu=0;
                //系统中断初始化
                IT0=0;                          //边沿触发
                IE0=0;                          //清外中断0标志
                EX0=1;                          //开外中断0
                EA=1;                           //开全局中断
        }
print_c16(unsigned int lcd_ram_addr)
        {
                unsigned char i,j;
                unsigned int k;
                i=0;
                while (lcd_buf[i]!=0xff)
                        {
                                if (lcd_buf[i]==0xfe) {lcd_ram_addr++;i++;}
                                k=32*lcd_buf[i]+(int)(&HZK16);        //字模地址      
                                load_data(hzk_page,k,0,font_data,32);   //取字模数据
                                k=lcd_ram_addr;
                                lcd_ram_addr=lcd_ram_addr+2;     //下一个汉字地址
                                j=0;
                                while (j<32)
                                        {
                                                lcd_busy();
                                                Lcd_Data_Port=k%256;             //地址低位
                                                lcd_busy();
                                                Lcd_Data_Port=k/256;             //地址高位
                                                lcd_busy();
                                                Lcd_Code_Port=0x24;              //SET ADDRESS POINTER
                                                lcd_busy();
                                                Lcd_Data_Port=font_data[j];
                                                lcd_busy();
                                                Lcd_Code_Port=0xc0;
                                                j++;
                                                lcd_busy();
                                                Lcd_Data_Port=font_data[j];
                                                lcd_busy();
                                                Lcd_Code_Port=0xc0;
                                                j++;
                                                k=k+lcd_graphic_columns;
                                        }
                                i++;
                        }
        }
fprint_c16(unsigned int lcd_ram_addr)  //反向显示16*16点阵汉字

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -