8×8点阵用来显示简单的汉字还凑合,于是编了个16×16的试试看。下面是该实验的简单总结:
1、Proteus中的8×8Dot LED Matrix有些是共阴,有些的是共阳的,实验中采用的红色共阴8×8点阵管四只;(究竟是共阴还是共阳用5V电源调试,6.9版中支持静态显示,记得先前6.7版不能静态显示,非用一定频率的方波调试阳极不可。)
2、代码中按行显示编码,逐行由上到下刷新,刷新频率约为30hz;
3、将8×8点阵管看作一个黑框,8个阳极(行)输入当成数据编码输入,而8个阴极输入当成位选端(选啥哩 ?当然是8行中的某一行或者某几行了。),这样,8×8点点阵管的每一(行)就相当于一个Digit,与七段数码异曲同工了;
4、实验中,采用了两个74ls138(Proteus中暂时还么74ls154这4-in,16-out的仿真模型,否则软硬兼施也就方便多了)以产生位选信号,P1^3和P^7作为两芯片的使能信号;P0,P2分别输出16bit的行编码信号,这样,总共用了3个P口,还剩一个P3口可以用来作别的;当然实验也可以裸奔,不扩展两个138直接用P1、P3两口16根线输出作位选,不过这样一来4-P口32根线消耗殆尽,再无扩展的余地;
5、实验中程序例程:
/******************************************************************************/
/**
/** 模 块 名: -------------------BootLoader.C--------------------------------
/** -----------------16×16汉字显示模块---------------------------*/
/** 功能描述:
/**
/** 创 建 人: huangtiexiong 日期:2006-11-28 */
/** 修 改 人: 日期:2006-11-28 */
/** 其他说明:
/******************************************************************************/
#include //文件包含
#include
#define RowL P0
#define RowR P2
#define Digit P1
sbit EN_UP = P1^3;
sbit EN_DN = P1^7;
#define ResetBit(byte,i) ((byte) &= (~(0x01<<(i))))
typedef unsigned char int8u;
/*************************************************
模块级变量申明
*************************************************/
/*-- 文字: 大 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
//int8u gRowBuf_up[16] = { 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
// 0x01,0x00,0xFF,0xFE,0x01,0x00,0x02,0x80};
//int8u gRowBuf_dn[16] = { 0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,
// 0x08,0x10,0x10,0x18,0x20,0x0E,0x40,0x04};
/*-- 文字: 家 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
//int8u gRowBuf_up[16] = {0x02,0x00,0x01,0x00,0x3F,0xFE,0x40,0x04,0x5F,0xE8,0x01,0x00,0x02,0x00,0x0F,0x20};
//int8u gRowBuf_dn[16] = {0x72,0xB0,0x04,0xC0,0x19,0xC0,0x66,0xB0,0x18,0x8E,0x60,0x84,0x05,0x00,0x02,0x00};
/*-- 文字: 爱 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
int8u gRowBuf_up[16] = {0x00,0xF8,0x3F,0x90,0x12,0x10,0x09,0x20,0x3F,0xFE,0x22,0x02,0x42,0x00,0x3F,0xFC};
int8u gRowBuf_dn[16] = {0x04,0x00,0x07,0xF0,0x0C,0x20,0x0B,0x40,0x10,0xC0,0x63,0x30,0x8C,0x0E,0x30,0x04};
void Delay2ms(void);
/*************************************************
子函数定义
*************************************************/
/*******************************************************************************
*** 函 数 名: void main(void)
*** 功能描述:
*** 全局变量:
*** 输 入:
*** 输 出:
*** 创 建 人:huangtiexiong 日期:2006-11-28
*** 修 改 人: 日期:2006-11-28
*** 函数说明: 刷新频率30hz,可以更高至50hz~100hz;
/******************************************************************************/
void main(void)
{
int8u i;
while(1)
{
EN_UP = 1;
EN_DN = 0;
for(i=0;i<16;i++)
{
Digit = ((i/2) | 0x08);
RowL = gRowBuf_up[i++];
RowR = gRowBuf_up;
Delay2ms();
}
EN_UP = 0;
EN_DN = 1;
for(i=0;i<16;i++)
{
Digit = (((i/2)<<4) | 0x80);
RowL = gRowBuf_dn[i++];
RowR = gRowBuf_dn;
Delay2ms();
}
}
}
// 延时2毫秒,12M晶振;
void Delay2ms()
{
int8u i;
int8u j;
for(i=0;i<2;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
6、Proteus仿真抓图:
用户4257 2007-3-27 22:07
Thanks for your working!