|  | 
 
| /******************************************************* *   程序功能:用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是延时标志量
 }
 
 
 | 
 |