📄 1.c
字号:
set_DR();
set_CLK();
data<<=1;
}
clr_DR();
}
//送橙色数据
void Send_Byte_DR_DG(uchar data)
{
uchar i=0;
for(i=0;i<8;i++)
{
clr_CLK();
if((data&0x80)==0)
{
clr_DG();
clr_DR();
}
else//列控制 该位所在列的二极管得正电位 在允许接地的情况下发光!!!
{
set_DR();
set_DG();
}
set_CLK();
data<<=1;
}
clr_DR();
clr_DG();
}
//将汉字符装入显示寄存器
void putin (uchar point)//字符载入函数
{
uchar i;//定义变量用于数据提取指针
for(i=0;i<16;i++)
{
Ledplay[i][bn]=data[point][2*i]; //行储存转化为列储存
Ledplay[i][bn+1]=data[point][(2*i)+1]; //行储存转化为列储存
}
bn+=2;
}
//将数字符装入显示寄存器
void putin1 (uchar point)//字符载入函数 载入第point个汉字
{
uchar i;//定义变量用于数据提取指针
for(i=0;i<16;i++)
{
Ledplay[i][bn]=data1[point][i];
}
bn++;
}
//显示存器清空(0x00)
void clearRAM (void)
{//寄存器清空函数
uchar a,b;//定义变量用于清空数据指针fyhh
for(b=0;b<17;b++)
{
for(a=0;a<42;a++){//指向40个寄存器
Ledplay[b][a]=0;//将指向的寄存器清空
}
}
}
//清屏
void clearping(void)
{unsigned char j;
clr_STB();
for(j=0;j<20;j++)//20*8列都不显示红‘绿色
Send_Byte_DR_DG(0x00);//8位的各个所在列都不显示红‘绿色
set_STB();//锁存
}
//显示一次板面汉字
void DisPlay_onetime(unsigned char colour)
//colour=0\1\2分别为红\绿\橙色显示
{
uchar i,j;
for(i=0;i<16;i++)//扫描16行
{
clr_STB();
for(j=0;j<20;j++)//每一片点阵出现的第一个汉字从第|Jmax-20|列(从输入端开始数)开始入x=20时每一片点阵出现的第一个汉字从第0个字位开始入
{ //*本版面最多能显示10个字,即20列(Ledplay的前20 列)其他汉字通过移动(把20列以后的字信号移到前20列范围内,即版内)
switch(colour)
{
case 0: Send_Byte_DR(Ledplay[i][j]);
break;
case 1: Send_Byte_DG(Ledplay[i][j]);
break;
case 2: Send_Byte_DR_DG(Ledplay[i][j]);
break;
default:break;
}
}
set_G();
delay_nus(2);
set_STB();//锁存
PORTB=ROW[i];//i行控制位 共阴的二极管允许了接地
clr_G();//行控制有效
delay_nus(displayTime);
}
delay_nus(200);
set_G();
}
//下面函数功能为把信号(汉字)前移
void left_move(void)
{
uchar data0,data1,i,j;
for(i=0;i<16;i++)
{
for(j=0;j<(howmany0+hanzishu)*2;j++)//如41=(howmany0+hanzishu)*2+1
{
data0=Ledplay[i][j];
data1=Ledplay[i][j+1];
Ledplay[i][j]=(data0<<1)|(data1>>7);//从第二个字符起它的信号始终没有掉失,
} //只不过是把第一列的信号给了上一16*16的第16列‘
} //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
} //信号开始失掉
//两个for中的参数: 16是规格格式,41是扫描41列(0->40),显示10空字10汉字则要40列
//多出的一列是为了用其最高位来补Ledplay[i][39](最后一列)的最低位(最后一列<<1有了最低们这个空位)
//则要用多出的一列(0x00)的最最位来补(这列也可以以程序默认来补,即可删这行)。
//若程序每次把汉字移动两列则要用二列来补。
void left_MOVE_display(unsigned char colour)
{
static uint king=0;
uint i=0,k;
king=0;
bn=0;// 全局 列变量
clearRAM();//使 Ledplay[i][j]所指空间清0
for(k=0;k<howmany0;k++){putin(position);} //实质上是使 Ledplay[i][j]填入空字 *****************************
for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
while(1)
{//开始移动
for(i=0;i<shopshow;i++)//动态显示一段时间
{
DisPlay_onetime(colour);//*************************************************************
}
left_move();
king++;
if(king>159+16*18)
break;
}//停止移动
/*for(i=0;i<600;i++)//静止显示一段时间***************************
{
DisPlay_onetime(colour);
}*/
}
//不理想
/*void right_move(void)
{
uchar data0,data1,i,j;
for(i=0;i<16;i++)
{
for(j=0;j<(howmany0+hanzishu)*2+1;j++)//如41=(howmany0+hanzishu)*2+1
{
data0=Ledplay[i][j];
data1=Ledplay[i][j+1];
Ledplay[i][j+1]=(data0<<7)|(data1>>1);//从第二个字符起它的信号始终没有掉失,
} //只不过是把第一列的信号给了上一16*16的第16列‘
} //第一个字符(字体失去的那个字,所以第一是变动的。那个字体开始掉失那个字就为第一)始终从第一列
}
void right_MOVE_display(unsigned char colour)
{
static uint king=0;
uint i=0,k;
king=0;
bn=0;// 全局 列变量
clearRAM();//使 Ledplay[i][j]所指空间清0
for(k=0;k<howmany0;k++){putin(position);} //实质上是使 Ledplay[i][j]填入空字 *****************************
for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
while(1)
{//开始移动
for(i=0;i<shopshow;i++)//动态显示一段时间
{
DisPlay_onetime(colour);//*************************************************************
}
right_move();
king++;
if(king>143)
break;
}//停止移动
//for(i=0;i<600;i++)//静止显示一段时间***************************
//{
// DisPlay_onetime(colour);
//}//
} */
//下面数功能为把信号移
void UP_move(void)
{
uchar i,j;
for(j=0;j<(howmany0+hanzishu)*2;j++)
{
for(i=0;i<16;i++)
{
Ledplay[i][j]=Ledplay[i+1][j];//让本列的下一行的来取代自已的位置,来实现下一行信号下移的功能,第16行下移后的空位由多出的一行(0x00)
} //来补,这是Ledplay有17行的所以了。
if(j<(howmany0+hanzishu)*2-10)
Ledplay[15][j]=Ledplay[0][j+10];//本程序开始时以10个空字占満版面,j=0时,把第6个字的信号给第一个字位最低行,j=1时把第7个字信号给第2个字
} //第10列即第6个字
}
void UP_MOVE_display(unsigned char colour)
{
static uint up=0;
uint i=0,k=0;
up=0;
bn=0;
clearRAM();
for(k=0;k<howmany0;k++){putin(position);}//实质上是使 Ledplay[i][j]所指空间清0
for(k=0;k<hanzishu;k++){putin(k);}//在这函数中通过clearRAM()0后"重新"载入字符
while(1)
{
for(i=0;i<shopshow+6;i++)
DisPlay_onetime(colour);
UP_move();
up++;
if(up==32*3)
break;
}
/*for(i=0;i<300;i++)
{
DisPlay_onetime(colour);
}*/
}
/***************************************************************************************************
上面32*80大点阵驱动程序
****************************************************************************************************/
//端口初始化
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xff;
PORTD = 0x01;
DDRD = 0x01;
}
void init_devices(void)
{
CLI(); //禁止所有中断
port_init();
SEI();//开全局中断
}
//主函数
void main(void)
{
char i,j;
init_devices();
clearping();
while(1)
{
// right_MOVE_display(greed);
left_MOVE_display(greed);
UP_MOVE_display(oringe);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -