📄 venus.c
字号:
/****************************************/
/* 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 + -