📄 0706.c
字号:
// 0704
#include "reg52.h"
#include "stdio.h"
#include "intrins.h"
#include "absacc.h"
#include "TC35I.H"
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define TIME1 100
#define TIME2 200
#define TIME3 300
#define TIME4 100 //去抖延时
#define L_DELAY 10
#define H_DELAY 10
#define START_PT 0
#define RBUF_START 0
#define CT_1 0 // OE 极性 改变极性可更改此宏
#define CT_0 1
#define RED0 0X01
#define RED1 0X02
#define DAT_INVERSE 0Xff; // 数据反 0xff ,数据正常 0x00
/********** LED 屏寄存器地址定义************/
#define SCAN_REG XBYTE[0X0000]
#define ReadInport XBYTE[0X0000]
/*******************************************/
#define SECOND XBYTE[0X7F00]
#define MINUTE XBYTE[0X7F02]
#define HOUR XBYTE[0X7F04]
#define WEEK XBYTE[0X7F06]
#define DATE XBYTE[0X7F07]
#define MONTH XBYTE[0X7F08]
#define YEAR XBYTE[0X7F09]
#define REG_A XBYTE[0X7F0A]
#define REG_B XBYTE[0X7F0B]
#define REG_C XBYTE[0X7F0C]
#define CENTURY XBYTE[0X7F32]
/*********************************************/
uchar volatile bdata CTRL_R; // 控制寄存器
sbit SCAN_A=CTRL_R^0;
sbit SCAN_B=CTRL_R^1;
sbit SCAN_C=CTRL_R^2;
sbit SCAN_D=CTRL_R^3;
sbit EN=CTRL_R^4;
sbit STB=CTRL_R^5;
sbit CLK_EN =P1^6;
sbit A16=P1^0;
sbit A17=P1^1;
sbit A18=P1^2;
sbit A_138= P1^3;
sbit B_138= P1^4;
sbit C_138= P1^5;
/*********************************************/
sbit KEY2= P3^2;
sbit DE = P3^5 ;
/********************************************/
sbit IO_CE= P1^6; //外部IO选择,为1选择CPLD,为0选择eeprom
//*****************************************************************
uint data delaycount;
uchar data step;
uchar data time_sec;
uchar idata timemem[16];
uchar idata dispbuffer[28];
uchar data reg_row=0;
uint data pt_col=START_PT;
uchar xdata *xp_rbuffer;
uchar data over_count; //回车累计变量,为4时即为通信结束
uint data timeout;
uchar KEY;
uchar data h_delay_count;
uchar data l_delay_count;
uchar data bak;
bit CountEnable;
bit keyflag;
bit updateflag;
bit receiveflag;
bit dateflag;
bit timeflag;
bit serial_flag;
//SM_PARAM xdata gsmsms;
void delay(unsigned int time0)
{
while(time0--);
}
void SelectInport()
{
C_138=1;
B_138=0;
A_138=1;
}
void Select374()
{
B_138=1;
C_138=0;
A_138=1;
}
void SelectRam()
{
A_138=0;
B_138=0;
C_138=0;
A17=1;
A18=0;
}
void SelectRom()
{
A_138=1;
B_138=0;
C_138=0;
}
void SelectRTC()
{
A_138=0;
B_138=1;
C_138=0;
}
void TimeStop()
{
uchar bak;
bak=P1;
SelectRTC();
REG_B=0X9A;
P1=bak;
}
void TimeRun()
{
uchar bak;
bak=P1;
SelectRTC();
REG_B=0X1A;
P1=bak;
}
void Init_RTC()
{
uchar i;
uchar bak;
bak=P1;
SelectRTC();
REG_B=0X9A;
REG_A=0X26;
REG_C=0X70;
i=REG_C;
P1=bak;
TimeRun();
}
void ResetTime()
{
uchar bak;
bak=P1;
SelectRTC();
SECOND=0X50;
MINUTE=0X52;
HOUR=0X08;
WEEK=0X02;
DATE=0X02;
MONTH=0X05;
YEAR=0X07;
CENTURY=0X20;
P1=bak;
}
//********************************* FLASH 读写程序 ****************************
void Flash_Write(uchar page,uchar xdata *source,uchar xdata *destination)
{
uint data i;
IO_CE=1;
// EXT_ADDR=0;
IO_CE=0;
XBYTE[0xD555]=0xaa; //load 0xaa to adresss 5555
XBYTE[0xAAAA]=0x55; //load 0x55 to address 2aaa
XBYTE[0xD555]=0xa0; //load 0xa0 to adresss 5555
IO_CE=1;
// EXT_ADDR=page;
IO_CE=0;
for(i=0;i<256;i++)
{
*destination++=*source++;
}
delay(10000);
}
void Flash_Erase()
{
}
void Dis_Flash_Protect()
{
IO_CE=1;
IO_CE=0;
XBYTE[0xD555]=0xaa;
XBYTE[0xAAAA]=0x55;
XBYTE[0xD555]=0x80;
XBYTE[0xD555]=0xaa;
XBYTE[0xAAAA]=0x55;
XBYTE[0xD555]=0x20;
delay(20000);
}
//******************************************************************************
void ClearRam(uchar xdata *xp_begin,uchar xdata *xp_end)
{
uchar xdata *xp_ram;
xp_ram=xp_begin;
while(xp_ram<xp_end)
{
*xp_ram++=0xff;
}
}
void ReadSy()
{
uchar data page_flash;
uchar xdata *xp_flash;
uchar idata *ip_buffer;
uint data i;
ip_buffer=0x80;
page_flash=0x44000/0x10000;
P1=(P1&0xf8)|page_flash;
xp_flash=0x44000%0x10000;
SelectRom();
// P1&=0XF8;
// xp_flash=0x150;
for(i=0;i<40;i++)
{
*ip_buffer++=*(xp_flash+i);
}
}
void SaveWord(uchar xdata *xp_ram,uchar index)
{
uint data i;
uint data j;
uchar data k;
uchar data page_flash;
uchar xdata *xp_flash;
uchar data row;
uchar data temp;
page_flash=0x70000/0x10000;
P1=(P1&0xf8)|page_flash;
xp_flash=index*256;
P1&=0XF8;
SelectRom();
XBYTE[0xD555]=0xaa; //load 0xaa to adresss 5555
XBYTE[0xAAAA]=0x55; //load 0x55 to address 2aaa
XBYTE[0xD555]=0xa0; //load 0xa0 to adresss 5555
P1|=page_flash;
for(i=0;i<256;i++)
{
if(xp_ram<0x7fff)
{
SelectRam();
A16=0;
temp=*xp_ram++;
SelectRom();
P1=(P1&0XF8)|page_flash;
*xp_flash++=temp;
}
else
{
SelectRom();
P1=(P1&0XF8)|page_flash;
*xp_flash++=' ';
}
}
delay(4500);
}
uint HZK_UNICODE(uint code_alpha, uchar mode) // mode=0 HZK-->UNICODE ; mode=1 HZK<----UNICODE
{
uint decode;
uchar xdata *xp_ram;
uint xdata *xp_rom;
uchar data page_flash;
uchar data step;
uint data address;
uchar data bak;
bak=P1;
page_flash=0x50000/0x10000; // HZK_UNICODE 表存放的地址
P1=(P1&0xf8)|page_flash; //
if(mode==0)
{
xp_rom=0x50000%0x10000; // 指向表中的 HZK
address=0xfffa; // HZK->UNICODE 查表时的结束地址
}
else
if(mode==1)
{
xp_rom=0x50000%0x10000;
xp_rom++; // 指向表中的 UNICODE
address=0xfffc; // UNICODE->HZK 查表时的结束地址
}
SelectRom(); // 选择FLASH 29C040
step=1;
while(1)
{
if(*xp_rom==code_alpha)
{
if(mode==0)
return *(xp_rom+1); // 返回HZK后面的UNICODE
else
if(mode==1)
return *(xp_rom-1); // 返回 UNICODE 前面的 HZK
}
else
{
if(xp_rom<address)
{
xp_rom++; // 跳跃1组数据
xp_rom++; // 指向下一组数据
}
else
{
if(step<2) // STEP=2 为查询表的下64K 内容时的状态
{
step++;
if(mode==0)
{
address=0x5876; // HZK->UNICODE 查表时的结束地址
}
else
if(mode==1)
{
address=0x5878; // UNICODE->HZK 查表时的结束地址
}
page_flash=0x60000/0x10000;
P1=(P1&0xf8)|page_flash;
if(mode==0)
xp_rom=0x50000%0x10000;
else
if(mode==1)
{
xp_rom=0x50000%0x10000;
xp_rom++;
}
}
else
{
return(0xffff); //未找到匹配数据时返回0xffff;找到匹配数据时返回对应的数据
}
}
}
}
P1=bak;
_nop_();
}
void CreateFnt16() //构建16点阵显示RAM
{
uchar xdata *xp_ram;
uchar xdata *xp_rom;
uchar xdata *xp_word;
uchar data temp;
uchar data row; //点阵行,16点阵字为16行
uchar data col; // 点阵列,16点阵字为16列
uchar data i;
uint data length; // 汉字长度,即多少个汉字,32K RAM 存16点阵字则可存储128字,共2048点
uchar data low ;
uchar data high;
uchar data asc;
ulint row1;
unsigned long int data qu_code;
uint wei_code;
unsigned long int data position;
uint data page;
uchar data page_flash;
uchar data character;
bit flag;
uchar word_end;
union
{
uchar byte[4];
unsigned long int dword;
uint word[2];
} word;
flag=0;
SelectRam();
A16=0;
ClearRam(0x00,0xffff);
A16=1;
ClearRam(0x00,0xffff);
for(row=0;row<16;row++) // 处理16行文字
{
page_flash=0x70000/0x10000; //文 字存放的位置 页
P1=(P1&0xf8)|page_flash; // 切换页面
xp_rom=0x70000%0x10000; //文字存放的位置 页内地址
SelectRom(); // 选择FLASH 29C040
row1=row;
word.dword=row1*0x1000; // 计算每行的汉字的RAM地址
xp_word=xp_rom;
character=*xp_word; // 取出FLASH内的字符
xp_ram=word.word[1]; // 确定 显示 RAM 地址
word_end=0; // 文字结束 标志变量
length=0;
while(length<256)
{
word_end=0;
if(character<0xa0) // ASC 处理部分
{
SelectRom();
page_flash=0x70000/0x10000; //文 字存放的位置 页
P1=(P1&0xf8)|page_flash; // 切换页面
asc=character;
xp_word++;
character=*xp_word;
position=asc*16; // 字符在ASC16中的偏移位置
position=position+0x42000; // ASC字库在存储器中的偏移位置 0x42000;
page=position/65536; // 计数页码 32K/页
page_flash=page;
P1=(P1&0xf8)|page_flash;
page=(position%65536);
SelectRom();
xp_rom=page;
low=*(xp_rom+row);
SelectRam();
A16=1;
// page_flash=row/8;
// P1=(P1&0XFE)|page_flash;
for(col=0;col<8;col++) // 将字库中点阵数据变换为LED显示屏把需数据
{
low<<=1;
temp=(CY&RED0)^DAT_INVERSE;
*xp_ram++=temp;
}
length++;
}
else // 汉字处理部分
{
SelectRom();
page_flash=0x70000/0x10000; //文 字存放的位置 页
P1=(P1&0xf8)|page_flash; // 切换页面
character=*xp_word++;
qu_code=character-0xa1; //区码
character=*xp_word++;
wei_code=character-0xa1; //位码
character=*xp_word;
position=32*(qu_code*94+wei_code); //根据区位码计算汉字点阵在字库中的位置
page=position/65536; // 计数页码 32K/页
page_flash=page;
P1=(P1&0xf8)|page_flash;
page=(position%65536);
SelectRom();
xp_rom=page;
high=*(xp_rom+row*2); // 汉字点阵左半部分
low=*(xp_rom+row*2+1); // 汉字点阵右半部分
SelectRam();
A16=1;
// page_flash=row/8;
// P1=(P1&0XFE)|page_flash;
for(col=0;col<8;col++)
{
high<<=1;
temp=(CY&RED0)^DAT_INVERSE;
*xp_ram++=temp;
}
for(col=0;col<8;col++)
{
low<<=1;
temp=(CY&RED0)^DAT_INVERSE;
*xp_ram++=temp;
}
length++;
length++;
}
}
}
}
void IntToChar(ulint num,uchar data *pt_array)
{
*pt_array++=num/10000;
*pt_array++=(num%10000)/1000;
*pt_array++=(num%1000)/100;
*pt_array++=(num%100)/10;
*pt_array++=num%10;
}
void init()
{
uchar i;
uchar idata *ip_time;
uchar sec;
uint temp;
EN=0; // LED显示板上OE
Select374();
SCAN_REG=CTRL_R;
SCON=0X50; // SM0/SM1/SM2/REN/TB8/RB8/TI/RI
TMOD=0X21;
// TH1=0XF4;
// TL1=0XF4;
TH1=0XFA;
TL1=0XFA;
TR1=1;
ES=1;
PS=1;
TR0=1;
ET0=1;
EX0=1;
IT0=0;
TH0=0Xe0;
TL0=0X00;
// temp=HZK_UNICODE(0xdd7b,0);
_nop_();
/*
for(i=0;i<28;i++)
{
dispbuffer[i]=0;
}
*/
}
uchar xdata *CompareBuffer(uchar code * pc_str) // 在RAM中搜索指定字符串
{
uchar xdata *xp_ram;
uchar code *cp_str;
uchar xdata *xp_ram1;
bit same;
xp_ram=0;
P1&=0XF8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -