标题:
16X32双色点阵全亮的单片机程序
[打印本页]
作者:
liuliujia
时间:
2017-12-9 16:38
标题:
16X32双色点阵全亮的单片机程序
16X32双色点阵屏的原理图与相关资料到这里:
http://www.51hei.com/bbs/dpj-101081-1.html
单片机源程序如下:
/***********************************************************
实现功能:红绿全亮
可以根据下面的接口用杜邦线与点阵连接即可测试
单片机:STC89C52 或者其他型号都可以
晶振无要求
*************************************************************/
/*
标准08接口点阵屏管脚定义
GND A ABCD是行扫描信号
GND B
GND C
OE D OE是屏的使能端 低有效
R1 G1 上半屏绿色
R2 G2 下半屏绿色 本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。
GND STR 锁存信号
GND SCK 时钟信号
*/
/*接口说明*/
//A B C D 是138行扫描信号
// SCK 是595的移位信号
// STR 是595的锁存信号
// OE 是屏的使能端 可以控制亮度
// R 是红色信号线
// G 是绿色信号线
// 本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。
#include<stc89c51rc.h>
#define uchar unsigned char
#define uint unsigned int
#define light 3 //定义亮度
/*****************************接口定义********************************/
sbit SHCP=P2^7;//595的移位信号
sbit STCP=P4^1;//是595的锁存信号 /*如果用的是普通单片机 没有P4.1口 请改为其他口*/
sbit SDA_R=P2^3;//红数据
sbit SDA_G=P2^5;//绿数据
sbit OE=P0^4;//输出使能
sbit IA=P4^0;//行控制线A /*如果用的是普通单片机 没有P4.0口 请改为其他口*/
sbit IB=P2^0;//行控制线B
sbit IC=P2^1;//行控制线C
sbit ID=P2^2;//行控制线D
sbit Speek=P3^5;//蜂鸣器
/********************************************************************/
#define scan0 {IA=0;IB=0;IC=0;ID=0;}
#define scan1 {IA=1;IB=0;IC=0;ID=0;}
#define scan2 {IA=0;IB=1;IC=0;ID=0;}
#define scan3 {IA=1;IB=1;IC=0;ID=0;}
#define scan4 {IA=0;IB=0;IC=1;ID=0;}
#define scan5 {IA=1;IB=0;IC=1;ID=0;}
#define scan6 {IA=0;IB=1;IC=1;ID=0;}
#define scan7 {IA=1;IB=1;IC=1;ID=0;}
#define scan8 {IA=0;IB=0;IC=0;ID=1;}
#define scan9 {IA=1;IB=0;IC=0;ID=1;}
#define scan10 {IA=0;IB=1;IC=0;ID=1;}
#define scan11 {IA=1;IB=1;IC=0;ID=1;}
#define scan12 {IA=0;IB=0;IC=1;ID=1;}
#define scan13 {IA=1;IB=0;IC=1;ID=1;}
#define scan14 {IA=0;IB=1;IC=1;ID=1;}
#define scan15 {IA=1;IB=1;IC=1;ID=1;}
uchar Move,Speed,line; //(移位 速度 行 ) 定义
uint zimuo; //字模计数器
uint uiAllData;
void DelayMs(void); // 延时
void in_data(); // 调整移动数据
void rxd_data(); // 发送移动数据
/******************************************************/
/*****不影响其他端口的扫描*************************/
void scan(unsigned char Value)
{switch(Value)
{case 0: scan0;break;
case 1: scan1;break;
case 2: scan2;break;
case 3: scan3;break;
case 4: scan4;break;
case 5: scan5;break;
case 6: scan6;break;
case 7: scan7;break;
case 8: scan8;break;
case 9: scan9;break;
case 10:scan10;break;
case 11:scan11;break;
case 12:scan12;break;
case 13:scan13;break;
case 14:scan14;break;
case 15:scan15;break;
default:break;
}
}
/***********************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/************************************************************************************/
void DELAY_US(int num) //延时函数
{while(--num);
}
/*************************************/
void Beep_key(void) //扬声器--按键音
{
unsigned char a ; //定义变量用于发声的长度设置
for(a=150; a>0; a--) //声音的长度
{
Speek=0; //取反 扬声器
DELAY_US(350); //音调设置延时
}
Speek=1; //音乐结束后扬声器拉高关闭
}
/**************************延时***********************/
void DelayMs(void)
{
uchar TempCyc;
for(TempCyc=250;TempCyc>1;TempCyc--)
{;}
}
/********************************************/
/*主函数*/
void main()
{
P3M0=0X20;
P3M1=0X00;
Beep_key();
Speek=1;
while(1)
{
while(Move<16) //数据移位。
{
for(Speed=0;Speed<3;Speed++) //移动速度控制
{
for(line=0;line<16;line++)
{
rxd_data(); //装载移动数据
scan(line); //输出行扫描
STCP=1;//锁存
STCP=0;
OE=0;
DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。
OE=1;
DelayMs(); //亮度控制在70% 以免过大电流
}
}
Move++; //移动一步
}
Move=0;
//zimuo=zimuo+32; //换下一个字
}
}
/***********************发送移动的数据****************************/
void rxd_data(void) //串行发送数据
{
uchar s;
uchar temp,k;
for(s=0;s<4;s++) //发送4字节数据
{
for(k=0;k<8;k++)//一个字节8位 发送给595
{
SHCP=0; //上升沿移位595
SDA_R=SDA_G=0;//通过IO口送一个位给 595
temp=temp>>1; //字节移位 准备送下一位
SHCP=1;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1