📄 5hanzi-1.c
字号:
en_ziku=1;en_ram=0;
dispram[nm][i]=~z1;
dispram[nm+1][i]=~z2;
en_ram=1;
}
}
//--汉字3区----------------------------------------------------
if(x>=6144) //如x>=6144,则为汉字库的第3区
{
y=x-6144;y=y*32; //计算出在第3区的字节首址
for(i=0;i<16;i++)
{
en_ziku=0; a17=1; a16=1;
z1=XBYTE[2*i+y];
z2=XBYTE[2*i+y+1];
en_ziku=1;en_ram=0;
dispram[nm][i]=~z1;
dispram[nm+1][i]=~z2;
en_ram=1;
}
}
nm=nm+2; //指向内码的计数变量递增2,指向下一个汉字的机内码
} // end if 汉字的判断
//--两个ASCII码--------------------------------------------------
if((m<0x80)&&(n<0x80)) //如m<128且n<128,则为2个ASCII码
{
if(m<0x20) //计算出第一个ASCII码在ASCII码表中的位置
z1=0;
else
z1=(m-0x20);
if(n<0x20) //计算出第二个ASCII码在ASCII码表中的位置
z2=0;
else
z2=(n-0x20);
en_ram=0; //选择外部RAM
for(i=0;i<16;i++) // 连续取16个字节(为一个ASCII码的点阵)
{
dispram[nm][i]=asc[z1][i];
dispram[nm+1][i]=asc[z2][i];
}
en_ram=1;
nm=nm+2; //指向内码的计数变量递增2,指向下一个汉字的机内码
}
//--一个ASCII码--------------------------------------------------
if((m<0x80)&&(n>0x80)) //如m<128且n>128,则为1个ASCII码
{
if(m<0x20) //计算出第一个ASCII码在ASCII码表中的位置
z1=0;
else
z1=(m-0x20);
en_ram=0; //选择外部RAM
for(i=0;i<16;i++) // 连续取16个字节(为一个ASCII码的点阵)
{
dispram[nm][i]=asc[z1][i];
}
en_ram=1;
nm++; //指向内码的计数变量递增1,指向下一个汉字的机内码
}
}
/*******************************************************
*初始显示取值 *
*******************************************************/
void chushihua(uchar mod)
{
if(mod==1) //屏地址为1时初始取值
{
nm = 0;
tt = 8;
while(nm<8)
{
quzimo(chushi[nm],chushi[nm+1]);
}
}
if(mod==2) //屏地址为2时初始取值
{
nm = 0;
tt = 12;
while(nm<12)
{
quzimo(chushi2[nm],chushi2[nm+1]);
}
}
}
/*******************************************************
*取值函数 *
*******************************************************/
void quzhi()
{
unsigned char i,j;
if(comend==1)
{
TR0 = 0;
comend = 0;
nm = 0;
for(k=0;k<16;k++) //消除变换显示时的高亮(一个全屏的空扫描)
{
en_138 = 1; //关闭显示
P1 &= 0x01; //行号端口清零
for (i=0;i<BLKN;i++)
sd_byte(0xff);
sc_595 = 1;
_nop_();
_nop_();
sc_595 = 0;
P1 |= k; //写入行号
en_138 = 0; //打开显示
delay(1);
}
en_138 = 1;
k = 16;
h = 11001;
fs = comram[1]; //取显示方式
while(nm<tt) //显示内容取字模
{
quzimo(comram[nm+2],comram[nm+3]);
}
en_ram = 0;
for(i=tt;i<BLKN;i++) //发送来的显示内容不足屏长时补空
for(j=0;j<16;j++)
dispram[i][j] = 0xff;
en_ram = 1;
TR0 = 1; //启动定时器T0
}
}
/*******************************************************
*主函数 *
*******************************************************/
void main()
{
k=0;
h=0;
t=0;
comend = 0;
en_138 = 1; //关闭显示
sc_595 = 0; //锁存595
fs = 0x00;
chushihua(1);
TMOD = 0x21; //定时器T0工作方式1,定时器T1工作方式2
SCON = 0x50; //串口模式1,允许接收
PCON = 0x00; //波特率不倍增
TH1 = 0xec; //波特率2400
TL1 = 0xec;
// TH0 = 0xFC; //1ms定时常数
// TL0 = 0x66;
TH0 = 0xFF; //1ms定时常数
TL0 = 0x00;
IP = 0x10; //定义中断优先级
IE = 0x92; //允许串口、定时器T0中断
TR0 = 1; //启动定时器T0
TR1 = 1; //启动定时器T1
while (1)
{
quzhi();
}
}
/*******************************************************
* 定时扫描中断服务函数(优先级低) *
*******************************************************/
void led_display(void) interrupt 1
{
unsigned char n;
if(k<16)
{
TH0 = 0xFF; //1ms定时常数
TL0 = 0x00;
en_138 = 1; //关闭显示
P1 &= 0x01; //行号端口清零
sd_hang00();
P1 |= k; //写入行号
en_138 = 0; //打开显示
k++;
}
if (k>=16)
{
k = 0;
h++;
if (h>=11000)
{h=0;}
}
}
/******************************************************/
/*******************************************************
* 串行口中断服务函数(优先级高) *
*******************************************************/
void serial() interrupt 4
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
if(t==0) //地址位非0号广播,非本屏1号地址时退出中断
{
if(buf!=0x00)
{
if(buf!=0x01)
goto bak;
}
}
if(t==1) //显示方式非00/10/13时退出中断
{
if(buf!=0x00)
{
if(buf!=0x10)
{
if(buf!=0x13)
{
t = 0;
goto bak;
}
}
}
}
if(buf!=0x0d) //接收数据
{
comram[t] = buf;
t++;
if(t>=66)
{
t=66;
comram[t] = 0x81;
}
}
if(buf==0x0d) //数据结束处理
{
comram[t] = buf;
if(t<=2){tt=0;}
else {tt=t-2;t=0;}
comend = 1; //置位串行数据接收结束标记
}
bak:;
ES = 1; //允许串口中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -