📄 110500618_2.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void dispup();
void dispdown();
void scanrow();
void scanlist();
void fullsrc();
void dispsingle(); //定义各子程序
uchar code datcode[]={0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,
0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,
0x7F,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00, //中
0x00,0x04,0x7F,0xFE,0x40,0x24,0x5F,0xF4,
0x41,0x04,0x41,0x04,0x41,0x44,0x4F,0xE4,
0x41,0x04,0x41,0x44,0x41,0x24,0x41,0x04,
0x5F,0xF4,0x40,0x04,0x7F,0xFC,0x40,0x04, //国
0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x20,
0x10,0x10,0x20,0x08,0x7F,0xFC,0x00,0x04,
0x00,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10, //台
0x40,0x44,0x3F,0xFE,0x10,0xA0,0x02,0xA8,
0x86,0xA6,0x68,0xA2,0x27,0xF8,0x08,0x08,
0x17,0xF8,0x24,0x00,0xE7,0xFC,0x20,0x04,
0x20,0x04,0x20,0x44,0x20,0x28,0x20,0x10, //湾
};
uchar keyval; //定义按键值
//delay参数
uchar t;
sbit KEY = P0^0; //按键接口
void delay(t)
{ uint i;
for(i=0;i<t;i++);
}
void clrsrc() //清屏
{
P2 = 0xff;
P3 = 0xff;
delay(20);
}
void keydeal() //按键处理
{
while(KEY==0) //消除抖动
;
delay(50);
keyval++; //按价值加1
if(keyval>5)
keyval = 0;
switch(keyval)
{
case 0:dispup(); break; //向上移
case 1:scanrow(); break; //行扫
case 2:scanlist(); break; //列扫
case 3:fullsrc(); break; //全屏
case 4:dispdown(); break; //向下移
case 5:dispsingle();break; //单字
}
}
void dispup() //向上移
{
uchar i,k,j;
while(keyval==0)
{
for(k=0;k<=63;k++) //偏移量
{
for(j=0;j<10;j++) //重复显示10次
{
for(i=0;i<16;i++) //行扫描16次
{
P1 = i;
P2 = ~datcode[(i*2+2*k)%128]; //按偏移量取字模数据
P3 = ~datcode[(i*2+1+2*k)%128];
if(KEY == 0)
keydeal(); //判断是否有按键动作
if(keyval != 0)
break;
delay(50);
clrsrc();
}
if(keyval != 0)
break;
}
if(keyval != 0)
break;
}
if(keyval != 0)
break;
}
}
void dispdown() //向下移
{
uchar i,k,j;
while(keyval==4)
{
for(k=0;k<=63;k++) //偏移量
{
for(j=0;j<10;j++) //重复显示
{
for(i=0;i<16;i++) //行扫描信号
{
P1 = i;
P2 = ~datcode[(i*2+96-2*k)%128]; //按偏移取字模数据
P3 = ~datcode[(i*2+1+96-2*k)%128];
if(KEY == 0) //判断是否有按键
keydeal();
if(keyval != 4)
break;
delay(50);
clrsrc(); //清屏
}
if(keyval != 4)
break;
}
if(keyval != 4)
break;
}
if(keyval != 4)
break;
}
}
void scanrow() //行扫描
{
uchar i;
while(keyval == 1)
{
for(i=0;i<=15;i++) //行扫描信号
{
P1 = i;
P2 = 0x00;
P3 = 0x00;
delay(10000);
clrsrc(); //清屏
if(KEY==0) //判断按键
keydeal();
if(keyval != 1)
break;
}
}
}
void scanlist() //列扫描
{
uchar i,j,k,r,x;
while(keyval == 2)
{
for(r=0;r<=1;r++) //判断P2或P3输出数据的参数
{
for(k=0;k<8;k++) //数据移位量
{
x = ~(0x80>>k); //移位
for(i=0;i<25;i++) //重复显示
{
for(j=0;j<16;j++) //行扫描信号
{
P1 = j;
switch(r) //判断P2、P3输出状态
{case 0:
P2 = x;
P3 = 0xff;
delay(11);
clrsrc();
break;
case 1:
P2 = 0xff;
P3 = x;
delay(11);
clrsrc();
}
if(KEY==0) //判断按键
keydeal();
if(keyval != 2)
break;
}
if(keyval != 2)
break;
}
if(keyval != 2)
break;
}
if(keyval != 2)
break;
}
}
}
void fullsrc() //全屏
{
uchar i;
while(1)
{
for(i=0;i<16;i++) //行扫描信号
{
P1 = i;
P2 = 0x00;
P3 = 0x00;
if(KEY == 0) //判断按键
keydeal();
if(keyval !=3)
break;
delay(50);
clrsrc(); //清屏
}
if(keyval != 3)
break;
}
}
void dispsingle() //单字显示
{
uchar i,k,j;
while(keyval==5)
{
for(k=0;k<=3;k++) //字数为4
{
for(j=0;j<45;j++) //重复显示
{
for(i=0;i<16;i++) //行扫描信号
{
P1 = i;
P2 = ~datcode[i*2+32*k]; //取字模数据
P3 = ~datcode[i*2+1+32*k];
if(KEY == 0) //判断按键
keydeal();
if(keyval != 5)
break;
delay(50);
clrsrc(); //清屏
}
if(keyval != 5)
break;
}
if(keyval != 5)
break;
}
if(keyval != 5)
break;
}
}
void main()
{
keyval = 0;
while(1)
{
dispup();
KEY = 1;
if(KEY==0)
keydeal();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -