200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > led16*16点阵实验c语言 基于单片机的64*16LED点阵电子显示屏设计 pcb图+原理图+源程序...

led16*16点阵实验c语言 基于单片机的64*16LED点阵电子显示屏设计 pcb图+原理图+源程序...

时间:2018-09-23 05:52:12

相关推荐

led16*16点阵实验c语言 基于单片机的64*16LED点阵电子显示屏设计 pcb图+原理图+源程序...

/*64*16点阵屏的显示点阵屏的显示*/

#include

#include

#include

#define ulongunsigned long

#define uchar unsigned char

#define uint unsigned int

#define DATAOUT P2 //指定P2口做为输出

sfr ISP_CONTR = 0xe7;

sbit DATA=DATAOUT^0; //列数据输出位

sbit SCLH=DATAOUT^1; //列扫描时钟位

sbit SCLT=DATAOUT^2; //列数据锁存位

sbit AB=DATAOUT^4;//行数据输出位

sbit SCK=DATAOUT^5;//行扫描时钟位

sbit key1 = P3^2;//键盘位定义

sbit key2 = P0^1;

sbit key3 = P0^2;

sbit key4 = P3^3;

unsigned int idata numyear;

unsigned char idata numt0,num,numf,nums,numday,nummonth; //全局变量定义numt0 为定时器0计数,num 为时间秒计数,numf 分钟计数,nums 小时计数

unsigned char idata lhj[128]; //128字节RAM做为64*16点阵屏显示缓存

void display(); //做为点阵扫描函数,将显示缓存的数据输出到点阵屏

void display2();

void displayS(unsigned int timer);//指定时间扫描显示

void displayS2(unsigned int );

void displaymove(unsigned char *lp,unsigned char c,unsigned char timer); //显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,

void displaymove2(unsigned char *,unsigned char ,unsigned char );//timer是移动的速度

void displaymovetb(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer);

void displaymovetb2(unsigned char ,unsigned char *,unsigned char ,unsigned char);

void init(); //初始化函数

void displayshijian(); //时间显示函数//上下移动内容,din:1为向下,0为向上,

void displayshijian2();//lp指向要移入的内容表示有几个汉字要移,timer为移动速度

//void delay(unsigned int z);//延时子函数

/******************字模*************************/

code unsigned char DIAN[32]={

0x00,0x00,0x00,0x00,0x1F,0xF8,0x11,0x10,

0x11,0x10,0x11,0x10,0x11,0x10,0xFF,0xFE,

0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,

0x1F,0xF9,0x00,0x01,0x00,0x0F,0x00,0x00,

}; //电

code unsigned char QI[32]={

0x04,0x00,0x08,0x00,0x32,0x00,0xE2,0x00,

0x2A,0x00,0x2A,0x00,0x2A,0x00,0x2A,0x00,

0x2A,0x00,0x2A,0x00,0x2A,0x00,0x2B,0xF0,

0x20,0x0C,0x20,0x02,0x00,0x0F,0x00,0x00,

}; //气

code unsigned char GONG[32]={

0x00,0x04,0x20,0x04,0x20,0x04,0x20,0x04,

0x20,0x04,0x20,0x04,0x20,0x04,0x3F,0xFC,

0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,

0x20,0x04,0x20,0x04,0x00,0x04,0x00,0x00,

};//工

code unsigned char CHENG[32]={

0x22,0x10,0x22,0x60,0x23,0x80,0x7F,0xFF,

0xC2,0x80,0x42,0x60,0x00,0x02,0x7A,0x92,

0x42,0x92,0x42,0x92,0x42,0xFE,0x42,0x92,

0x42,0x92,0x7A,0x92,0x00,0x82,0x00,0x00,

};//程

code unsigned char LAO[32]={

0x04,0x08,0x04,0x10,0x24,0x20,0x24,0x40,

0x24,0xFC,0x24,0xA2,0xFD,0x22,0x26,0x22,

0x24,0x42,0x2C,0x42,0x14,0x42,0x24,0x82,

0x44,0x1E,0x04,0x00,0x04,0x00,0x00,0x00,

};//老

code unsigned char SHI1[32]={

0x00,0x00,0x3F,0xE1,0x00,0x02,0x00,0x0C,

0xFF,0xF0,0x00,0x00,0x40,0x00,0x27,0xF8,

0x24,0x00,0x24,0x00,0x7F,0xFF,0x24,0x10,

0x24,0x08,0x27,0xF0,0x20,0x00,0x00,0x00,

};//师

code unsigned char MEN[32]={

0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,

0xE0,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,

0x60,0x00,0x00,0x00,0x20,0x00,0x20,0x02,

0x20,0x01,0x3F,0xFE,0x00,0x00,0x00,0x00,

}; //们

code unsigned char HAO[32]={

0x08,0x02,0x08,0x44,0x0F,0xA8,0xF8,0x10,

0x08,0x68,0x0F,0x86,0x00,0x00,0x01,0x00,

0x41,0x02,0x41,0x01,0x47,0xFE,0x49,0x00,

0x51,0x00,0x61,0x00,0x01,0x00,0x00,0x00,

};//好

code unsigned char BEI[32] ={

0x00,0x04,0x04,0x06,0x04,0x04,0x04,0x08,

0x04,0x08,0xFF,0xFF,0x00,0x00,0x00,0x00,

0x00,0x00,0xFF,0xFC,0x02,0x02,0x04,0x02,

0x08,0x02,0x10,0x02,0x00,0x1E,0x00,0x00,

};//北

code unsigned char JING[32] = {

0x20,0x00,0x20,0x02,0x20,0x04,0x27,0xD8,

0x24,0x40,0x24,0x42,0xA4,0x41,0x64,0x7E,

0x24,0x40,0x24,0x40,0x24,0x40,0x27,0xD0,

0x20,0x08,0x20,0x06,0x20,0x00,0x00,0x00,

};//京

code unsigned char SHI[32] = {

0x00,0x00,0x3F,0xFC,0x21,0x08,0x21,0x08,

0x21,0x08,0x3F,0xFC,0x00,0x00,0x08,0x00,

0x08,0x80,0x08,0x60,0x08,0x02,0x08,0x01,

0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,

}; //时

code unsigned char JIAN[32] = {

0x00,0x00,0x1F,0xFF,0x80,0x00,0x60,0x00,

0x00,0x00,0x0F,0xF8,0x48,0x88,0x48,0x88,

0x48,0x88,0x4F,0xF8,0x40,0x00,0x40,0x02,

0x40,0x01,0x7F,0xFE,0x00,0x00,0x00,0x00,

}; //间

code unsigned char XL[32]={

0x00,0x00,0x07,0xc0,0x18,0x30,0x20,0x0C,

0x40,0xC4,0x8C,0x62,0x8C,0x32,0x80,0x12,

0x80,0x12,0x80,0x12,0x8C,0x32,0x4C,0x64,

0x40,0xC4,0x20,0x08,0x18,0x60,0x07,0xC0,

}; //笑脸

code unsigned char ANZHUO[32]={

0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xE0,

0x00,0x00,0x9B,0xF0,0x3B,0xFE,0x6B,0xFE,

0x7B,0xF0,0x6B,0xFE,0x3B,0xFE,0x9B,0xF0,

0x00,0x00,0x03,0xE0,0x03,0xE0,0x00,0x00,

}; //安卓

code unsigned char HOU[32]={

0x00,0x01,0x00,0x02,0x03,0xfC,0x02,0x30,

0x02,0x10,0x02,0x18,0xFE,0x16,0x12,0x10,

0x12,0x18,0x12,0x16,0x12,0x10,0x13,0xf0,

0x10,0x08,0x10,0x07,0x00,0x00,0x00,0x00,

}; //“点”

code unsigned char MIN[32]={

0x01,0x00,0x02,0x01,0x04,0x02,0x09,0x04,

0x11,0x18,0x61,0xE0,0x01,0x00,0x01,0x02,

0x01,0x01,0xC1,0x02,0x31,0xFC,0x08,0x00,

0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x00,

}; //“分”

code unsigned char el[32]={

0x00,0x00,0x07,0x0C,0x10,0x14,0x10,0x24,

0x10,0x44,0x11,0x84,0x0e,0x0c,0x00,0x00,

0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,

0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,}; //20

code unsigned char yw[32]={

0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,

0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,

0x00,0x00,0x3e,0x02,0x22,0x02,0x22,0x02,

0x22,0x04,0x22,0x08,0x21,0xf0,0x00,0x00,}; //15

code unsigned char NIAN2[32]={

0x00,0x20,0x04,0x20,0x18,0x20,0xE3,0xE0,

0x22,0x20,0x22,0x20,0x22,0x20,0x22,0x20,

0x3F,0xFF,0x22,0x20,0x22,0x20,0x22,0x20,

0x22,0x20,0x20,0x20,0x00,0x20,0x00,0x00,

}; //年

code unsigned char nop[32]={

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,

};

code unsigned char lw[32]={

0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,

0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,

0x00,0x00,0x3e,0x02,0x22,0x02,0x22,0x02,

0x22,0x04,0x22,0x08,0x21,0xf0,0x00,0x00,}; //05

code unsigned char YUE[32]={

0x00,0x01,0x00,0x02,0x00,0x0C,0x3F,0xF0,

0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,

0x22,0x40,0x22,0x40,0x22,0x42,0x22,0x41,

0x3F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,

}; //月

code unsigned char shl[32]={

0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,

0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,

0x00,0x00,0x0e,0xf8,0x10,0x84,0x20,0x84,

0x20,0x84,0x20,0x84,0x20,0x78,0x00,0x00,}; //16

code unsigned char RI2[32]={

0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,

0x41,0x02,0x41,0x02,0x41,0x02,0x41,0x02,

0x41,0x02,0x41,0x02,0x41,0x02,0x7F,0xFF,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};//日

code unsigned char xie[32]={

0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,

0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,

0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,

0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,

};

code unsigned char xie1[32]={

0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,

0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,

0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,

0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,

};

code unsigned char LAO1[32]={

0x04,0x08,0x04,0x10,0x24,0x20,0x24,0x40,

0x24,0xFC,0x24,0xA2,0xFD,0x22,0x26,0x22,

0x24,0x42,0x2C,0x42,0x14,0x42,0x24,0x82,

0x44,0x1E,0x04,0x00,0x04,0x00,0x00,0x00,

};//老

code unsigned char SHI2[32]={

0x00,0x00,0x3F,0xE1,0x00,0x02,0x00,0x0C,

0xFF,0xF0,0x00,0x00,0x00,0x00,0x2f,0xF8,

0x28,0x00,0x28,0x00,0x3F,0xFF,0x28,0x10,

0x28,0x08,0x2f,0xF0,0x20,0x00,0x00,0x00,

};//师

//时数据

code unsigned char c[3][16]={

///*--文字:0--*//*--楷体_GB231212;此字体下对应的点阵为:宽x高=8x16 --*/

{0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,},

{///*--文字:1--*/

0x00,0x00,0x08,0x04,0x08,0x04,0x1f,0xfc,0x00,0x04,0x00,0x04,0x00,0x07,0x10,0x10,},

{///*--文字:2--*/

0x00,0x00,0x07,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0e,0x0c,0x00,0x00,}

};

code unsigned char d[10][16]={

{///*--文字:0--*/

0x00,0x00,0x07,0xe0,0x08,0x10,0x10,0x08,0x10,0x08,0x08,0x10,0x07,0xe0,0x00,0x00,

},

{///*--文字:1--*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,

0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,

},

{///*--文字:2--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,

},

{///*--文字:3--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

},

{///*--文字:4--*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,

},

{///*--文字:5--*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

},

{///*--文字:6--*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

},

{///*--文字:7--*/

0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,

},

{///*--文字:8--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,

},

{///*--文字:9--*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,}

};

//分数据

code unsigned char b[10][16]={

{///*--文字:0--*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

},

{///*--文字:1--*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,

},

{///*--文字:2--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,

},

{///*--文字:3--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

},

{///*--文字:4--*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,

},

{///*--文字:5--*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

},

{///*--文字:6--*/

0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

},

{///*--文字:7--*/

0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,

},

{///*--文字:8--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,

},

{///*--文字:9--*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,

}

};

code unsigned char a[6][16]={

{///*--文字:0--*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,

},

{///*--文字:1--*/

0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,

},

{///*--文字:2--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,

},

{///*--文字:3--*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

},

{///*--文字:4--*/

0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,

},

{///*--文字:5--*/

0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,

}

};

void init() //初始化程序

{

TMOD = 0x01; //定时器0为工作方式1

TH0 = (65536-50000)/256; //定时50mS

TL0 = (65536-50000)%256;

EA = 1; //开总中断

ET0 = 1; //开定时器0中断

EX0 = 1; //开外部中断0

EX1 = 1; //开外部中断1

IT0 = 0; //设置外部中断0的中断方式为0 低电平触发

IT1 = 0;

TR0 = 1; //启动定时器0

num = 0;

nums = 12;

numf = 30;

numyear = ;

nummonth = 5;

numday = 15;

}

void displayshijian()//显示时间函数

{

unsigned char i,j,p1,k1,p2,k2;

p1 = nums/10;

k1 = nums%10; //小时数据

p2 = numf/10;

k2 = numf%10; //分钟数据

for(i=0;i<128;i++) //显示缓存清空

{

lhj[i]=0;

}

for(i=0,j=0;i<128;)

{

lhj[i]=c[p1][j];

lhj[i+1]=d[k1][j];

i=i+8;

j=j+1;

}

for(i=2,j=0;i<128;)

{

lhj[i]=HOU[j];

lhj[i+1]=HOU[j+1];

i=i+8;

j=j+2;

}

for(i=4,j=0;i<128;)

{

lhj[i]=a[p2][j];

lhj[i+1]=b[k2][j];

i=i+8;

j=j+1;

}

for(i=6,j=0;i<128;)

{

lhj[i]=MIN[j];

lhj[i+1]=MIN[j+1];

i=i+8;

j=j+2;

}

displayS(1);

}

void displayshijian2()//显示时间函数

{

unsigned char i,j,p1,k1,p2,k2;

p1 = nums/10;

k1 = nums%10; //小时数据

p2 = numf/10;

k2 = numf%10; //分钟数据

for(i=0;i<128;i++) //显示缓存清空

{

lhj[i]=0;

}

for(i=0,j=0;i<128;)

{

lhj[i]=c[p1][j];

lhj[i+1]=d[k1][j];

i=i+8;

j=j+1;

}

for(i=2,j=0;i<128;)

{

lhj[i]=HOU[j];

lhj[i+1]=HOU[j+1];

i=i+8;

j=j+2;

}

for(i=4,j=0;i<128;)

{

lhj[i]=a[p2][j];

lhj[i+1]=b[k2][j];

i=i+8;

j=j+1;

}

for(i=6,j=0;i<128;)

{

lhj[i]=MIN[j];

lhj[i+1]=MIN[j+1];

i=i+8;

j=j+2;

}

displayS(1);

}

void displaynyr()//年月日显示程序

{

unsigned char i,j,n1,n2,n3,n4,p1,k1,p2,k2; //n年 p1k1月 p2k2日

n1 = numyear/1000;

n2 = (numyear%1000)/100;

n3 = (numyear%100)/10;

n4 = numyear%10;

p1 = nummonth/10;

k1 = nummonth%10; //月数据

p2 = numday/10;

k2 = numday%10; //日数据

for(i=0;i<128;i++) //显示缓存清空

{

lhj[i]=0;

}

for(i=0,j=0;i<128;)

{

lhj[i]=d[n1][j];

lhj[i+1]=d[n2][j];

i=i+8;

j=j+1;

}

for(i=2,j=0;i<128;)

{

lhj[i]=d[n3][j];

lhj[i+1]=d[n4][j];

i=i+8;

j=j+1;

}

for(i=4,j=0;i<128;)

{

lhj[i]=NIAN2[j];

lhj[i+1]=NIAN2[j+1];

i=i+8;

j=j+2;

}

displayS(2);

displaymovetb(1,0,4,2);

for(i=0,j=0;i<128;)

{

lhj[i]=d[p1][j];

lhj[i+1]=d[k1][j];

i=i+8;

j=j+1;

}

for(i=2,j=0;i<128;)

{

lhj[i]=YUE[j];

lhj[i+1]=YUE[j+1];

i=i+8;

j=j+2;

}

for(i=4,j=0;i<128;)

{

lhj[i]=d[p2][j];

lhj[i+1]=d[k2][j];

i=i+8;

j=j+1;

}

for(i=6,j=0;i<128;)

{

lhj[i]=RI2[j];

lhj[i+1]=RI2[j+1];

i=i+8;

j=j+2;

}

displayS(3);

displaymovetb(1,0,4,1);

}

void displaynyr2()

{

unsigned char i,j,p1,k1,p2,k2; //n年 p1k1月 p2k2日

p1 = nummonth/10;

k1 = nummonth%10; //月数据

p2 = numday/10;

k2 = numday%10; //日数据

for(i=0,j=0;i<128;)

{

lhj[i]=d[p1][j];

lhj[i+1]=d[k1][j];

i=i+8;

j=j+1;

}

for(i=2,j=0;i<128;)

{

lhj[i]=YUE[j];

lhj[i+1]=YUE[j+1];

i=i+8;

j=j+2;

}

for(i=4,j=0;i<128;)

{

lhj[i]=d[p2][j];

lhj[i+1]=d[k2][j];

i=i+8;

j=j+1;

}

for(i=6,j=0;i<128;)

{

lhj[i]=RI2[j];

lhj[i+1]=RI2[j+1];

i=i+8;

j=j+2;

}

displayS2(1);

}

void extern1() interrupt 2//外部中断1

{

displaynyr2();

if((key2 == 0)&&(key3 ==0))

ISP_CONTR = 0x20;

if(key3 == 0)

{

if(key3 == 0)

{

numday++;

if(numday > 31)

numday = 1;

}

}

if(key2 == 0)

{

if(key2 == 0)

{

nummonth++;

if(nummonth > 12)

nummonth = 1;

}

}

key4 = 1;

}

void extern0() interrupt 0//外部中断0

{

displayshijian2();

if(key2 == 0) //key2按键扫描,按下则 小时nums加1

{

if(key2 == 0)

{

nums++;

if(nums > 23)

nums =0;

}

}

if(key3 == 0) //key3按键扫描,按下则 分钟numf加1

{

if(key3 == 0)

{

numf++;

if(numf > 59)

numf =0;

}

}

key1 = 1; //P3.2口赋高电平 防止下次重复进入中断

}

void T0timer() interrupt 1 //定时器0中断

{

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256;

numt0++;

if(numt0 >= 40)//24M hz40次为一秒

{

numt0 = 0;

num++;

if(num > 59)

{ num = 0;

numf++;

}

}

}

void displaytu_an()

{

unsigned char i,j;

for(i=2,j=0;i<128;) //复制笑脸图案到中间

{

lhj[i]=XL[j];

lhj[i+1]=XL[j+1];

i=i+8;

j=j+2;

}

for(i=4,j=0;i<128;) //复制安卓机器人图案到中间

{

lhj[i]=ANZHUO[j];

lhj[i+1]=ANZHUO[j+1];

i=i+8;

j=j+2;

}

displayS(4); //显示图案约2秒

}

void shijianzz()

{

/***************************************************///时间自增

if(numf > 59) //分钟numf,小时nums自增

{

numf = 0;

nums++;

if(nums > 23)

{

nums = 0;

numday++;

switch(nummonth)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:if(numday > 31)

{ nummonth++;

numday=1;

if(nummonth > 12)

{

nummonth =1;

numyear++;

}

};

break;

case 4:

case 6:

case 9:

case 11:if(numday > 30)

{ nummonth++;

numday=1;

if(nummonth > 12)

{nummonth =1;

numyear++;

}

};

break;

case 2: {

if(numyear%4==0)

if(numday > 29)

{

nummonth++;

numday=1;

if(nummonth > 12)

{nummonth = 1;

numyear++;

}

}

else

if(numday > 28)

{

nummonth++;

numday=1;

if(nummonth > 12)

{nummonth =1;

numyear++;

}

}

};break;

}

}

}

/*********************************************************/

}

void displayXNKL()

{

/*********逐个显示“老师们好”************/

uchar i,j;

for(i=0,j=0;i<128;)

{

lhj[i]=LAO[j];

lhj[i+1]=LAO[j+1];

i=i+8;

j=j+2;

}

displayS(2);

for(i=2,j=0;i<128;)

{

lhj[i]=SHI1[j];

lhj[i+1]=SHI1[j+1];

i=i+8;

j=j+2;

}

displayS(2);

for(i=4,j=0;i<128;)

{

lhj[i]=MEN[j];

lhj[i+1]=MEN[j+1];

i=i+8;

j=j+2;

}

displayS(2);

for(i=6,j=0;i<128;)

{

lhj[i]=HAO[j];

lhj[i+1]=HAO[j+1];

i=i+8;

j=j+2;

}

displayS(2);

/**********************************/

}

/********************** 主函数 *************************************/

void main(void)

{

init(); //初始化程序

displaytu_an();

displayS(4);

while(1)

{

shijianzz(); //时间自增函数

displaymovetb(1,0,4,3); //向下清屏

displaymove(DIAN,4,1); //左跑马 “电气工程”

displayS(2);

displaymovetb(1,0,4,2); //向下卷帘清屏

displayXNKL(); //由左往右显示‘老师们好’

displayS(2);

displaymove(0,4,2);//左跑马清屏

displaymovetb(1,BEI,4,3); //向下显示 “北京时间”

displayS(2);

displaymovetb(0,el,4,1);

displayS(2);

displaymovetb(1,lw,4,2);

displayS(2);

displaymove(xie,4,1);

displayS(3);

displaymovetb(1,0,4,3); //向下清屏

displaytu_an();

displayS(2);

/*displaymovetb(1,0,4,1);

displaynyr(); //显示****年**月**日

displayshijian();//调用显示**点**分 时间函数

displayS(4000);*/

}

}

/********************** 主函数 *************************************/

void display2()//显示子函数 中断调用才使用

{

unsigned char i,ia,tmp;

unsigned int j;

DATAOUT=0XFF;

AB=0;//将行数据位清0,准备移位

for(i=0;i<16;i++)

{

SCK=0;

SCLT=0;

for(ia=8;ia>0;)

{//每行64个点,循环位移8个字节

ia--; //循环四次

tmp=~lhj[i*8+ia];

for(j=0;j<8;j++)

{//循环两次,每次移一个字节,

SCLH=0;

DATA=tmp&0x01;//将数据低位做输出

tmp>>=1;

SCLH=1; //将DATA上的数据移入寄存器

}//移入单字节结束

}//移入两个字节结束

DATAOUT|=0X24;

//等价于SCK=1;

// SCLT=1;

AB=1;

}

j=100;

while(j--); //每一行的显示,保持6个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度

SCK=0;

SCK=1;//将最后一行数据移出

}

void display()//显示子函数

{

unsigned char i,ia,tmp;

unsigned int j;

DATAOUT=0XFF;

AB=0;//将行数据位清0,准备移位

for(i=0;i<16;i++)

{

SCK=0;

SCLT=0;

for(ia=8;ia>0;)

{//每行64个点,循环位移8个字节

ia--; //循环四次

tmp=~lhj[i*8+ia];

for(j=0;j<8;j++)

{//循环两次,每次移一个字节,

SCLH=0;

DATA=tmp&0x01;//将数据低位做输出

tmp>>=1;

SCLH=1; //将DATA上的数据移入寄存器

}//移入单字节结束

}//移入两个字节结束

DATAOUT|=0X24;

//等价于SCK=1;

// SCLT=1;

AB=1;

}

j=100;

while(j--); //每一行的显示,保持6个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度

SCK=0;

SCK=1;//将最后一行数据移出

}

void displayS2(unsigned int timer) //指定时间扫描显示函数 中断调用时用

{

unsigned char i;

while(timer--)

{ //当timer=1时,大约1秒时间

i=20;

while(i--)

display2();

}

}

void displayS(unsigned int timer) //指定时间扫描显示函数

{

unsigned char i;

while(timer--)

{ //当timer=1时,大约1秒时间

i=20;

while(i--)

display();

}

}

void displaymove(unsigned char *lp,unsigned char c,unsigned char timer)//左移显示函数,LP指向要显示第一个字的首地址,C表示显示字的个数,

//timer是移动的速度

{

unsigned char i=0,j=0,ia=0;

unsigned int tmp=0,timerc=0;

unsigned char tmp2[16];

c*=2;

for(i=0;i<16;i++)

tmp2[i]=0; //将缓冲区清0,

while(c)

{

if(lp!=0)

{ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出

tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份

for(i=0;i<16;i++)

{

tmp2[i]=lp[i*2+tmp]; //取半个汉字点阵数据,16字节

}

if(tmp)//当tmp为1时,表时一个字数组处理完成,将地址转到下一个字

lp+=32;

}

//--------------

tmp=8;//变量再次利用

while(tmp)

{ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲

ia=0;//做为点阵数组的元素

for(i=0;i<16;i++)

{ //移动是16行同时移,因此要处理16个字节

for(j=0;j<7;j++)

{//一行32个点四字节,有三字节在显示缓冲中移动

lhj[ia]<<=1;//移当前显示缓冲的半行字节

if(lhj[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理

lhj[ia]++;

ia++;

}

lhj[ia]<<=1; //一行32个点四字节,将最后一字节用下一个字补上

if(tmp2[i]&0x80)//判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理

lhj[ia]++;

ia++;

tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位

}

tmp--;

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display();

}

//----------

c--;//移完一半,进入下一半或下一个汉字,直到结束

}

}

void displaymove2(unsigned char *lp,unsigned char c,unsigned char timer)//左移显示函数,LP指向要显示第一个字的首地址,C表示显示字的个数,

//timer是移动的速度

{

unsigned char i=0,j=0,ia=0;

unsigned int tmp=0,timerc=0;

unsigned char tmp2[16];

c*=2;

for(i=0;i<16;i++)

tmp2[i]=0; //将缓冲区清0,

while(c)

{

if(lp!=0)

{ //当lp指向的地址为0时,直接用组缓冲0补上,效果是将当前显示的内容移出

tmp=c%2; //取余,目的是为了判断处理汉字的前半部份还是后半部份

for(i=0;i<16;i++)

{

tmp2[i]=lp[i*2+tmp]; //取半个汉字点阵数据,16字节

}

if(tmp)//当tmp为1时,表时一个字数组处理完成,将地址转到下一个字

lp+=32;

}

//--------------

tmp=8;//变量再次利用

while(tmp)

{ //循环8次,是将下一个字的前半部份的字节数据移入显示缓冲

ia=0;//做为点阵数组的元素

for(i=0;i<16;i++)

{ //移动是16行同时移,因此要处理16个字节

for(j=0;j<7;j++)

{//一行32个点四字节,有三字节在显示缓冲中移动

lhj[ia]<<=1;//移当前显示缓冲的半行字节

if(lhj[ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理

lhj[ia]++;

ia++;

}

lhj[ia]<<=1; //一行32个点四字节,将最后一字节用下一个字补上

if(tmp2[i]&0x80)//判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理

lhj[ia]++;

ia++;

tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位

}

tmp--;

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display2();

}

//----------

c--;//移完一半,进入下一半或下一个汉字,直到结束

}

}

void displaymovetb(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer)

//上下移动显示函数,din:1为向下,0为向上,lp指向要移入的内容,C表示有几个汉字要移,timer为移动速度

{

unsigned char i=0,j=0,ia=0,ib=0,ic=0,id=0;

unsigned int tmp=0,timerc=0;

if(din)

{ //判断移动方向,向下

ia=32; //要移入第一个汉字的数组元素

ib=64; //要移入第二个汉字的数组元素

ic=96;

id=128;

i=16; //行索引

while(i--)

{//逐行处理

j=120;

while(j)

{

j--;

lhj[j+8]=lhj[j]; //将上一行的内容复制到下一行,每两行内容相隔6个字节,复制15行

}

if(lp==0)

{//最后一行的处理,判断移入的内容是否为空,是用0移入

j=8;

while(j--)

lhj[j]=0;

}

else

{ //否则,取字数组处理

ia--;ib--;ic--;id-- ;

if(c==4)

{//判断4个字,移一行,6个字节

lhj[1]=lp[ia];

ia--;

lhj[0]=lp[ia];

lhj[3]=lp[ib];

ib--;

lhj[2]=lp[ib];

lhj[5]=lp[ic];

ic--;

lhj[4]=lp[ic];

lhj[7]=lp[id];

id--;

lhj[6]=lp[id];

}

else if(c==3)

{ //否则3个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[2]=lp[ia];

ia--;

lhj[1]=lp[ia];

lhj[4]=lp[ib];

ib--;

lhj[3]=lp[ib];

lhj[6]=lp[ic];

ic--;

lhj[5]=lp[ic];

lhj[7]=0;

}

else if(c==2)

{ //否则2个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[1]=0;

lhj[3]=lp[ia];

ia--;

lhj[2]=lp[ia];

lhj[5]=lp[ib];

ib--;

lhj[4]=lp[ib];

lhj[6]=0;

lhj[7]=0;

}

else if(c==1)

{ //否则1个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[1]=0;

lhj[2]=0;

lhj[4]=lp[ia];

ia--;

lhj[3]=lp[ia];

lhj[5]=0;

lhj[6]=0;

lhj[7]=0;

}

}

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display();

}

}

else

{//移动方向,向上

ia=0;ib=32;ic=64;id=96; //向上移动,移入汉字从低位开始

for(i=0;i<16;i++)

{ //处理16行

for(j=0;j<120;j++)//将下一行的内容复制到上一行,每两行内容相隔6个字节,复制15行

lhj[j]=lhj[j+8];

if(lp==0)

{ //最后一行的处理,判断移入的内容是否为空,是用0移入

while(j!=128)

{

lhj[j]=0;

j++;

}

}

else

{ //否则,取字数组处理

if(c==4)

{ //判断4个字,移一行,8个字节

lhj[120]=lp[ia];

lhj[121]=lp[ia+1];

lhj[122]=lp[ib];

lhj[123]=lp[ib+1];

lhj[124]=lp[ic];

lhj[125]=lp[ic+1];

lhj[126]=lp[id];

lhj[127]=lp[id+1];

ia+=2;ib+=2;ic+=2;id+=2;

}

else if(c==3)

{ //否则3个字,将字放在中间,旁边补0

lhj[120]=0;

lhj[121]=lp[ia];

lhj[122]=lp[ia+1];

lhj[123]=lp[ib];

lhj[124]=lp[ib+1];

lhj[125]=lp[ic];

lhj[126]=lp[ic+1];

lhj[127]=0;

ia+=2;ib+=2;ic+=2;

}

else if(c==2)

{ //否则2个字,将字放在中间,旁边补0

lhj[120]=0;

lhj[121]=0;

lhj[122]=lp[ia];

lhj[123]=lp[ia+1];

lhj[124]=lp[ib];

lhj[125]=lp[ib+1];

lhj[126]=0;

lhj[127]=0;

ia+=2;ib+=2;

}

else

{//判断1个字,移一行,8个字节,将字放在中间,两边补0

lhj[120]=0;

lhj[121]=0;

lhj[122]=0;

lhj[123]=lp[ia];

ia++;

lhj[124]=lp[ia];

ia++;

lhj[125]=0;

lhj[126]=0;

lhj[127]=0;

}

}

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display();

}

}

}

void displaymovetb2(unsigned char din,unsigned char *lp,unsigned char c,unsigned char timer)

//上下移动显示函数,din:1为向下,0为向上,lp指向要移入的内容,C表示有几个汉字要移,timer为移动速度

{

unsigned char i=0,j=0,ia=0,ib=0,ic=0,id=0;

unsigned int tmp=0,timerc=0;

if(din)

{ //判断移动方向,向下

ia=32; //要移入第一个汉字的数组元素

ib=64; //要移入第二个汉字的数组元素

ic=96;

id=128;

i=16; //行索引

while(i--)

{//逐行处理

j=120;

while(j)

{

j--;

lhj[j+8]=lhj[j]; //将上一行的内容复制到下一行,每两行内容相隔6个字节,复制15行

}

if(lp==0)

{//最后一行的处理,判断移入的内容是否为空,是用0移入

j=8;

while(j--)

lhj[j]=0;

}

else

{ //否则,取字数组处理

ia--;ib--;ic--;id-- ;

if(c==4)

{//判断4个字,移一行,6个字节

lhj[1]=lp[ia];

ia--;

lhj[0]=lp[ia];

lhj[3]=lp[ib];

ib--;

lhj[2]=lp[ib];

lhj[5]=lp[ic];

ic--;

lhj[4]=lp[ic];

lhj[7]=lp[id];

id--;

lhj[6]=lp[id];

}

else if(c==3)

{ //否则3个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[2]=lp[ia];

ia--;

lhj[1]=lp[ia];

lhj[4]=lp[ib];

ib--;

lhj[3]=lp[ib];

lhj[6]=lp[ic];

ic--;

lhj[5]=lp[ic];

lhj[7]=0;

}

else if(c==2)

{ //否则2个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[1]=0;

lhj[3]=lp[ia];

ia--;

lhj[2]=lp[ia];

lhj[5]=lp[ib];

ib--;

lhj[4]=lp[ib];

lhj[6]=0;

lhj[7]=0;

}

else if(c==1)

{ //否则1个字,将字放在中间,旁边补0

lhj[0]=0;

lhj[1]=0;

lhj[2]=0;

lhj[4]=lp[ia];

ia--;

lhj[3]=lp[ia];

lhj[5]=0;

lhj[6]=0;

lhj[7]=0;

}

}

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display();

}

}

else

{//移动方向,向上

ia=0;ib=32;ic=64;id=96; //向上移动,移入汉字从低位开始

for(i=0;i<16;i++)

{ //处理16行

for(j=0;j<120;j++)//将下一行的内容复制到上一行,每两行内容相隔6个字节,复制15行

lhj[j]=lhj[j+8];

if(lp==0)

{ //最后一行的处理,判断移入的内容是否为空,是用0移入

while(j!=128)

{

lhj[j]=0;

j++;

}

}

else

{ //否则,取字数组处理

if(c==4)

{ //判断4个字,移一行,8个字节

lhj[120]=lp[ia];

lhj[121]=lp[ia+1];

lhj[122]=lp[ib];

lhj[123]=lp[ib+1];

lhj[124]=lp[ic];

lhj[125]=lp[ic+1];

lhj[126]=lp[id];

lhj[127]=lp[id+1];

ia+=2;ib+=2;ic+=2;id+=2;

}

else if(c==3)

{ //否则3个字,将字放在中间,旁边补0

lhj[120]=0;

lhj[121]=lp[ia];

lhj[122]=lp[ia+1];

lhj[123]=lp[ib];

lhj[124]=lp[ib+1];

lhj[125]=lp[ic];

lhj[126]=lp[ic+1];

lhj[127]=0;

ia+=2;ib+=2;ic+=2;

}

else if(c==2)

{ //否则2个字,将字放在中间,旁边补0

lhj[120]=0;

lhj[121]=0;

lhj[122]=lp[ia];

lhj[123]=lp[ia+1];

lhj[124]=lp[ib];

lhj[125]=lp[ib+1];

lhj[126]=0;

lhj[127]=0;

ia+=2;ib+=2;

}

else

{//判断1个字,移一行,8个字节,将字放在中间,两边补0

lhj[120]=0;

lhj[121]=0;

lhj[122]=0;

lhj[123]=lp[ia];

ia++;

lhj[124]=lp[ia];

ia++;

lhj[125]=0;

lhj[126]=0;

lhj[127]=0;

}

}

timerc=timer; //处理完16行,调用显示函数更新点阵

while(timerc--) //循环做为处理的速度,即移动的速度

display();

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。