//按键k1文字闪烁,k2文字平移,k3符号闪烁,k4退出
#include <reg51.h>
#include <intrins.h>
#define GPIO_KEY P1 //独立键盘用P1口
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
//---全局变量声明--//
ulong column; //点阵列
ulong row; //点阵行
ulong dt;
//点阵显示数组
uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
//--王--//
uchar code tab1[] = {
0,0,252,31,128,0,128,0,128,0,128,0,128,0,248,
15,128,0,128,0,128,0,128,0,128,0,254,63,0,0,0,0};
//--李--//
uchar code tab2[] = {
128,0,128,0,254,63,160,2,144,4,136,8,6,48,240,
3,0,1,128,0,254,63,128,0,128,0,224,0,0,0,0,0};
//--任--//
uchar code tab3[] = {
16,0,16,28,208,3,8,2,8,2,12,2,10,2,232,63,8,2,
8,2,8,2,8,2,8,2,200,31,0,0,0,0};
//--徐-//
uchar code tab4[] = {
16,2,16,2,8,5,132,8,82,16,176,47,8,2,12,2,202,
31,8,2,72,18,72,34,40,34,136,3,0,0,0,0};
//--桃心--//
uchar code xin[] = {
0,0,28,56,252,63,254,127,255,255,207,243,135,
225,7,224,15,240,30,120,60,60,120,30,240,15,224,7,192,3,128,1};
//--五角星--//
uchar code wujiao[] = {
128,1,128,1,192,3,192,3,192,3,96,6,127,254,6,
96,28,56,48,12,48,12,152,27,248,30,56,28,12,48,0,0};
//--圆--//
uchar code yuan[] = {
0,0,224,7,120,30,28,56,28,56,14,112,14,112,14,
112,14,112,14,112,28,56,28,56,120,30,224,7,0,0,0,0};
uchar *p[] = {tab1, tab2, tab3, tab4};
uchar *c[] = {xin, yuan,wujiao};
//函数声明
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0);
void translation();//由上而下平移
void twinkle1(); //文字闪烁
void twinkle2(); //符号闪烁
void Delay10ms(uint c);//延时10ms
unsigned char Key_Scan();//读取键值
int k, i,j, ms;
uchar keyNum;
/*************主函数*****************************/
void main(void)
{
while(1)
{
HC595SendData(0xff,0xff,0,0); //清屏
keyNum=Key_Scan();
switch (keyNum)
{
case(0xFE) : //返回按键K1的数据
twinkle1(); //文字闪烁
break;
case(0xFD) : //返回按键K2的数据
translation();//平移
break;
case(0xFB) : //返回按键K3的数据
twinkle2(); //符号闪烁
break;
case(0xF7) : //返回按键K4的数据
HC595SendData(0xff,0xff,0,0); //清屏
break;
default:
break;
}
}
}
//符号闪烁
void twinkle2()
{
while(keyNum!=0xF7)
{
for(i = 0; i <3; i++) //总共5个字
{
for(ms = 50; ms > 0; ms--) //显示50次,即肉眼可识别的停留时间
{
for(k = 0; k < 16; k++) //显示一个字
{
//--因为字模软件取的数组是高电平有效,所以列要取反--//
HC595SendData(~(*(c[i] + 2*k + 1)),~(*(c[i] + 2*k )),
tab0[2*k],tab0[2*k + 1]);
keyNum=Key_Scan();
if(keyNum==0xF7)
break;
}
HC595SendData(0xff,0xff,0,0); //清屏
if(keyNum==0xF7)
break;
}
if(keyNum==0xF7)
break;
}
}
}
//文字闪烁
void twinkle1()
{
while(keyNum!=0xF7)
{
for(i = 0; i < 4; i++) //总共4个字
{
for(ms = 50; ms > 0; ms--) //显示50次,即肉眼可识别的停留时间
{
for(k = 0; k < 16; k++) //显示一个字
{
//--因为字模软件取的数组是高电平有效,所以列要取反--//
HC595SendData(~(*(p[i] + 2*k + 1)),~(*(p[i] + 2*k )),
tab0[2*k],tab0[2*k + 1]);
keyNum=Key_Scan();
if(keyNum==0xF7)
break;
}
HC595SendData(0xff,0xff,0,0); //清屏
if(keyNum==0xF7)
break;
}
if(keyNum==0xF7)
break;
}
}
}
//由上而下平移
void translation()
{
j=0;
while(keyNum!=0xf7)
{
for(ms = 10; ms > 0; ms--) //移动定格时间设置
{
for(k = 0; k < 16; k++) //显示一个字
{
HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),
tab0[2*k],tab0[2*k + 1]);
//因为字模软件取的数组是高电平有效,所以列要取反
keyNum=Key_Scan();
if(keyNum==0xF7)
break;
}
HC595SendData(0xff,0xff,0,0); //清屏
if(keyNum==0xF7)
break;
}
j++;
if(j == (3*16) )
{
j = 0;
}
}
}
//读取键值
unsigned char Key_Scan()
{
unsigned char keyValue = 0 , i; //保存键值
//--检测按键1--//
if (GPIO_KEY != 0xFF) //检测按键K1是否按下
{
Delay10ms(1); //消除抖动
if (GPIO_KEY != 0xFF) //再次检测按键是否按下
{
keyValue = GPIO_KEY;
i = 0;
while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开
{
Delay10ms(1);
i++;
}
}
}
return keyValue; //将读取到键值的值返回
}
//延时十毫秒
void Delay10ms(uint c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
//通过74HC595发送四个字节的数据
void HC595SendData(uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT3 >> 7 ; //从高位到低位
BT3 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT2 >>7; //从高位到低位
BT2 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT1 >> 7; //从高位到低位
BT1 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7; //从高位到低位
BT0 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--输出--//
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
R_CLK = 0; //set dataline low
}