|
/*******************************************************
* 程序功能:用16*16点阵实现多汉字显示
* 硬件说明:使用stc15f2k60s2,四个个595串连,RCLK1接P00,SRCLK1接P01,
SER1接P02,RCLK2接P03,SRCLK2接P04,SER2接P05
JP18 QA~QH 接 JP27 P0~P7 、
JP20 QA~QH 接 JP26 P9~P16
* 实验现象:点阵滚动显示我是因仑工程特种兵
* 日 期 : 2014/9/22
* 作 者 : 舒代超
*******************************************************/
#include<stc15f2k60s2.h>
#define uchar unsigned char
#define uint unsigned int
uint code Data[]={
0x0440, 0x0E50, 0x7848, 0x0848, 0x0840, 0xFFFE, 0x0840, 0x0844,
0x0A44, 0x0C48, 0x1830, 0x6822, 0x0852, 0x088A, 0x2B06, 0x0000, //我
0x1FF0, 0x1010, 0x1010, 0x1FF0, 0x1010, 0x1010, 0x1FF0, 0x0000,
0xFFFE, 0x0180, 0x1100, 0x11F8, 0x1100, 0x2900, 0x4500, 0x83FE, //是
0x0000, 0x7ffc, 0x4104, 0x4104, 0x4104, 0x5ff4, 0x4104, 0x4304,
0x4284, 0x4644, 0x4424, 0x4834, 0x5024, 0x4004, 0x7ffc, 0x4004, //因
0x0000, 0x0100, 0x0280, 0x0440, 0x0830, 0x101c, 0x6808, 0x0840,
0x08e0, 0x0980, 0x0e00, 0x0808, 0x0808, 0x080c, 0x07f8, 0x0000, //仑
0x0000, 0x0000, 0x7FFC, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0xFFFE, 0x0000, 0x0000, //工
0x0800, 0x1DFC, 0xF104, 0x1104, 0x1104, 0xFDFC, 0x1000, 0x3000,
0x39FE, 0x5420, 0x5420, 0x91FC, 0x1020, 0x1020, 0x13FE, 0x1000, //程
0x0000, 0x1040, 0x53fc, 0x5040, 0x7c40, 0x97fe, 0x1010, 0x1c10,
0x33fe, 0xd010, 0x1110, 0x1090, 0x1090, 0x1010, 0x1050, 0x1020, //特
0x0820, 0x1C20, 0xF020, 0x1020, 0x11FC, 0xFD24, 0x1124, 0x3124,
0x3924, 0x55FC, 0x5524, 0x9020, 0x1020, 0x1020, 0x1020, 0x1020, //种
0x0000, 0x00F0, 0x1F00, 0x1000, 0x1000, 0x1FF8, 0x1080, 0x1080,
0x1080, 0x1080, 0xFFFE, 0x0000, 0x0840, 0x1020, 0x2010, 0x4008 //兵
};
uint Wei[]={ 0x7fff, 0xbfff, 0xdfff, 0xefff,
0xf7ff, 0xfbff, 0xfdff, 0xfeff,
0xff7f, 0xffbf, 0xffdf, 0xffef,
0xfff7, 0xfffb, 0xfffd, 0xfffe
}; //这个是位选比如0x7fff表示显示点阵的第一行,这个选中位选是低电平有效
uchar j=0,k=0,m=0;
/*******************************************************
//函数名称:Init_timer()
//函数功能:定时器0,外部中断0初始函数 12T模式
//入口参数:无
//返回参数:无
********************************************************/
void Init_timer()
{
TMOD=0x00;
TL1=65535-1300;
TH1=(65535-1300)>>8;
ET1=1;
TR1=1;
EA=1; //定时器1
}
/*******************************************
函数名称:Send_Data(uchar data1)
功 能:数据传送函数
入口参 数:data1
返回值 :无
********************************************/
void Send_Data(uint data1) //送段选
{
uchar i=0;
for(i=0;i<16;i++) //因为送一次数据是16位
{
P01=0;//SRCLK1初始化
P02=data1&0x0001;//SER1赋值
P01=1;; //SRCLK1上升沿
data1=data1>>1;
}
}
/*******************************************
函数名称:Send_WEI(uint wei1)
功 能:位选传送函数
入口参 数:wei1
返回值 :无
********************************************/
void Send_WEI(uint wei1) //送位选
{
uchar i=0;
for(i=0;i<16;i++) // 因为送一次数据是16位
{
P04=0; //SRCLK2初始化
P05=wei1&0x0001;//SER2赋值
P04=1;; //SRCLK2上升沿
wei1=wei1>>1;
}
}
/*******************************************
函数名称:display()
功 能:点阵显示函数
入口参 数:无
返回值 :无
********************************************/
void display()
{
P00=0;//RCLK1初始化
Send_Data(Data[(j+k)%144]); //送入数据,144表示数组内的字符的个数
P00=1; //RCLK1 上升沿
P03=0; //RCLK2 初始化
Send_WEI(Wei[j]); //每次显示的位
P03=1; //RCLK2 上升沿
}
/********************主函数********************/
void main()
{
Init_timer(); //定时器初始化
while(1)
{
if(m==200) //延时,当m到达200时改变显示数据。相当于控制汉字平移的速度
{
m=0;
k++; //控制显示内容的改变
if(k==128)k=0;
}
}
}
/*******************************************************
//函数名称:timer1()
//函数功能:定时器中断0服务程序
//入口参数:无
//返回参数:无
********************************************************/
void timer1() interrupt 3
{
display(); //点阵显示
j++; //每次显示一行数据
if(j==16) //当显示到最后一行时,下一次又显示第一行
j=0;
m++; //m是延时标志量
}
|
|