
LED驱动板PCB:

LED驱动板:

光笔PCB:

光笔原理图:

主控板PCB:

主控板原理图:

//////////////////////////////////自己归档h./////// // //////////////////////////////////////// ///
#include
#define写0x01 //写写作
#define擦除0x00 //擦除
#define key_enter 1 //确定
#define key_esc 2 //退出/取消
#define key_words_modle 3 //多词连接
#define key_light_level 4 //屏幕亮度级别
#define key_sleep_time 5 //超时待机时间设置
#define key_fanxian 6 //反向显示操作
#define key_cachu 7 //擦除操作
#define key_tuoyi 8 //拖动对象
#define key_all_screen_del 9 //整个屏幕擦除
#define key_tuoyi_quxiao 10 //选择对象的拖动内容后取消
#define key_crease 11 //数据加一(待机时间,亮度级别)
#define key_decrease 12 //数据减一
// 24M晶体振荡器
#define _TH0_TL0_(65536-50000)
#define HI(_TH0_TL0_ / 256)//将值分配给高8位
#define LO(_TH0_TL0_%256)//将值分配给低8位
#define M 40 //(2000/50)1秒内累积50个中断
typedef char(* size)[4]; //将大小定义为指向32X4二维数组第一个地址的类型
typedef unsigned char uchar;
外部尺寸点[4];
外部uchar LED_CODE [5] [4];
外部uchar LED_ROW,LED_LINE;
外部uchar ROW_TEMP;
外部uchar键;

extern uchar li_level;
外部uchar N;
extern uchar men_lig;
外部uchar sleepmin;
外部uchar分钟,秒;
外部uchar xdata LEDDATA0 [32] [4],LEDDATA1 [32] [4],LEDDATA2 [32] [4],LEDDATA3 [32] [4],LEDDATA4 [32] [4];
void LED_GAI(uchar obj_mem [32] [4],uchar Opera,uchar LED_ROW,uchar LED_LINE);
void one_word(uchar dat_addr [32] [4],uchar caozuo);
void sys_init();
void one_word(uchar dat_addr [32] [4],uchar caozuo);
uchar getkey();
void lightlev(uchar显示[32] [4]);
void sleeptim(uchar表示[32] [4]);
void fanxian(uchar LEDDATA [32] [4]);
void delay_us(int us);
void LEDcachu(uchar LEDDATA [32] [4]);
void obj_move(uchar led_data [32] [4]);
void fourwords();
void fou_show();
void dis_play(uchar show_obj [32] [4]);
void del_all(uchar obj [32] [4]);
void shu_ma_g();
// void daiji();
void digital_show(uchar行,uchar行);
void output();
无效输入(uchar字);
void saomiao();
void light();
// void input(uchar word);;
////////////////////////////////// END ////////// // ////////////////////////////////////////
/////////////////////////////////文件main.c ////////// ////////////////////////////////////////// //
// ********************************************* **********************************
//工作方式: LED书写点阵显示屏
//作者: 陈玉玺,黄晓光,唐敏健
//时间: 2010/04〜2010/05
///主控制器: IAP12C5A62S2(STC12系列)
//晶体: 24MHZ
//功能模块分析:
//系统具有4个功能模块:
// 1.点亮并绘制灯光(即写入功能,默认启动)
// 2.多字符连接
// 3.自动调光功能
// 4.超时待机功能
//以上功能的操作是:
// 1.反向显示(可用于功能1和功能2模块)
// 2.整个屏幕被删除(可用于功能1和功能2模块)
// 3.擦除光笔(可用于功能1和功能2模块)
// 4.拖动对象(可用于功能1和功能2模块)
// 5.编写文字(可用于功能1和功能2模块)PS: 由于时间问题,
//并且此功能主题没有要求,暂时将其保留
// 6.自动调光参数设置,即调整用户喜欢的屏幕亮度级别,
//同时,系统将根据环境光强度的变化自动使LED屏幕在此级别变暗
// 7.超时待机时间设置
//
//联系人: 唐敏健(15014225360/380467850@qq.com)
//
// ********************************************* **** ***********************************
#includemyself.h
#include
#include
uchar LED_CODE [5] [4] = / * LED灯的列代码,每个LED灯的代码为5位数据(0到2 ^ 5),每次需要输出1位用于同时显示32列LED灯的数据,共5次. * /
{/ *由于工作频率高,这些数据在内部RAM中定义* /
0X00,0X00,0XFF,0XFF,
0X00,0XFF,0X00,0XFF,
0X0F,0X0F,0X0F,0X0F,
0X33,0X33,0X33,0X33,
0X55,0X55,0X55,0X55
};
uchar LED_ROW,LED_LINE,N; //存储当前光笔坐标的全局变量,在系统初始化时将其设置为99(大于32的任何数字)
uchar ROW_TEMP; //扫描过程中行坐标的“临时变量”(全局变量),以便在输入中断后LED_ROW = ROW_TEMP进行保存
uchar KEYS = 0; //存储按下的键的编号,初始化为0,
uchar li_level = 10;
uchar men_lig = 10;
uchar min = 0,sec = 0;
uchar sleepmin = 5; //默认超时为5分钟待机状态
//位pen_key = P3 ^ 3; //光笔按键P3 ^ 3为INT0,因此在初始化阶段应关闭外部中断0
//位OUT_EN = P1 ^ 7;
uchar xdata LEDDATA0 [32] [4],LEDDATA1 [32] [4],LEDDATA2 [32] [4],LEDDATA3 [32] [4],LEDDATA4 [32] [4];
//用于存储整个屏幕数据的数组,屏幕数据量为32/8 * 32字节
大小点[4]; //二维数组的指针数组

void delay_us(int us)
{
while(us> 0)
{
_nop _(); _ nop _(); _ nop _(); _ nop _();
_nop _(); _ nop _(); _ nop _(); _ nop _();
_nop _(); _ nop _(); _ nop _(); _ nop _();
_nop _(); _ nop _(); _ nop _(); _ nop _();
_nop _(); _ nop _(); _ nop _(); _ nop _(); // 24无操作指令是1US,现在有20个
我们-;
}
}
void main()
{
uchar light_T;
N = 3;
light_T = 0;
继电器= 0;
point [0] = LEDDATA1; point [1] = LEDDATA2;
point [2] = LEDDATA3; point [3] = LEDDATA4;
// **********************
//定时器1初始化
TL0 = _TH0_TL0_%256;
TH0 = _TH0_TL0_ / 256 +(char)CY;
TR0 = 1;
// *****************
// sys_init(); //系统初始化,将4个数组的第一个地址放入point [4]
while(1)
{
one_word(LEDDATA0,写); //扫描一个点并显示它
KEYS = getkey(); // AD扫描键,实际上,在一秒钟之内进行10次键扫描就足够了,无需遵循此dis_play()来扫描至少20次,
//因为人的手不可能在一秒钟内按下10次以上.
//如果在调试过程中发现LED屏幕对光笔的反应较慢,则需要在一秒钟内修改getkey()的时间占用率,
//这也意味着一秒钟内getkey()的执行次数. 可能是这样的: 设置一个计数器,每次dis_play()+1,初始值
//为0,达到1时清除,并调用get_key(),否则不执行get_key().
if(KEYS)// getkey()在检测到按下键时返回键的值,如果没有按下键则返回0
{
切换(键)
{
case key_enter: 中断; //“ OK”在这里毫无意义

case key_esc: 中断; //不需要退出,已经是最底层了
case key_words_modle: fourwords(); break; //输入多词连接功能
case key_light_level: lightlev(LEDDATA0); break; //调整屏幕亮度等级的参数
case key_sleep_time: sleeptim(LEDDATA0); break; //调整超时待机的超时时间
case key_fanxian: fanxian(LEDDATA0); break; //反向显示操作
case key_cachu: LEDcachu(LEDDATA0); break; //擦除操作
case key_tuoyi: obj_move(LEDDATA0); break; //拖动对象
case key_all_screen_del: del_all(LEDDATA0); break; //
case key_tuoyi_quxiao: 中断; //“在确认对象选择后取消”在这里毫无意义
case key_crease: 中断; //“ Data + 1”在这里毫无意义
case key_decrease: 中断; //“ Data-1”在这里毫无意义
默认值: break; //如果没有匹配的键,则直接退出. 尽管此处没有发生,但出于安全原因添加它
}
}
KEYS = 0;
light_T ++;
if(light_T> 5){light_T = 0; light();} //一秒钟自动变暗约4次
}
}
void one_word(uchar dat_addr [32] [4],uchar caozuo)//秒的一部分,大约为1/20秒. 扫描一个点并将其显示在LED屏幕上,
//并更新数码管的显示
{
如果(!pen_key)
{saomiao(); //当按下光笔上的按钮时,它将进行扫描. 发光笔在这里占用时间. 笔也是大笔,3DU33
//大约需要5uS来计算响应时间保险点. 这样,在最坏的情况下都需要进行每次扫描
//长度为: T =(5 + 5)* 32 * N +(5 + 5)* N = 330N(uS). N是32列LED的高->低转换时间,也是<
//计数器溢出的次数.
LED_GAI(dat_addr,caozuoled点阵书写显示屏程序,LED_ROW,LED_LINE); //修改当前屏幕数据内容以更新下面的显示,文字表示LED_GAI()函数
//对LEDDATA1 [LED_ROW] [LED_LINE / 8]中LED_LINE%的第8位数据执行“和0”操作.
//因为74HC595输出端口的低电平对应于选通此列.
//相反,如果参数为擦除,则对数据的同一位执行“或1”操作
//此外,如果未按下pen_keyled点阵书写显示屏程序,则不进行更改就不会更新数据.
}
其他
{LED_ROW = 99; LED_LINE = 99;} //当不按下光笔上的按钮时,即,当用户不打算书写时,光笔的当前坐标值显示为99 ,99.
shu_ma_g(); //数码管更新静态显示
dis_play(dat_addr); // LED更新显示,无论是否执行扫描,都必须显示LED屏幕,这会占用时间并占用大部分CPU时间
//使得人眼无法检测到闪烁,如果显示时间比率不是>>扫描时间比率,则人眼会感觉到LED闪烁或光线暗淡扫描
//(“无突出显示”)太亮,显示内容(“突出显示”)不够亮
//此功能主要分配时间以达到每秒至少扫描20次的效果
}
void LED_GAI(uchar obj_mem [32] [4],uchar Opera,uc
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-289309-1.html
举止大方