查看: 2837|回复: 0
打印 上一主题 下一主题

用16*16点阵实现多汉字显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-9-21 22:12:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
/*******************************************************
*   程序功能:用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是延时标志量
        }

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表