?? 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 + -