📄 dian.c
字号:
/*
________________________________________________________________________
这个是在别人的基础上改的,别人只给出了左右移的程序,其他是
自己写的,共六种显示模式,按了键立即改变模式(实时性,呵呵)
程序有许不足(最突出的是时间没设置好),感觉时间不好设置.
希望大家提出宝贵的意见,大家共同交流.
*/
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
uchar speed=15;
sbit ST=P3^5;
sbit SH=P3^6;
sbit DATA=P3^7;
sbit EN=P2^4;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
bit LeftFlag;
bit RightFlag;
bit UpFlag;
bit DownFlag;
bit ZJ1Flag;
bit ZJ2Flag=1; //开始显示模式6
void delay(uchar ms)
{
uchar y;
for(;ms>0;ms--)
for(y=120;y>0;y--);
}
uchar code hanzi[][32]={
/*宜 CB4FA */
{0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x04,0x40,0x08,0x0F,0xE0,0x08,0x20,0x08,0x20,
0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x7F,0xFE,0x00,0x00,},
/*春 CB4BA */
{0x01,0x00,0x01,0x00,0x3F,0xFC,0x01,0x00,0x1F,0xF8,0x02,0x00,0xFF,0xFE,0x04,0x20,
0x08,0x18,0x3F,0xEE,0xC8,0x24,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x00,0x00,},
/*学 CD1A7 */
{0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,},
/*院 CD4BA */
{0x00,0x80,0xF8,0x40,0x8F,0xFE,0x94,0x04,0xA0,0x00,0xA3,0xF8,0x90,0x00,0x88,0x00,
0x8F,0xFE,0xA9,0x20,0x91,0x20,0x81,0x20,0x82,0x22,0x82,0x22,0x84,0x22,0x88,0x1E,},
/*欢 CBBB6 */
{0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,
0x18,0x40,0x18,0x60,0x24,0xA0,0x24,0x90,0x41,0x18,0x86,0x0E,0x38,0x04,0x00,0x00,},
/*迎 CD3AD */
{0x40,0x00,0x21,0x80,0x36,0x7C,0x24,0x44,0x04,0x44,0x04,0x44,0xE4,0x44,0x24,0x44,
0x25,0x44,0x26,0x54,0x24,0x48,0x20,0x40,0x20,0x40,0x50,0x00,0x8F,0xFE,0x00,0x00,},
/*您 CC4FA */
{0x08,0x00,0x09,0x00,0x11,0xFE,0x12,0x04,0x34,0x40,0x32,0x50,0x52,0x48,0x94,0x44,
0x11,0x44,0x10,0x80,0x00,0x00,0x29,0x04,0x28,0x92,0x68,0x12,0x07,0xF0,0x00,0x00},
//"!"
{0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,
0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}
};
void SendByte(uchar a)
{
uchar byte,i;
byte=~a;
for(i=0;i<8;i++)
{
SH=0;
if(byte&0X80)
DATA=1;
else
DATA=0;
SH=1;
byte<<=1;
}
}
void LeftDisplay(void) //左移,半个字一移
{
uchar i,j,scan,k;
for(i=0;i<6;i++) //hanzi中10个字,因一下显示四个字,所以j最大为j=10-4=6;
{
if(LeftFlag==1) //使之按了其他的键立即退出,转到其他模式
{
for(k=0;k<speed;k++) //移动速度
{
scan=0; //154译码
if(LeftFlag==1) //这里同样做处理
{
for(j=0;j<31;j+=2)
{
ST=0;
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
ST=1; //一个上升沿送数据
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
for(k=0;k<speed;k++)
{
scan=0;
if(LeftFlag==1)
{
for(j=0;j<31;j+=2)
{
ST=0;
SendByte(hanzi[i+4][j]); //另外半个字,注意这里,下面同理
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
}
else
break;
}
}
void RightDisplay(void) //右移
{
uchar i,j,k,scan;
for(i=0;i<6;i++) //字加一
{
if(RightFlag==1)
{
for(k=0;k<speed;k++)
{
scan=0;
if(RightFlag==1)
{
for(j=0;j<31;j+=2)
{
ST=0;
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
for(k=0;k<speed;k++)
{
scan=0;
if(RightFlag==1)
{
for(j=0;j<31;j+=2)
{
ST=0;
SendByte(hanzi[i][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+4][j+1]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
}
else
break;
}
}
void UpDisplay(void) //上移
{
uchar i,j,k,scan;
char temp=0;
for(i=0;i<6;)
{
if(UpFlag==1)
{
for(k=0;k<speed;k++)
{
scan=15-temp; //译码从最底下开始
if(UpFlag==1)
{
for(j=0;j<2*temp+1;j+=2)
{
ST=0;
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
temp++; //控制译码的
if(temp==16)
{
temp=0; //temp复位
i+=4; //显示下四个字
}
}
else
break;
}
}
void DownDisplay(void) //下移
{
uchar i,j,k,scan;
char temp=30;
for(i=0;i<6;)
{
if(DownFlag==1)
{
for(k=0;k<speed;k++)
{
scan=0;
if(DownFlag==1)
{
for(j=temp;j<31;j+=2) //开始j=30
{
ST=0;
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
temp-=2;
if(temp==-2)
{
temp=30;
i+=4;
}
}
else
break;
}
}
void ZJDisplay1(void) //只在下移基础上稍微改下(综合上移和下移)
{
uchar i,j,k,scan,temp;
for(i=0;i<6;)
{
if(ZJ1Flag==1)
{
for(k=0;k<speed;k++)
{
scan=0;
if(ZJ1Flag==1)
{
for(j=0;j<2*temp+1;j+=2)
{
ST=0;
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
temp++;
if(temp==16)
{
temp=0;
i+=4;
}
}
else
break;
}
}
void ZJDisplay2(void) //只在下移基础上稍微改下(综合上移和下移)
{
uchar i,j,k,scan,z=0;
char temp=30;
for(i=0;i<6;)
{
if(ZJ2Flag==1)
{
for(k=0;k<speed;k++)
{
scan=15-z; //z作译码控制
if(ZJ2Flag==1)
{
for(j=temp;j<31;j+=2)
{
ST=0;
SendByte(hanzi[i+3][j+1]);
SendByte(hanzi[i+3][j]);
SendByte(hanzi[i+2][j+1]);
SendByte(hanzi[i+2][j]);
SendByte(hanzi[i+1][j+1]);
SendByte(hanzi[i+1][j]);
SendByte(hanzi[i][j+1]);
SendByte(hanzi[i][j]);
ST=1;
EN=0;
P2=scan;
delay(5);
EN=1;
scan++;
}
}
else
break;
}
temp-=2;
z++;
if(temp==-2)
{
temp=30;
i+=4;
z=0; //z=15时就复位了
}
}
else
break;
}
}
void ClearFlag(void) //清标志位,调用子程序方便
{
LeftFlag=0;
RightFlag=0;
UpFlag=0;
DownFlag=0;
ZJ1Flag=0;
ZJ2Flag=0;
}
void KeyScan(void)
{
if(K1==0)
{
delay(10);
if(K1==0)
{
while(!K1);
ClearFlag();
LeftFlag=1;
}
}
if(K2==0)
{
delay(10);
if(K2==0)
{
while(!K2);
ClearFlag();
RightFlag=1;
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
while(!K3);
ClearFlag();
UpFlag=1;
}
}
if(K4==0)
{
delay(10);
if(K4==0)
{
while(!K4);
ClearFlag();
DownFlag=1;
}
}
if(K5==0)
{
delay(10);
if(K5==0)
{
while(!K5);
ClearFlag();
ZJ1Flag=1;
}
}
if(K6==0)
{
delay(10);
if(K6==0)
{
while(!K6);
ClearFlag();
ZJ2Flag=1;
}
}
}
void main(void)
{
TMOD=0X01;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
ET0=1;
EA=1;
TR0=1;
while(1)
{
if(LeftFlag==1)
{
LeftDisplay();
}
if(RightFlag==1)
{
RightDisplay();
}
if(UpFlag==1)
{
UpDisplay();
}
if(DownFlag==1)
{
DownDisplay();
}
if(ZJ1Flag==1)
{
ZJDisplay1();
}
if(ZJ2Flag==1)
{
ZJDisplay2();
}
}
}
void timer0(void) interrupt 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
KeyScan();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -