📄 led.c
字号:
//***********************************
void sd374(uchar dad_12)
{
uchar xdata *pnt7=&d_374;
pnt7=&d_374;
*pnt7=dad_12;
}
//***********************************
// 显示子程序
//***********************************
void disp(void)
{
uchar idata i,j,b;
uchar xdata *pnt2=&dramm;
sdram(); //启动所有6264
wtdog(); //喂狗
store=0;
enabl=0;
for(j=0;j<da_high;j++)
{
// sdram(); //启动所有6264
for(i=0;i<da_loog;i++)
{
b=*pnt2++;
}
enabl=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
P1=j|0xd0;
store=1;
_nop_();_nop_();_nop_();
store=0;
enabl=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
//}
}
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
enabl=0;
}
//***********************************
// 整理要发送的数据
//***********************************
void v1_send()
{
uchar i,checksum;
i=0;
checksum=0;
da_send_count=0;
wd_send_sbuf[0]=0x8c; //发送1个针头
checksum=0x8c;
da_send_count++;
wd_send_sbuf[1]=da_address; //发送地址
checksum+=da_address;
da_send_count++;
wd_send_sbuf[2]=0xc8;
checksum+=0xc8; //发送状态字
da_send_count++;
wd_send_sbuf[3]=checksum; //发送异或校验
da_send_count++;
}
//***********************************
// 读取屏号
//***********************************
void int_address()
{
xdata uchar *pnt1=&d_address;
da_address=*pnt1;
}
//************************************
// 汉字 ascc--点阵
//***********************************
void v2_get_word(uchar dad_count1,uchar dad_long1) //取汉字
{
uchar idata i,j,h,dad_1,dad_2,data1;
uint idata dad_addr;
ulong idata zhi_zhen;
uchar code *pnt_2=&data_count1; //内码
uchar xdata *pnt7=&d_374;
zhi_zhen=*daw_ascc_count++-0xa1; //取出第1个字节地址
dad_1=*daw_ascc_count++-0xa1; //取出第2个字节地址
zhi_zhen*=94; //第1个字节地址 * 94
zhi_zhen+=dad_1; //第1个字节*94 后 + 第2个字节
zhi_zhen<<=5; //左移5次 (*10)
zhi_zhen+=0x3000;//data_count; //加上字库地址
dad_addr=zhi_zhen&0xffff; //作为点阵的起始地址
zhi_zhen<<=1; //左移1次 (*2)
//----------
zhi_zhen>>=(16-4); //右移12次 (取第3个字节的底4位)
dad_2=zhi_zhen&0xf0;
dad_2|=0x08; //或上0x08 作为 字库地址的高 4位
// dad_addr-=0x3000;
// pnt_2=&data_count1;
pnt_2=dad_addr|0x8000; //点阵地址或上0x8000
//确定 字库地址
// for(h=0;h<2;h++)
// {
// v3_getmdp(0); //确定第几个6264
// sd374(dad_2); //字库地址 的高4位
*pnt7=dad_2;
dad_2=*pnt7;
//取出16个点阵
data1=dad_count1/dad_long1; //算出当前的行
for(i=0;i<16/da_scan;i++) //根据扫描方式16个点阵要放几个6264
{
// v3_getmdp(data1/da_scan); //确定第几个6264
daw_6264e+=dad_count1%dad_long1;//当前列数/总列数 //每列的首行地址
// sd374(dad_2); //字库地址 的高4位
for(j=0;j<da_scan;j++)
{
*daw_6264e++=~*pnt_2++; //取出点阵放入0xf000
*daw_6264e=~*pnt_2++; //取出点阵放入0xf000
*daw_6264e--;
daw_6264e+=dad_long1; //指针指向这1列的一行
}
}
dad_count1++; //总共两个16字点阵, 指向下一个16点阵存放地址
// }
}
//************************************
// 不是汉字 ascc--点阵
//***********************************
void v2_get_byte(uchar dad_count1,uchar dad_long1) //取不是汉字
{
uchar idata i,j,data0,data1;
uint idata dataa;
uchar code *pnt_2=&data_count; //内码
data0=*daw_ascc_count++; //取出1字节的ASCC码 地址
dataa=data0*16; // *16 每个ASCC码占有16字节点阵
pnt_2=&data_count; //点阵从0x2000开始
pnt_2+=dataa|0x8000; //点阵地址或上0x8000
//确定 字库地址
sd374(0x08);
//取出16个点阵
data1=dad_count1/dad_long1; //算出当前的行
for(i=0;i<16/da_scan;i++) //根据扫描方式16个点阵要放几个6264
{
v3_getmdp(data1/da_scan); //算出第几个6264
daw_6264e+=dad_count1%dad_long1;//当前列数/总列数 //每列的首行地址
// sd374(0x08);
for(j=0;j<da_scan;j++)
{
*daw_6264e=~*pnt_2++; //取出点阵放入0xf000
daw_6264e+=dad_long1; //指针指向这1列的一行
}
}
}
//***********************************
// 读取1条信息到E
//***********************************
void v1_read(uchar *mod_or_long,uchar *speed)
{
uchar idata j,k,dad_v1,dad_v2,dad_v3,dad_v4,dad_high1;
uint idata i,dad_count,dd;
//取出第1位看是不是游动, 如果出错就 退出从第一条信息从新开始显示
dad_v2=0;
dad_v1=*daw_ascc_count++;
if(dad_v1==1)
{
b_you=0; //不是游动
*mod_or_long=*daw_ascc_count++; //取出 刷屏方式
dad_count=da_loog*da_high; //信息长度为 长乘以高/16 因为是assc
dad_count/=16;
}
else if(dad_v1==2)
{
b_you=1; //是游动
*mod_or_long=da_loog+*daw_ascc_count++; //游动长度
dad_count=*mod_or_long+da_loog;//)**daw_ascc_count++/16;//信息长度为 长乘以高/16
//因为是assc 且要加上头未 两黑平
dad_high1=*daw_ascc_count++; //游动的高度
dad_count=dad_count*dad_high1/16; //长乘高 得到 信息的总长度
}
else
{
dad_v2=0x8c;
}
if(dad_v2!=0x8c)
{
// 取出 停留时间 或 游动速度
*speed=*daw_ascc_count++;
//--------------------------------开始取信息内容
//是游动信息
if(b_you)
{
for(i=0;i<dad_count;i++) //一条信息的总长度
{
dad_v3=(*mod_or_long+da_loog); //一条游动信息的列长度
//游动的第1屏和最后1屏为不显示
if((i%dad_v3<da_loog)||(i%dad_v3>=*mod_or_long)) //前一个屏长的列和最后一个屏
{ //长的列里面放不显示 0xff
for(k=0;k<16/da_scan;k++) //有多少行游动
{
dad_v4=i/dad_v3; //当前长度 / 列数长度 得到 行数
v3_getmdp(dad_v4/da_scan); //当前行数/扫描行数确定第几个6264
daw_6264e+=i%dad_v3; //当前列长度/总列长度 得到正真的列
//列的首行地址
for(j=0;j<da_scan;j++) //1个ascc 16个点阵
{
*daw_6264e=0xff;
daw_6264e+=dad_v3;
}
}
}
//游动信息 放入6264e中
else
{
//是 汉字的话就要有 两个ascc码
if(*daw_ascc_count>=0xa1)
{
v3_getmdp(0); //2007.8.17
v2_get_word(i,dad_v3); //取汉字
i++;
}
//不是 汉字的话就要有 1个ascc码
else
{
v2_get_byte(i,dad_v3); //取 不是汉字
}
}
}
}
//不是游动信息
else
{
for(i=0;i<dad_count;i++) //一条信息的总长度
{
//是 汉字的话就要有 两个ascc码
if(*daw_ascc_count>=0xa1)
{
v3_getmdp(0); //确定第几个6264 //2007.8.17
v2_get_word(i,da_loog); //取汉字
v3_getmdp(0); //选种 628128
i++;
}
//不是 汉字的话就要有 1个ascc码
else
{
v2_get_byte(i,da_loog); //取 不是汉字
}
}
}
}
else //信息出错就从头开始显示信息
{
daw_ascc_count=&d_receive; //指针指向数据体起始地址
}
}
//***********************************
// 确定6264和数据指针
//***********************************
void v3_getmdp(uchar high_1)
{
uchar idata mod6264; //6264的片选
mod6264=high_1/da_scan; //取莫从而确定 是第几个6264
sdram0(mod6264); //选定6264
}
//***********************************
// 放一行数据
//***********************************
void v3_movdph(uchar high_2)
{
uchar idata i;
uchar idata addr_1; //信息的地址指针
addr_1=high_2*da_loog; //行数 乘以 一行的长度 从得到1行的第一个字节的地址
daw_6264e+=addr_1;
daw_6264f+=addr_1;
for(i=0;i<da_loog;i++)
{
if(!b_clean)
{
*daw_6264f++=*daw_6264e++; //取一行信息
}
else
{
*daw_6264f++=0xff; //消屏
}
}
}
//***********************************
// 1从上往下显示
//***********************************
void v2o_up_do()
{
uchar idata i,j,high_count; //高计数器
for(i=0;i<da_high;i++) //从0行扫描到最后一行
{
v3_getmdp(i); //确定6264和数据指针
v3_movdph(i); //放1行数据
for(j=0;j<da_loog/2;j++)
{
disp();
}
}
}
//***********************************
// 2从下往上显示
//***********************************
void v2o_do_up()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -