📄 led.c
字号:
//***********************************************
// 程序名称:ASCCLED.c *
// 编译环境:为WAVE6000 使用芯片 :AT89C55 DIP40*
// 版本号 :v1.0 硬件版本号: *
// 完成日期:07.8.20 晶振:18.432 *
// 作者 :zhu yin *
//***********************************************
#include<reg51.h>
#include<absacc.h> // 端口函数
#include<intrins.h> // _nop_();函数
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//display base--------------------------------------------------
#define d_rom0 XBYTE[0x200] //200 信息的总条数 =0没有信息
#define d_rom1 XBYTE[0x201] //201 屏的长度
#define d_rom2 XBYTE[0x202] //202 屏的高度
#define d_rom3 XBYTE[0x203] //203 扫描方式
#define d_rom4 XBYTE[0x204] //204 是什么数据格式 55是点阵 aa是汉字点阵
#define d_rom5 XBYTE[0x205] //205 数据是正向还是反向 55正向 aa反向
#define d_receive XBYTE[0x300] //接收信息的起始地址
#define data_count XBYTE[0x2000] //字库地址 不是汉字 是数字或字母
#define data_count1 XBYTE[0x3000] //字库地址 汉字
#define d_address XBYTE[0x8000] // 板子子号 地址
#define d_374 XBYTE[0xc000] // 6264 的功能控制地址 选通某个6264
#define dram XBYTE[0xe000] // 6264 的地址 e
#define dramm XBYTE[0xf000] // 6264 的地址 f
//常量
bit b_fnew; //是否有信息
bit b_you; //游动标志 =1 游动
bit b_clean; //小消屏标志 =1消屏
sbit store=P1^5; // 锁存 0 锁存
sbit enabl=P1^4; // 行 开 0 开 1 关 说明本程序中是景泰扫描 所以不起作用
sbit wdog=P3^5;
sbit sb_int1=P3^3; //接收和发送控制脚 0接收 1发送
uchar idata da_address; //屏号码
uchar idata seep; //停留时间
uchar idata da_scan; //扫描方式
uchar idata da_loog; //屏的长度
uchar idata da_high; //屏的高度
uchar idata da_send_count; //发送的数据长度
uchar idata wd_send_sbuf[4]; //针头0x8c 地址 应答0xc8 校验和
uchar xdata *daw_data_pointer; //接收缓冲区指针
//uchar xdata *daw_ascc; //数据体地址
uchar xdata *daw_ascc_count; // 信息地址
uchar xdata *daw_6264e;
uchar xdata *daw_6264f;
uchar code cd_le_ri[8]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //从左向右取位
uchar code cd_le_ri_c[8]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //从左向右灭位
uchar code cd_ri_le[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //从右向左取位
uchar code cd_ri_le_c[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //从右向左灭位
void v3_getmdp(i);
//***********************************
// 程序初始化
//***********************************
void int_stant()
{
uchar xdata *pnt00=&d_rom0;
enabl=0;
b_fnew=0; //没有新信息
sb_int1=0; //=0接收
b_clean=0; //不是消屏
pnt00+=1;
da_loog=*pnt00++; //屏长128点
da_high=*pnt00++; //屏高 64点
da_scan=*pnt00; //扫描 16扫
}
//***********************************
// 中断初始化
//***********************************
void int_discontinuity()
{
TCON=0;
TMOD=0X21;
//SCON=0Xd0; //
SCON=0X50;
TH1=0Xfb; //波特率为2400
TL1=0Xfb;
TR1=1;
ES=1;
IP=0x10; //- ps1 pt1 ps pt1 px1 pt px0 中断优先级
EA=1;
}
//***********************************
// 串口中断子程序
//***********************************
void serial1() interrupt 4 using 3
{
xdata uchar *pnt0=&d_rom0; //内部信息的起始地址 200H
static uchar count_all1; // 数据体长度高位
static uchar count_all2; // 数据长度底位
static uchar rmod; // 接收的指针
static uchar rmod1; // 接收指针中的接收指针
static uchar checksum; // 和校验单元
static uchar count_6; // 接收5个字节 其中包括 命令字、长、高、扫描方式、数据长度
static uchar count_1; //1条信息的长度
static uchar data c,i; // 接收缓冲区
static uchar biao_zhi; // 是接收一屏信息的标志 =88为一条信息的开始
// static uchar biao_zhi1; // 是接收判断 是什么显示格式的标志 =77
static uchar tion_all; //总的信息条数
if(RI)
{
RI=0;
c=SBUF;
switch(rmod)
{
//接收针头 8ch
case(0):
{
if(c==0x8c)
{
rmod=1; //接收地址
}
else
rmod=0; //针头不对从新接收
}
break;
//接收地址
case(1):
{
if(c==da_address)
{
rmod=2; //地址对 接收命令字
count_6=6; //连续接收5个字节
}
else rmod=0;
}
break;
//接收命令字
case(2):
{
count_6--;
switch (count_6)
{
//接收数体的总长度底位
case 0:
{
count_all2=c;
rmod=3; //接收完6个字节 开始接收数据体
biao_zhi=0x88; //接收1条信息 开始标志
tion_all=0; //总信息条数 =0
daw_data_pointer=&d_receive; //数据体中信息的起始地址
checksum=0; //准备和校验
}
break;
//接收数体的总长度高位
case 1:
{
count_all1=c;
// rmod=3 //接收完5个字节 开始接收数据体
}
break;
//接收扫描方式
case 2:
{
pnt0=&d_rom0; //200
// *pnt0++;
// *pnt0++;
// *pnt0++;
pnt0+=3;
*pnt0=c; //203 扫描方式
da_scan=c;
}
break;
//接收屏的宽度
case 3:
{
pnt0=&d_rom0; //200
// *pnt0++;
// *pnt0++;
pnt0+=2;
*pnt0=c; //202 屏的宽度
da_high=c;
}
break;
//接收长度
case 4:
{
pnt0=&d_rom0; //200
pnt0+=1;
*pnt0=c; //201 屏的长度
da_loog=c;
}
break;
//方式01 为真确接收
case 5:
{
if(c==01) //方式01 为真确接收
{
}
else
rmod=0;
}
break;
default :
{
rmod=0;
}
break;
}
}
break;
//接收数据体
case(3):
{
//----------------------------------- 只是将数据长度-1
//数据长度 不为0 且 底位为0
if(count_all2==0) //底位为0
{
count_all1--; //高位-1
count_all2=0xff; //底为补255
}
// 底位不为0
else
{
count_all2--;
}
//------------------------------------
if((count_all1!=0)||(count_all2!=0)) //数据长度为0 就接收数据体的最后一位
{
if(biao_zhi==0x88) //1条信息开始 的标志 =0x88就是1条信息开始
{
biao_zhi=0;
count_1=c; //1条信息的长度
checksum+=c; //和校验
// biao_zhi1=0x77; //下面接收的是 显示格式 01 整屏 02游动
tion_all++; //信息总条数+1
}
else// if(biao_zhi1==0x77)
{
// biao_zhi1=00;
// pnt0=&d_rom0; //200
// pnt0+=4; //前面4个是信息的总条数、长、高、扫描方式
// pnt0+tion_all; //
count_1--;
if(count_1)
{
*daw_data_pointer++=c; //读信息
checksum+=c; //和校验
}
else
{
*daw_data_pointer++=c; //读信息
biao_zhi=0x88; // 1条信息读完 从新读1条信息
checksum+=c; //和校验
}
}
}
else
{
*daw_data_pointer++=c; //读信息
checksum+=c; //和校验
rmod=4; //接收完数据开始接收校验和
}
}
break;
// 接收和校验
case(4):
{
if(c==checksum)
{
pnt0=&d_rom0; //信息真确接收完后 存入信息总条数据
pnt0-=1;
*pnt0++=tion_all;
*pnt0++=tion_all;
b_fnew=1; //正确接收完数据
TI=1; //发送正确应答
}
else
rmod=0; //和校验不对
}
break;
default: //接收第一个针头
{
b_fnew=0;
rmod=0;
}
break;
}
}
if(TI)
{
TI=0;
sb_int1=1;
if(i<da_send_count)
{
SBUF=wd_send_sbuf[i]; //发送一针信息
i++;
}
else
{
i=0;
sb_int1=0; //发送完后 从新等待接收
rmod=0;
}
}
}
//***********************************
// 喂看门狗
//***********************************
void wtdog(void)
{
wdog=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
wdog=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
wdog=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
//***********************************
// 启动所有6264
//***********************************
void sdram(void)
{
uchar xdata *pnt3=&d_374;
*pnt3=0x0;
//daw_6264e=&dram;
//daw_6264f=&dramm;
}
//***********************************
// 向6264 的 0通道装数据
//***********************************
void sdram0(uchar data_i)
{
uchar xdata *pnt6=&d_374;
uchar idata i;
i=data_i+0x08; //指向要放的6262的地址
*pnt6=i;
daw_6264e=&dram;
daw_6264f=&dramm;
}
//***********************************
// 选择字库的地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -