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

📄 venus.c

📁 继电保护测试仪开发程序。已经是项目式的文档
💻 C
📖 第 1 页 / 共 3 页
字号:
        {
                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]+(&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++;
                        }
        }
print_e(unsigned int lcd_ram_addr)   //显示英文字符串
        {
                unsigned char i;
                lcd_ram_addr=lcd_ram_addr+0xf00;     //写到文本区
                i=0;
                lcd_busy();
                Lcd_Data_Port=lcd_ram_addr%256;      //地址低位
                lcd_busy();
                Lcd_Data_Port=lcd_ram_addr/256;      //地址高位
                lcd_busy();
                Lcd_Code_Port=0x24;                  //SET ADDRESS POINTER
                while (lcd_buf[i]!=0xff)
                        {
                                lcd_busy();
                                Lcd_Data_Port=lcd_buf[i];
                                lcd_busy();
                                Lcd_Code_Port=0xc0;
                                i++;
                        }
        }
print_fill(unsigned int lcd_ram_addr,unsigned char filldata,width,length)
        {
                unsigned char j;
                while (width>0)
                        {
                                lcd_busy();
                                Lcd_Data_Port=lcd_ram_addr%256;  //地址低位
                                lcd_busy();
                                Lcd_Data_Port=lcd_ram_addr/256;  //地址高位
                                lcd_busy();
                                Lcd_Code_Port=0x24;              //SET ADDRESS POINTER
                                j=length;
                                while (j>0)
                                        {
                                                lcd_busy();
                                                Lcd_Data_Port=filldata;
                                                lcd_busy();
                                                Lcd_Code_Port=0xc0;
                                                j--;
                                        }
                                lcd_ram_addr=lcd_ram_addr+lcd_graphic_columns;
                                width--;
                        }
        }
reset_flash()
        {
                unsigned char xdata *app;
                EA=0;               //关中断
                Flash_Page=0x80;
                *app=0xf0;          //任意地址写0xf0复位flash
                Flash_Page=Flash_Reg;
                EA=1;               //开中断
        }
erase_flash(unsigned char sector)
        {
                unsigned char xdata *app;
                EA=0;               //关中断
                Flash_Page=0x80;
                if (sector==64)
                        {
                                app=0x555;
                                *app=0xaa;
                                app=0x2aa;
                                *app=0x55;
                                app=0x555;
                                *app=0x80;
                                *app=0xaa;
                                app=0x2aa;
                                *app=0x55;
                                app=0x555;
                                *app=0x10;
                                goto erase_ret;
                        }
                if (sector<64)
                        {
                                app=0x555;
                                *app=0xaa;
                                app=0x2aa;
                                *app=0x55;
                                app=0x555;
                                *app=0x80;
                                *app=0xaa;
                                app=0x2aa;
                                *app=0x55;
                                app=sector;
                                *app=0x30; 
                        }
      erase_ret:
                Flash_Page=Flash_Reg;
                EA=1;               //开中断
                        }
program_flash(unsigned int k,unsigned char x)
        {
                unsigned char xdata *app;
                EA=0;               //关中断
                Flash_Page=0x80|Flash_Reg;
                app=0x555;
                *app=0xaa;
                app=0x2aa;
                *app=0x55;
                app=0x555;
                *app=0xa0;
                app=k;
                *app=x;
                Flash_Page=Flash_Reg;
                EA=1;               //开中断
        }
com_a_fs(unsigned int k)
//参数k为发送缓冲区首地址,要求缓冲区first字节空着,second和third字节为发送数据长度N
//second字节为长度高字节,third字节为长度低字节,从fouth字节开始存放N字节数据
        {
        txa_point=k;          //设置发送指针
        *txa_point=0x55;      //验证头
        txa_point++;
        txa_lenth=(*txa_point)*256;         //长度高字节
        txa_point++;
        txa_lenth=txa_lenth+(*txa_point);   //长度低字节
        txa_point=k;          //设置发送指针
        txa_lenth=txa_lenth+3;//发送长度(包括1字节验证头,2字节接收长度"N"和N字节数据)-->N+3
        com_reg[2]=0x05;      //CRA 打开发送通道A
        com_reg[3]=0xaa;      //THRA 启动头
        txa_en=1;             //允许发送
        }
com_b_fs(unsigned int k)
//参数k为发送缓冲区首地址,要求缓冲区first字节空着,second和third字节为发送数据长度N
//second字节为长度高字节,third字节为长度低字节,从fouth字节开始存放N字节数据
        {
        txb_point=k;          //设置发送指针
        *txb_point=0x55;      //验证头
        txb_point++;
        txb_length=(*txb_point)*256;         //长度高字节
        txb_point++;
        txb_length=txb_length+(*txb_point);   //长度低字节
        txb_point=k;          //设置发送指针
        txb_length=txb_length+3;//发送长度(包括1字节验证头,2字节接收长度"N"和N字节数据)-->N+3
        com_reg[10]=0x05;     //CRB 打开发送通道B
        com_reg[11]=0xaa;     //THRB 启动头
        txb_en=1;             //允许发送
        }
unsigned char key(unsigned char y)
        {
                if (P10==0) {;}
                else if (P11==0) {y++;}
                     else if (P12==0) {y++;y++;}
                          else if (P13==0) {y++;y++;y++;}
                               else {y=0xFF;}
                return(y);
        }
unsigned char getchar() //4*4阵列键盘接P1口
{
	unsigned char const keyname[16]={1,2,3,CLEAR,
	4,5,6,ESC,
	7,8,9,ENTER,
	0,POINT,LEFT,RIGHT};
	unsigned char x,y;
	unsigned int k;
	NOKEY:
	P1=0xF;
	x=0x0;
	while (x==0x0)             //等待按键
	{
		x=P1;
		x=~x;
		x=x&0xF;
		if (rxa_ok) {goto GETKEY;}
	} 
	for (k=0;k<5000;k++) {;}        //延时消抖动
	P1=0xEF;                        //扫描第一行
	x=key(0);
	if (x==0xFF)
	{
		P1=0xDF;                //扫描第二行
		x=key(4);
		if (x==0xFF)
		{
			P1=0xBF;        //扫描第三行
			x=key(8);
			if (x==0xFF)
			{
				P1=0x7F;//扫描第四行
				x=key(12);
				if (x==0xFF) {goto NOKEY;}
			}
		}
	}
	y=x;                       //暂存按键扫描码
	P1=0xF;
	x=0x0;
	while (x!=0xF)             //等待键释放
	{
		x=P1;
		x=x&0xF;
	}
	x=keyname[y];                //转换为键值
GETKEY:
	return(x);
}
move_data(unsigned char xdata *m,unsigned char xdata *n,unsigned int k)
//当前RAM页内数据搬移 m->n
        {
                while (k>0)
                        {
                                *n=*m;
                                n++;
                                m++;
                                k--;
                        }
        }	
bhsy()    //保护试验
{
        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;
        bit off=1;
        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 (off)
                {
                        load_data(0,MENU_ADD[counter_new],0,&lcd_buf,20);
                        fprint_c16(MENU_DIS[counter_new]);
                        counter_old=counter_new;
                        i=getchar();
                        switch (i)
                        {
                                case      UP:{
                                                  if (counter_new==0) {counter_new=0x3;}
                                                  else {counter_new--;}
                                             }break;
                                case    DOWN:{
                                                  if (counter_new<0x3) {counter_new++;}
                                                  else {counter_new=0x0;}
                                             }break;
                                case     ESC:{off=0;}break;
                                case   ENTER:{
                                                  switch (counter_new)
                                                  {
                                                       case  0:{;}break;
                                                       case  1:{;}break;
                                                       case  2:{;}break;
                                                       case  3:{;}break;
                                                  }
                                             }break;
                        }
                        load_data(0,MENU_ADD[counter_old],0,&lcd_buf,20);
                        print_c16(MENU_DIS[counter_old]);
                }
}
xtcssd()    //系统参数设定
{
        unsigned char code TABLE01[7]={24,14,22,25,26,27,0xFF};//系统参数设定
        unsigned char code TABLE02[5]={29,30,31,32,0xFF};//系统电压
        unsigned char code TABLE03[5]={28,12,33,34,0xFF};//负荷电流
        unsigned char code TABLE04[5]={35,36,37,38,0xFF};//系统频率
        unsigned int code  MENU_DIS[3]={0x87,0xc3,0xff};//菜单显示位置数组
        unsigned char xdata xtcs_x[3][9];               //设置数据存放数组
        unsigned int xdata  menu_add[3];   //激活块地址数组 menu_add=(MENU_DIS/30)*240+(MENU_DIS%30)
        unsigned char i,counter_old,counter_new;
        bit off=1;
        long y;
        load_data(0,&xtcs_c,0,&xtcs_x,27);   //装初始设置数据
        menu_add[0]=(MENU_DIS[0]/30)*240+(MENU_DIS[0]%30);
        menu_add[1]=(MENU_DIS[1]/30)*240+(MENU_DIS[1]%30);
        menu_add[2]=(MENU_DIS[2]/30)*240+(MENU_DIS[2]%30);
        counter_new=0x0;
        counter_old=0x0;
        lcd_cls(lcd_page1);
        lcd_cls(lcd_page2);
        load_data(0,&TABLE01,0,&lcd_buf,7);
        print_c16(0x8);
        load_data(0,&TABLE02,0,&lcd_buf,5);
        print_c16(0x1e0);
        load_data(0,&TABLE03,0,&lcd_buf,5);
        print_c16(0x3c0);
        load_data(0,&TABLE04,0,&lcd_buf,5);
        print_c16(0x5a0);
        move_data(&xtcs_x[0][0],&lcd_buf,9);
        print_e(MENU_DIS[0]);
        move_data(&xtcs_x[1][0],&lcd_buf,9);
        print_e(MENU_DIS[1]);
        move_data(&xtcs_x[2][0],&lcd_buf,9);
        print_e(MENU_DIS[2]);
        y=d_to_hex(&xtcs_x[0][0]);
        while (off)
                {
                        move_data(&xtcs_x[counter_new][0],&lcd_buf,9);
                        print_fill(menu_add[counter_new],0xff,0x8,0x9);
                        counter_old=counter_new;
                        i=getchar();
                        switch (i)
                        {
                                case    LEFT:{
                                                  if (counter_new==0) {counter_new=0x2;}
                                                  else {counter_new--;}
                                             }break;
                                case   ENTER:
                                case   RIGHT:{
                                                  if (counter_new<0x2) {counter_new++;}
                                                  else {counter_new=0x0;}
                                             }break;
                                case      UP:{
                                                  if (counter_new==0) {counter_new=0x2;}
                                                  else {counter_new--;}
                                             }break;
                                case    DOWN:{
                                                  if (counter_new<0x2) {counter_new++;}
                                                  else {counter_new=0x0;}
                                             }break;
                                case     ESC:{off=0;}break;
                                case   START:{
                                                  switch (counter_new)
                                                  {
                                                       case  0:{;}break;
                                                       case  1:{;}break;

⌨️ 快捷键说明

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