微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LED点阵手写屏

LED点阵手写屏

时间:10-02 整理:3721RD 点击:

以12单片机为核心,LED点阵屏采用微亮的动态扫描方式,通过光敏三极管制作的光笔,对动态扫描的点阵进行检测,并将检测到的LED灯的状态通过中断程序由0状态(延时1ms,微亮)变为1状态(延时15ms,亮),从而实现“写字”功能。

感谢电子发烧友论坛,在整个设计过程中,在论坛中看到了很多大神的帖子,得到了很多启示。


显示屏模块


驱动模块


光笔模块


整体


效果图


关键程序
// 点阵屏
xdata ledstate[16][32]=0;          //状态数组,初值都为0;若用uint定义会出现字符过大。
/************点阵扫描*************/
void scan()
{
        while(1)
        {
                OE=0;  //595使能(可直接接地)
                for(hang=0;hang<16;hang++)  //16行
                {
                        for(lie=0;lie<32;lie++)  //32列
                        {
                                if(ledstate[hang][lie]!=1)
                                        ledstate[hang][lie]=0;  //标志0,进入0状态,微亮
                                else
                                        ledstate[hang][lie]=1;  //标志1,进入1状态,亮
                                hwrite();  //行扫描
                                lwrite();  //列扫描
                        }
                        lie=0;  //列重置0
                }
                hang=0;  //行重置0
        }                       
}

关键程序
//行驱动程序,74HC595
/************595驱动程序*************/
void hc595data(uchar Data1,uchar Data2)
{
        uchar i,j;  //变量定义。
        SHCP=0;  //给SHCP赋初值。
        STCP=0;  //给STCP赋初值。
        for(i=0;i<8;i++)
        {
                SHCP=0;  //SHCP为0,       
                SHCP=1;  //SHCP为1,形成上升沿,传送串行数据。
                DS=Data1&0x80;  //将Data1的最高位传送到DS。
                Data1=Data1<<1;//Data1左移一位,循环8次从而将Data1的8位数据传输完毕。
        }
        for(j=0;j<8;j++)//第9个SHCP的上升沿数据从第1个595的Q'H引脚传送到第2个595的DS引脚。
        {
                SHCP=0;  //SHCP为0,
                SHCP=1;  //SHCP为1,形成上升沿,传送串行数据。       
                DS=Data2&0x80;  //将Data2的最高位传送到DS。        
                Data2=Data2<<1;//Data2左移一位,循环8次从而将Data2的8位数据传输完毕。
        }       
        STCP=0;  //STCP为0,
        STCP=1;  //STCP为1,形成上
升沿,数据从寄存器置入锁存器。
}

关键程序
//列驱动程序,74HC154
/************列扫描*************/
//154-1控制第1列到第16列
if(lie==0~15)//第1列~第16列
        {
                OE1=0;OE2=0;OE3=1;OE4=1;
                A=X;Bb=X;C=X;D=X;
}
//154-2控制第17列到第32列
if(lie==0~15)//第17列~第32列
        {
                OE1=1;OE2=1;OE3=0;OE4=0;
                E=X;F=X;G=X;H=X;
}

关键程序
//光笔程序
/************外部中断0初始化*************/
void outside_init()       
{       
        EA=1; //开总中断
       
        EX0=1; //打开外部中断0
       
        IT0=1; //设置为下降沿触发       
}
/************光笔外部中断0*************/
void key_scan() interrupt 0 //外部中断0
{
        if(key==0)
        {
                delay(10);//延时函数,防止中断检测不到LED点阵屏扫描。
                if(key==0)
                {
                        ledstate[hang][lie]=1;//改变此时LED灯的状态。
                }                                                //0状态,微亮;1状态,亮。
        }
}

PCB图都是双层的,看起来烟眼花,就不上传了。

进来支持一下!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top