版主
  
主题
帖子
积分34308
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
简单测试程序,显示"点阵测试" 4字,
C51 12M晶振
写好没试过,应该行的吧..
#include <REGX52.H>
sbit H_CLK = P1^0;
sbit H_D = P1^1;
sbit L_CLK = P1^2;
sbit L_D = P1^3;
sbit L_STB = P1^4;
sbit L_OE = P1^5;
/*字模,横向取模*/
unsigned char code a[32*4]=
{
/*-- 文字: 点 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x00,0x01,0x00,0x01,0xF8,0x01,0x00,0x01,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,
0x10,0x10,0x1F,0xF0,0x10,0x10,0x01,0x10,0x28,0x88,0x24,0x44,0x44,0x44,0x00,0x00,
/*-- 文字: 阵 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0xF8,0x80,0x88,0x80,0x97,0xFC,0xA1,0x00,0x91,0x40,0x8A,0x40,0x8F,0xFC,
0x88,0x40,0xA8,0x40,0x97,0xFE,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00,
};
void delay_nms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void spi_r(unsigned char wdata) //模拟spi的方式往列4094传送字模数据
{
char i = 0;
for(i=0;i<8;i++)
{
L_CLK=0;//时钟拉低
if(wdata&0x80) L_D=1;
else L_D=0;
wdata <<= 1;//左移一位
L_CLK=1;//时钟拉高,产生上升沿
}
L_CLK=0;//时钟拉低
}
void main(void)
{
unsigned char i;
L_OE=0; //列不输出
for(i=0;i<16;i++) //行驱动的4094填16个1,使行不输出,去掉大概也没问题.反正就一会
{
H_CLK=0;
H_D=1;
H_CLK=0;
}
while(1)
{
for(i=0;i<16;i++)
{
H_CLK=0; //行4094的输出.依次点亮1~16行.
if(i==0) H_D=0;
else H_D=1;
H_CLK=1;
L_STB=0; //STB low
spi_r(a[2*i]);
spi_r(a[2*i+1]);
spi_r(a[2*i+32]);
spi_r(a[2*i+1+32]);
spi_r(a[2*i+32*2]);
spi_r(a[2*i+32*2+1]);
spi_r(a[2*i+32*3]);
spi_r(a[2*i+32*3+1]);
/* //再STB之前再加几个上升沿就能产生向左移位的效果.
L_D=0;
for(k=0;k<10;k++)
{
L_CLK=0;
L_CLK=1;
}
*/
L_STB=1; //STB high
L_OE=1; //列4094输出
delay_nms(1);
L_OE=0;
}
}
} |
|