3232LED点阵屏的KeilC51程序基于STC12C5A60S28个大字.docx
《3232LED点阵屏的KeilC51程序基于STC12C5A60S28个大字.docx》由会员分享,可在线阅读,更多相关《3232LED点阵屏的KeilC51程序基于STC12C5A60S28个大字.docx(17页珍藏版)》请在冰点文库上搜索。
3232LED点阵屏的KeilC51程序基于STC12C5A60S28个大字
32*32LED点阵屏的KeilC51程序(基于STC12C5A60S2,8个大字)
很早之前写的一个8字单红色LED屏显示程序,程序环境为KeilCV3,用的单片机为STC的12C5A60S2,
图的是速度比一般51快,外接11.0592的晶振,完全不延时时可以带4块8字(32*32字)不闪烁。
这个是一个朋友要我给邮局做的显示屏控制程序,顺便发上来给大家做参考。
图片效果:
P0口外接拨码开关,控制显示地址,地址不同,显示内容不同。
//对应硬件接口
//74hc138的ABCD接P2口的0123
#defineLS138_PORTP2
//关键参数声明,4为LED最多能显示的32*32的汉字个数
#defineLED_SIZE4
sbitLS138_OE=P2^4;
sbitHC595_D0=P1^0;//上半部分串行数据输入,对应595的14脚SER
sbitHC595_D1=P1^1;//下半部分串行数据输入,对应595的14脚SER
sbitHC595_CLK=P2^6;//移位寄存器时钟输入,对应595的11脚SCK
sbitHC595_STCLK=P2^7;//存储寄存器时钟输入,对应595的12脚RCK
发送数据为2行数据同时发送,所以需要将2跟线接到上下2行的数据输入端口
接口图示:
KeilC的程序如下所示:
完整程序下载地址:
8LED_STC12C5A60S2.rar
74HC595.H文件:
//Note:
74HC595驱动
//File:
74HC595.H
//Date:
09-11-6
//Time:
3:
50am
//DesignBy:
Ling.Ju
//Note:
SCLR(10脚)主复位接电源正极,G(13脚)使能端,输出有效接电源负极
//防止74HC595.H头文件被主程序重复调用
/*----------------------------------------------------------------------------*/
#ifndef__74HC595_H__
#define__74HC595_H__
//对应硬件接口
/*----------------------------------------------------------------------------*/
sbitSD0=P1^0;//串行数据输入,对应595的14脚SERD0/1D1/2D2/3D3/4
sbitSD1=P1^1;//串行数据输入,对应595的14脚SERD0/1D1/2D2/3D3/4
sbitSD2=P1^2;//串行数据输入,对应595的14脚SERD0/1D1/2D2/3D3/4
sbitSD3=P1^3;//串行数据输入,对应595的14脚SERD0/1D1/2D2/3D3/4
sbitSH_CK=P1^4;//移位寄存器时钟输入,对应595的11脚SCK
sbitST_CK=P1^5;//存储寄存器时钟输入,对应595的12脚RCK
//函数声明
voidsend_595(unsignedcharData1,unsignedcharData2);//串行输入,并行输出
/*----------------------------------------------------------------------------*/
//串行数据输入
voidsend_595(unsignedcharData1,unsignedcharData2)
{
unsignedchari;
for(i=0;i;
#include;
#include"hanzi.h"
/*----------------------------------------------------------------------------*/
//数据类型定义
#defineuint8unsignedchar
#defineuint16unsignedshort
/*----------------------------------------------------------------------------*/
//对应硬件接口
//74hc138的ABCD接P2口的0123,0xA0就是P2口地址
#defineLS138_PORTP2
/**************************************************************************/
//关键参数声明,4为LED最多能显示的32*32的汉字个数
#defineLED_SIZE4
sbitLS138_OE=P2^4;
sbitHC595_D0=P1^0;//上半部分串行数据输入,对应595的14脚SER
sbitHC595_D1=P1^1;//下半部分串行数据输入,对应595的14脚SER
sbitHC595_CLK=P2^6;//移位寄存器时钟输入,对应595的11脚SCK
sbitHC595_STCLK=P2^7;//存储寄存器时钟输入,对应595的12脚RCK
//包(0)裹
(1)寄
(2)递(3)
//特(4)快(5)专(6)递(7)
//信(8)函(9)寄(10)递(11)
//综(12)合(13)业(14)务(15)
//报(16)刊(17)订(18)阅(19)
//集(20)邮(21)业(22)务(23)
//函数声明
voidsend_595_byte(uint8Data1,uint8Data2);//595串行送入1byte数据
voidsend_data(void);//送出buff中的所有数据
voidread_data(unsignedchar*add,uint16s);//依次装载汉字的第1、16行,2、17行...所有数据
voiddelay1us(uint16i);//延时1us?
?
?
?
?
externunsignedcharcodehanzi[];
//LS138的ABCD段码表
uint8codeLS138_CODE[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint8data_buff1[(LED_SIZE<<2)];//缓存区1(上一行)
uint8data_buff2[(LED_SIZE<<2)];//缓存区2(下一行)
uint8Line;
uint16Size;
voidmain(void)
{
uint8address;
LS138_OE=1;
Size=0;
P0=0xff;//P0口加上拉电阻做地址,拨码开关拨到on则将对应管脚拉低
address=~P0;//将地址按位取反,把拉低的端口改为1,用于选择汉字
switch(address)
{
case1:
Size=0;break;
case2:
Size=128*LED_SIZE;break;
case4:
Size=128*LED_SIZE*2;break;
case8:
Size=128*LED_SIZE*3;break;
case16:
Size=128*LED_SIZE*4;break;
case32:
Size=128*LED_SIZE*5;break;
case64:
Size=128*LED_SIZE*6;break;
case128:
Size=128*LED_SIZE*7;break;
default:
Size=0;break;
}
while
(1)
{
for(Line=0;Line<16;Line++)//16行扫描
{
read_data(hanzi,Size);//装载汉字数据
send_data();//发送2整行数据
LS138_OE=1;//关闭138使能信号,关闭屏幕显示
LS138_PORT=LS138_PORT&0xF0;//清掉LS138的ABCD段码,关闭OE使能信号
LS138_PORT=LS138_PORT|LS138_CODE[Line];//输出段码
HC595_STCLK=0;//595的锁存置低
//delay1us
(2);
HC595_STCLK=1;//595的锁存拉高,上升沿锁存数据
LS138_OE=0;//送出138使能信号,点亮屏幕
delay1us(10);
}
}
}
voiddelay1us(uint16i)
{
while(i--)
{
_nop_();
}
}
/************************************************
装载数据进入缓冲器,依次转载第一个汉字的
第1行所有数据与第16行所有数据
************************************************/
voidread_data(unsignedchar*add,uint16s)
{
uint8ii,bb,cc;
uint16aa;
bb=Line<<2;
for(ii=0;ii{
aa=((int)ii)<<7;
cc=ii<<2;
data_buff1[cc]=*(add+s+bb+aa);//上面字的前4个数据
data_buff1[cc+1]=*(add+s+bb+aa+1);
data_buff1[cc+2]=*(add+s+bb+aa+2);
data_buff1[cc+3]=*(add+s+bb+aa+3);
data_buff2[cc]=*(add+s+bb+aa+64);//下面字的前4个数据
data_buff2[cc+1]=*(add+s+bb+aa+65);
data_buff2[cc+2]=*(add+s+bb+aa+66);
data_buff2[cc+3]=*(add+s+bb+aa+67);
}
}
/******************************
voidread_data(uint16s)
{
uint8ii;
for(ii=0;ii{
data_buff1[ii*4]=hanzi[s+Line*4];//上面字的前4个数据
data_buff1[ii*4+1]=hanzi[s+Line*4+1];
data_buff1[ii*4+2]=hanzi[s+Line*4+2];
data_buff1[ii*4+3]=hanzi[s+Line*4+3];
data_buff2[ii*4]=hanzi[s+Line*4+16];//下面字的前4个数据
data_buff2[ii*4+1]=hanzi[s+Line*4+17];
data_buff2[ii*4+2]=hanzi[s+Line*4+18];
data_buff2[ii*4+3]=hanzi[s+Line*4+19];
}
}
****************************************/
/**********************************************
74HC595串行数据输入1个字节,2行字同时输出
第一个为上半部分数据,第二个为下半部分数据
***********************************************/
voidsend_595_byte(uint8Data1,uint8Data2)
{
unsignedchari;
for(i=0;i<8;i++)
{
HC595_CLK=0;//先置为低
HC595_D0=Data1&0x80;//取数据的最高位
HC595_D1=Data2&0x80;//取数据的最高位
Data1<<=1;//将数据的次高位移到最高位,为下一次取数据做准备
Data2<<=1;//将数据的次高位移到最高位,为下一次取数据做准备
HC595_CLK=1;//再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
}
}
voidsend_data(void)//送出一整行数据
{
uint8jj,kk;
kk=(LED_SIZE<<2);//总共需要发送的字节数,1个32*32汉字每行4字节
for(jj=0;jj{
send_595_byte(data_buff1[jj],data_buff2[jj]);
}
}
hanzi.h字库文件
#ifndef__HANZI__H
#define__HANZI__H
unsignedcharcodehanzi[]=
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xE3,0xFF,0xFF,0xE3,0xE1,0xFF,0xF1,0xE3,0xE1,0xFF,0xF8,0xC3,0xF1,0xFF,
0xFE,0x47,0xF3,0xFF,0xFE,0x0F,0xF3,0xFF,0xFF,0x1F,0xF3,0x0F,0xFE,0x1F,0xF0,0x03,
0xFC,0x0C,0x03,0x87,0xF1,0x8C,0x73,0x8F,0xE3,0x8C,0x73,0x9F,0xFF,0x0E,0x73,0x1F,
0xFE,0x0E,0x73,0x1F,0xFE,0x0E,0x60,0x1F,0xFC,0x4F,0x03,0xFF,0xF8,0xCF,0x33,0xFF,
0xF1,0xCF,0xF3,0xFF,0xE3,0xCF,0xF3,0x1F,0xC7,0xCF,0xF3,0x87,0x9F,0x8F,0xF0,0x03,
0xFF,0x8F,0x80,0xC3,0xF8,0x00,0x07,0xE3,0xFE,0x08,0x3F,0xF3,0xFF,0x1F,0xFF,0xFF,
0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"独",0*/
/*(32X32,楷体,加粗)*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,
0xFF,0xE3,0xFF,0x8F,0xFF,0xE3,0xFF,0x8F,0xFF,0xC3,0xFF,0x8F,0xFF,0xC3,0xFF,0x8F,
0xFF,0x80,0xFF,0x8F,0xFF,0x88,0x23,0x8F,0xFF,0x1C,0x31,0x8F,0xFE,0x3F,0x11,0x8F,
0xFE,0x3F,0xF1,0xCF,0xFC,0x7F,0xF1,0xCF,0xF8,0xF1,0xF1,0xCF,0xF0,0x00,0xF1,0xCF,
0xE2,0x78,0xF1,0xCF,0xCE,0x78,0xF1,0xCF,0x9E,0x79,0xF1,0xCF,0xFE,0x79,0xF1,0xCF,
0xFE,0x61,0xF1,0xCF,0xFE,0x71,0xFF,0xCF,0xFE,0x33,0x3F,0xCF,0xFE,0x3F,0x3F,0xCF,
0xFE,0x3F,0x1F,0xCF,0xFF,0x0E,0x1F,0x8F,0xFF,0x80,0x19,0x8F,0xFF,0xF1,0xFC,0x0F,
0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,/*"创",1*/
/*(32X32,楷体,加粗)*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,
0xFF,0xF0,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,
0xFF,0xF1,0xFF,0xFF,0xFF,0xF1,0x81,0xFF,0xFF,0xC0,0x00,0x7F,0xF0,0x01,0xF0,0xFF,
0xF8,0xF1,0xF0,0xFF,0xF8,0xF1,0xF1,0xFF,0xFC,0xF0,0x11,0xFF,0xFC,0x00,0x71,0xFF,
0xFC,0x71,0xF1,0xFF,0xFC,0x71,0xE3,0xFF,0xFC,0x71,0xE3,0xFF,0xFE,0x70,0x03,0xFF,
0xFE,0x00,0x03,0xCF,0xFE,0x71,0xE7,0xCF,0xFF,0xF1,0xFF,0xCF,0xFF,0xF1,0xFF,0xCF,
0xFF,0xF9,0xFF,0xC7,0xFF,0xF8,0xFF,0x87,0xFF,0xF8,0x7E,0x07,0xFF,0xFC,0x00,0x0F,
0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"电",2*/
/*(32X32,楷体,加粗)*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,
0xFF,0xFE,0x00,0xFF,0xFF,0x00,0x20,0xFF,0xFF,0x83,0xE3,0xFF,0xFF,0xFF,0xC7,0xFF,
0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFE,0x3F,0xFF,
0xFF,0xFE,0x3C,0x07,0xFF,0xFE,0x00,0x01,0xFF,0xC0,0x07,0xFF,0xC0,0x03,0x1F,0xFF,
0xE0,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,
0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,
0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,
0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"子",3*/
/*(32X32,楷体,加粗)*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xE3,0xFF,0xFF,0xE3,0xE1,0xFF,0xF1,0xE3,0xE1,0xFF,0xF8,0xC3,0xF1,0xFF,
0xFE,0x47,0xF3,0xFF,0xFE,0x0F,0xF3,0xFF,0xFF,0x1F,0xF3,0x0F,0xFE,0x1F,0xF0,0x03,
0xFC,0x0C,0x03,0x87,0xF1,0x8C,0x73,0x8F,0xE3,0x8C,0x73,0x9F,0xFF,0x0E,0x73,0x1F,
0xFE,0x0E,0x73,0x1F,0xFE,0x0E,0x60,0x1F,0xFC,0x4F,0x03,0xFF,0xF8,0xCF,0x33,0xFF,
0xF1,0xCF,0xF3,0xFF,0xE3,0xCF,0xF3,0x1F,0xC7,0xCF,0xF3,0x87,0x9F,0x8F,0xF0,0x03,
0xFF,0x8F,0x80,0xC3,0xF8,0x00,0x07,0xE3,0xFE,0x08,0x3F,0xF3,0xFF,0x1F,0xFF,0xFF,
0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"独",4*/
/*(32X32,楷体,加粗)*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,
0xFF,0xE3,0xFF,0x8F,0xFF,0xE3,0xFF,0x8F,0xFF,0xC3,0xFF,0x8F,0xFF,0xC3,0xFF,0x8F,
0xFF,0x80,0xFF,0x8F,0xFF,0x88,0x23,0x8F,0xFF,0x1C,0x31,0x8F,0xFE,0x3F,0x11,0x8F,
0xFE,0x3F,0xF1,0xCF,0xFC,0x7F,0xF1,0xCF,0xF8,0xF1,0xF1,0xCF,0xF0,0x00,0xF1,0xCF,
0xE2,0x78,0xF1,0xCF,0xCE,0x78,0xF1,0xCF,0x9E,0x79,0xF1,0xCF,0xFE,0x79,0xF1,0xCF,
0xFE,0x61,0xF1,0xCF,0xFE,0x71,0xFF,0xCF,0xFE,0x33,0x3F,0xCF,0xFE,0x3F,0x3F,0xCF,
0xFE,0x3F,0x1F,0xCF,0xFF,0x0E,0x1F,0x8F,0xFF,0x80,0x19,0x8F,0xFF,0xF1,0xFC,0x0F,