⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5hanzi-1.c

📁 单行5汉字led显示屏的c51程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -