📄 yaoyao.c
字号:
/**********************************************************
程序名称:LED摇摇棒显示64*16像素
简要说明:外部中断方式INT0显示;取模方式:纵向取模、字节倒序,从上到下从左到右,纵向8点下高位
**********************************************************/
#include <AT89X52.h>
#define uchar unsigned char
#define uint unsigned int //宏定义
#define KEY P3_0 //定义画面切换按键
uchar KY; //KY作用在后面说明
uchar disp; //显示汉字指针
uchar pic=0,num=0,num1=0; //pic为按键次数;num为中断次数
void delay(uint z);//声明延时函数
uint a;//定义循环用变量
uchar code table[]={0xff,//全灭
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开
0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减
0x00,//全亮
};//定义循环用数据表格/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,最后全亮。循环!*/
void delay(uint z)//1ms延时子程序,通过z值改变延时时间
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar code love[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,
0x04,0x10,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0xF8,0x0F,0x00,0x00,
0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x10,
0x00,0x08,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x82,0x20,0x82,0x20,
0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*LOVE*/
};
uchar code loveyou[] = {
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,
0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0xFC,0x3F,
0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0xFC,0x00,
0x78,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,/*心形图案*/
};
/*uchar code hehe[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0x08,0x10,
0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*呵呵o(∩_∩)o图案*/
//};
//*/
unsigned char code hanzi[] = {
//"徐",
0x00,0x02,0x10,0x01,0x88,0x00,0xC4,0xFF,
0x23,0x00,0x20,0x22,0x50,0x12,0x48,0x4A,
0x44,0x82,0xC3,0x7F,0x44,0x02,0x48,0x0A,
0x50,0x13,0x30,0x32,0x10,0x00,0x00,0x00,
//"红",
0x20,0x22,0x30,0x67,0xAC,0x22,0x63,0x12,
0x20,0x12,0x10,0x52,0x04,0x40,0x04,0x40,
0x04,0x40,0x04,0x40,0xFC,0x7F,0x04,0x40,
0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00,
//"霞",
0x10,0x00,0x0C,0x00,0xC4,0xFF,0x6D,0x15,
0x55,0x15,0x55,0x15,0xC5,0x95,0x3F,0x80,
0x45,0x4D,0x55,0x55,0x55,0x25,0x6D,0x55,
0xC4,0x4D,0x14,0xC0,0x0C,0x40,0x00,0x00,
//"我",
0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,
0xFE,0x7F,0x23,0x02,0x22,0x21,0x20,0x10,
0xFF,0x09,0x20,0x06,0x22,0x1A,0xAC,0x61,
0x20,0x80,0x30,0xE0,0x20,0x00,0x00,0x00,
//"好",
0x10,0x40,0x10,0x22,0xF0,0x15,0x1F,0x08,
0x10,0x14,0xF0,0x63,0x80,0x00,0x82,0x00,
0x82,0x40,0x82,0x80,0xE2,0x7F,0x92,0x00,
0x8A,0x00,0xC6,0x00,0x80,0x00,0x00,0x00,
//"喜",
0x00,0x02,0x02,0x02,0x0A,0x02,0xEA,0xFA,
0xAA,0x4A,0xAA,0x4B,0xAA,0x4A,0xAF,0x4A,
0xAA,0x4A,0xAA,0x4B,0xAA,0x4A,0xEA,0xFE,
0x0B,0x0A,0x02,0x03,0x00,0x02,0x00,0x00,
//"欢",
0x04,0x10,0x34,0x08,0xC4,0x06,0x04,0x01,
0xC4,0x82,0x3C,0x8C,0x20,0x40,0x10,0x30,
0x0F,0x0C,0xE8,0x03,0x08,0x0C,0x08,0x10,
0x28,0x60,0x18,0xC0,0x00,0x40,0x00,0x00,
//"你",
0x40,0x00,0x20,0x00,0xF8,0xFF,0x07,0x00,
0x40,0x00,0x20,0x08,0x18,0x04,0x0F,0x43,
0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01,
0x28,0x06,0x18,0x0C,0x00,0x00,0x00,0x00,
//"!",
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7C,0x10,0xFE,0x3B,
0xFE,0x3B,0x7C,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*****函数声明*****/
void display1(void);
void display2(void);
void display3(void);
void display4(void);
/*****n(us)延时子程序*****/
void DelayUs(uint N)
{
uint x;
for(x=0; x<=N;x++);
}
/*****中断服务程序*****/
void intersvr0(void) interrupt 0 using 1
{
KY=~KY; //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
if(KY==0)
{if(num==120) num=0;
num++; //计算中断次数
num1++;
switch(pic) //选择画面
{
case 0:{display1();}break;
case 1:{display2();}break;
case 2:{display3();}break;
// case 3:{display4();}break;
default:{display1();}
}
}
}
/*****显示子程序1(汉字)*****/
void display1(void)
{
uchar i;
if(num1>15){disp++;num1=0;} //12个汉字分为3次显示完(每次显示4个),每中断10次切换
if(disp>2)disp=0;
DelayUs(3500); //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
for(i=0;i<64;i++)
{
P0=~hanzi[disp*128+i*2];
P1=~hanzi[disp*128+i*2+1];
// P0=~hanzi[i*2];
//P1=~hanzi[i*2+1];
DelayUs(100);
}
}
/*****显示子程序2(LOVE)*****/
void display2(void)
{
uchar i;
DelayUs(3000);
for(i=0;i<64;i++)
{
P0=~love[i*2];
P1=~love[i*2+1];
DelayUs(120);
}
}
/*****显示子程序3(心形图案)*****/
void display3(void)
{
uchar i;
DelayUs(3000);
for(i=0;i<64;i++)
{
P0=~loveyou[i*2];
P1=~loveyou[i*2+1];
DelayUs(120);
}
}
/*****显示子程序4(呵呵o(∩_∩)o图案)*****/
/*void display4(void)
{
uchar i;
DelayUs(2000);
for(i=0;i<64;i++)
{
P0=~hehe[i*2];
P1=~hehe[i*2+1];
DelayUs(120);
}
}*/
void ceshi()
{
P1=table[a];//将a所在的table中的值赋给P1口
P0=table[a];
delay(200);//1S延时子程序
a++;//a的值加一
if(a==50)//测试a是否等于42
a=0;//给a赋值
}
/*****主函数*****/
void main(void)
{
IT0=1;
EX0=1;
EA=1; //开中断,下降沿中断
KY=0;
while(1) //主程序中只检测按键
{ ceshi();
if(num<50) pic=0;
else if(50<num&&num<100) pic=1; //画面切换键按下
else if(100<num&&num<150) pic=2;
//else if(90<num&&num<120) pic=3;
}
}
/*****END*****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -