51单片机点阵解析

发布者:SereneWanderer最新更新时间:2020-04-07 来源: eefocus关键字:51单片机  点阵  函数变量 手机看文章 扫描二维码
随时随地手机看文章

感谢大熙熙 对51单片机点阵代码的详细分析


http://www.cnblogs.com/one-meter/p/4188277.html


网址阐述了他对代码的解析


不过部分代码解析不够透彻


我融入了个人对代码的理解


并且做了详细的解析


代码参考了普中给的代码


网上代码很多可以自己下载测试


代码如下


 #include

 #include



//重定义 函数变量

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

 //spi 所使用的 3个管脚 并进行定义



sbit MOSIO =P3^4;

sbit R_CLK =P3^5;

sbit S_CLK =P3^6;



//--点阵显示数组--//

uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,

 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,

 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,

 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; 

//--10字模--//

uchar code tab1[] = 

{0, 0, 0, 0, 0, 0, 8, 24, 14, 36, 8, 66, 8, 66, 8, 66, 

 8, 66, 8, 66, 8, 66, 8, 36, 62, 24, 0, 0, 0, 0, 0, 0};



//--09字模--//

uchar code tab2[] = 

{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66,

 66, 66, 100, 66, 88, 66, 64, 66, 64, 36, 36, 24, 28, 0, 0, 0, 0} ;



//--08字模--//

uchar code tab3[] = 

{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 36,

66, 24, 66, 36, 66, 66, 66, 66, 36, 66, 24, 60, 0, 0, 0, 0};



//--07字模--//

uchar code tab4[] = 

{0, 0, 0, 0, 0, 0, 24, 126, 36, 34, 66, 34, 66, 16, 66, 16,

 66, 8, 66, 8, 66, 8, 66, 8, 36, 8, 24, 8, 0, 0, 0, 0};



//--06字模--//

uchar code tab5[] = 

{0, 0, 0, 0, 0, 0, 24, 56, 36, 36, 66, 2, 66, 2, 66, 26, 66,

 38, 66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};



//--05字模--//

uchar code tab6[] = 

{0, 0, 0, 0, 0, 0, 24, 126, 36, 2, 66, 2, 66, 2, 66, 26, 66,

 38, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};



//--04字模--//

uchar code tab7[] = 

{0, 0, 0, 0, 0, 0, 24, 32, 36, 48, 66, 40, 66, 36, 66, 36, 66,

34, 66, 34, 66, 126, 66, 32, 36, 32, 24, 120, 0, 0, 0, 0};



//--03字模--//

uchar code tab8[] = 

{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 32, 66, 24, 66,

 32, 66, 64, 66, 64, 66, 66, 36, 34, 24, 28, 0, 0, 0, 0};



//--02字模--//

uchar code tab9[] = 

{0, 0, 0, 0, 0, 0, 24, 60, 36, 66, 66, 66, 66, 66, 66, 32, 66,

 32, 66, 16, 66, 8, 66, 4, 36, 66, 24, 126, 0, 0, 0, 0};



//--01字模--//

uchar code tab10[] = 

{0, 0, 0, 0, 0, 0, 24, 8, 36, 14, 66, 8, 66, 8, 66, 8, 66, 8, 66,

8, 66, 8, 66, 8, 36, 8, 24, 62, 0, 0, 0, 0};



//--00字模--//

uchar code tab11[] = 

{0, 0, 0, 0, 0, 0, 24, 24, 36, 36, 66, 66, 66, 66, 66, 66, 66, 66,

66, 66, 66, 66, 66, 66, 36, 36, 24, 24, 0, 0, 0, 0};



//--GO--//

uchar code tab12[] = 

{0, 0, 0, 0, 0, 0, 60, 28, 34, 34, 34, 65, 1, 65, 1, 65, 1, 65, 113,

 65, 33, 65, 34, 65, 34, 34, 28, 28, 0, 0, 0, 0};


//全局变量 



ulong column; //列

ulong row; //行

ulong dt;



//具体分析 查看 函数实现方法

void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0);



void main()

{

int  k=0;



while(1)

{

 //for()   this is used by  how long 


for(k=0;k<16;k++)

{

HC595_data(~tab12[2*k+1],~tab12[2*k],tab0[2*k],tab0[2*k+1]);

}

   HC595_data(0xff,0xff,0,0);

}

}


/********************************

 BT3 是第2列    。。。。。。。 因此

 输入为   列2 列1   行1(值是行2的值)  行2(值是行1的值)   

 然而 实际不是这样  

 原因是  74h595 是4个并联的 相当于 8个 8*8

 而且只有一个输入  当输入值时 会进行进位操作

 可以理解为 压栈 

 所以变成了 行2(值是行1的值) 行 1 (值是行2的值) 列 2  列 1   

**********************************/

void HC595_data(uchar BT3,uchar BT2,uchar BT1,uchar BT0)

{

uchar i;

for(i=0;i<8;i++)

{

MOSIO=BT3>>7;   //BT 右移7位  即是得到最高位的值

BT3<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能

S_CLK=0; //开始累加

S_CLK=1; //关闭

}


for(i=0;i<8;i++)

{

MOSIO=BT2>>7;   //BT 右移7位  即是得到最高位的值

BT2<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能

S_CLK=0; //开始累加

S_CLK=1; //关闭

}


for(i=0;i<8;i++)

{

MOSIO=BT1>>7;   //BT 右移7位  即是得到最高位的值

BT1<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能

S_CLK=0; //开始累加

S_CLK=1; //关闭

}


for(i=0;i<8;i++)

{

MOSIO=BT0>>7;   //BT 右移7位  即是得到最高位的值

BT0<<=1; //左移1位  最高为溢出,第7位变成最高位,达到按位输入的功能

S_CLK=0; //开始累加

S_CLK=1; //关闭

}

R_CLK = 0; //set dataline low

R_CLK = 1; //片选

R_CLK = 0; //set dataline low

}


关键字:51单片机  点阵  函数变量 引用地址:51单片机点阵解析

上一篇:51单片机 16X16点阵循环滚动显示汉字
下一篇:linux系统与51单片机实现串口数据交互

推荐阅读最新更新时间:2024-11-10 05:24

51单片机做信号发生器实例编程
//用51单片机做信号发生器,同时输出四种频率的方波。 //要求:晶振为12MHz,用T0做定时器,在P1的低四位输出四种频率的方波: // P1.3 = 1.25kHz、P1.2 = 2.5kHz、P1.1 = 5kHz、P1.0 = 10kHz //另外,上述四个频率要求用一个四选一数据选择器,再选出其中的一个输出出去。 //P1.6、P1.7的输出用来控制四选一数据选择器的选择位,它们由P3.0按键控制。 //=================================================== //现在增加了PROTEUS仿真图片发上博客。 //题目要求在相邻四条接口线输出的四种频率,恰有二倍的关系,这就
[单片机]
<font color='red'>51单片机</font>做信号发生器实例编程
基于C51单片机的多路开关状态显示电路原理图
如下图所示, AT89S51 单片机的 P1.0 - P1.3 接四个发光二极管 L1 - L4 ,P1.4 - P1.7 接了四个开关 K1 - K4 ,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 1 . 把 “ 单片机系统 ” 区域中的 P1.0 - P1.3 用导线连接到 “ 八路发光二极管指示模块 ” 区域中的 L1 - L4 端口上; 2 . 把 “ 单片机系统 ” 区域中的 P1.4 - P1.7 用导线连接到 “ 四路拨动开关 ” 区域中的 K1 - K4 端口上。
[单片机]
基于C<font color='red'>51单片机</font>的多路开关状态显示电路原理图
51单片机】静态与动态点亮数码管
静态: span style= font-family:Microsoft YaHei;font-size:18px; #include reg52.h sbit dula=P2^6; //数码管寄存器 sbit wela=P2^7; //位寄存器 void main() { wela=1; P0=0xf8; wela=0; //确定几位数码管亮,且使其状态保持 dula=1; P0=0x3f; //显示的数字 dula=0; while(1); //保持常亮 } /span 动态: span style= font-family:Microsoft YaHei;font-si
[单片机]
51单片机程序执行的过程
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条 指令 的过程。计算机每执行一条 指令 都可分为三个阶段进行。即取指令-----分析指令-----执行指令。 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。 一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内
[单片机]
51单片机数据存储类型
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型。分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。 在51系列中data,idata,xdata,pdata的区别: data:固定指前面0x00-0x7f的128个RAM,可以用acc直接
[单片机]
8051单片机教程第二十八课:单片机音乐程序的设计
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。 单片机的基本发音实验 我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为: 其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200
[单片机]
80<font color='red'>51单片机</font>教程第二十八课:单片机音乐程序的设计
51单片机(二十五)—— 独立按键控制LED
在51单片机的前面的文章中,我们主要讲述了单片机IO口的输出功能的应用,如LED控制、数码管控制等。这篇文章我们来讲解如何用单片机的IO口读取按键的状态,并根据按键的状态来控制LED。关于51单片机按键输入功能的介绍可以参考文章《51单片机(二十四)—— 独立按键工作原理》 在本文中,实例的代码如下所示。 #define KEY P2 //定义按键输入端口 #define LED P0 //定义LED输出端口 /********************************************************************/ /* 主函数
[单片机]
如何学习51单片机/心得/KEIL4/DXP
什么是单片机 学习使用单片机就是理解单片机硬件结构,以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置,以及实现各种功能的程序编制。 有人觉得要先学汇编。不过我个人觉得,学习51单片机,还是从C语言入手,一来方便,二来容易上手,仁者见仁,智者见智吧。 关于学习51单片机的书籍,市场上有很多,大家可以择优选取。 那么,如何用程序控制单片机的呢? 我开始学单片机的时候也曾有过这样的困惑啊,ok,下面帮大家整理一下思路。 怎么在Keil里写程序?keil怎么安装破解? 用过VC6.0的同学都知道,VC6.0是一个编译环境。什么是编译环境?简单地说,就是你写代码的地方。 那么,同理,单片机的编译环境就是Ke
[单片机]
如何学习<font color='red'>51单片机</font>/心得/KEIL4/DXP
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved