51单片机点阵解析

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

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

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


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

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

并且做了详细的解析


代码参考了普中给的代码

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


代码如下



 #include <reg52.h>
 #include <intrins.h>


//重定义 函数变量
#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
}



相关推荐
CHM格式,图文、代码精排版 目录 第1章 如何学习单片机 1.1 学什么单片机 1.2 如何学习单片机 1.3 单片机学习的准备工作 1.4 单片机开发软件环境搭建 1.5 Keil 基本概况介绍 1.6 答读者问 第2章 点亮你的 LED 2.1 单片机的内部资源 2.2 单片机最小系统 2.2.1 电源 2.2.2 晶振 2.2.3 复位电路 2.3 LED 小灯 2.4 程序代码编写 2.4.1 特殊功能寄存器和位定义 2.4.2 新建一个工程 2.4.3 编写点亮小灯的程序 2.5 程序下载 2.6 练习题 第3章 硬件基础知识学习 3.1 电磁干扰 EMI 3.2 去耦电容的应用 3.3 三极管在数字电路中的应用 3.3.1 三极管的初步认识 3.3.2 三极管的原理 3.3.3 三极管的应用 3.4 74HC138 三八译码器的应用 3.5 LED 闪烁程序 3.6 练习题 第4章 C 语言基础以及流水灯的实现 4.1 二进制、十进制和十六进制 4.2 C 语言变量类型和范围 4.3 C 语言基本运算符 4.4 for 循环语句 4.5 while 循环语句 4.6 函数的简单介绍 4.7 Keil 软件延时 4.8 流水灯程序 4.9 练习题 第5章 定时器与数码管基础 5.1 逻辑电路与逻辑运算 5.2 定时器的学习 5.2.1 定时器的初步认识 5.2.2 定时器的寄存器 5.2.3 定时器的应用 5.3 数码管的学习 5.3.1 数码管的基本介绍 5.3.2 数码管的真值表 5.3.3 数码管的静态显示 5.4 练习题 第6章 中断与数码管动态显示 6.1 C 语言的数组 6.1.1 数组的基本概念 6.1.2 数组的声明 6.1.3 数组的初始化 6.1.4 数组的使用和赋值 6.2 if 语句 6.3 switch 语句 6.4 数码管的动态显示 6.4.1 动态显示的基本原理 6.4.2 数码管显示消隐 6.5 单片机中断系统 6.5.1 中断的产生背景 6.5.2 定时器中断的应用 6.5.3 中断的优先级 6.6 练习题 第7章 变量进阶与点阵 LED 7.1 变量的作用域 7.1.1 局部变量 7.1.2 全局变量 7.2 变量的存储类别 7.3 点阵的初步认识 7.4 点阵的图形显示 7.5 点阵的动画显示 7.5.1 点阵的纵向移动 7.5.2 点阵的横向移动 7.6 练习题 第8章 函数进阶与按键 8.1 单片机最小系统解析 8.1.1 电源 8.1.2 晶振 8.1.3 复位电路 8.2 函数的调用 8.3 函数的形式参数和实际参数 8.4 按键 8.4.1 独立按键 8.4.2 矩阵按键 8.4.3 独立按键的扫描 8.4.4 按键消抖 8.4.5 矩阵按键的扫描 8.5 简易加法计算器 8.6 练习题 第9章 步进电机与蜂鸣器 9.1 单片机 IO 口的结构 9.2 上下拉电阻 9.3 28BYJ-48 型步进电机详解与实例 9.3.1 电机的分类 9.3.2 28BYJ-48 型步进电机原理详解 9.3.3 让电机转起来 9.3.4 转动精度与深入分析 9.3.5 编写实用程序的基础 9.3.6 包含综合应用的实用程序 9.4 蜂鸣器 9.5 练习题 第10章 实例练习与经验积累 10.1 数字秒表实例 10.1.1 不同数据类型间的相互转换 10.1.2 定时时间精准性调整 10.1.3 字节操作修改位的技巧 10.1.4 数码管扫描函数算法改进 10.1.5 秒表程序 10.2 PWM 知识与实例 10.3 交通灯实例 10.4 51 单片机 RAM 区域的划分 10.5 长短按键的应用 10.6 练习题 第11章 UART串口通信 11.1 串行通信的初步认识 11.2 RS232 通信接口 11.3 USB 转串口通信 11.4 IO 口模拟 UART 串口通信 11.5 UART 串口通信的基本应用 11.5.1 通信的三种基本类型 11.5.2 UART 模块介绍 11.5.3 UART 串口程序 11.6 通信实例与 ASCII 码 11.7 练习题 第12章 指针基础与 1602液晶的初步认识 12.1 指针的概念与指针变量的声明 12.1.1 变量的地址 12.1.2 指针变量的声明 12.1.3 指针的简单示例 12.2 指向数组元素的指针 12.2.1 指向数组元素的指针和运算法则 12.2.2 指向数组元素指针的实例 12.3 字符数组和字符指针 12.3.1 常量和符号常量 12.3.2 字符和字符串数组实例 12.4 1602 液晶的认识 12.4.1 1602 液晶的硬件接口介绍 12.4.2 1602 液晶的读写时序介绍 12.4.3 1602 液晶的指令介绍 12.4.4 1602 液晶简单实例 12.5 练习题 第13章 1602液晶与串口的应用实例 13.1 通信时序解析 13.2 1602 整屏移动 13.3 多.c 文件的初步认识 13.4 计算器实例 13.5 串口通信机制和实用的串口例程 13.6 练习题 第14章 I2C总线与 EEPROM 14.1 I2C 时序初步认识 14.2 I2C 寻址模式 14.3 EEPROM 的学习 14.3.1 EEPROM 单字节读写操作时序 14.3.2 EEPROM 多字节读写操作时序 14.3.3 EEPROM 的页写入 14.4 I2C 和 EEPROM 的综合实验学习 14.5 练习题 第15章 实时时钟 DS1302 15.1 BCD 码的概念 15.2 SPI 时序初步认识 15.3 实时时钟芯片 DS 15.3.1 DS1302 的特点 15.3.2 DS1302 的硬件信息 15.3.3 DS1302 寄存器介绍 15.3.4 DS1302 通信时序介绍 15.3.5 DS1302 的 BURST 模式 15.4 复合数据类型 15.4.1 结构体数据类型 15.4.2 共用体数据类型 15.4.3 枚举数据类型 15.5 电子钟实例 15.6 练习题 第16章 红外通信与 DS18B20温度传感器 16.1 红外光的基本原理 16.2 红外遥控通信原理 16.3 NEC 协议红外遥控器 16.4 温度传感器 DS18B 16.5 练习题 第17章 模数转换 A/D与数模转换 D/A 17.1 A/D 和 D/A 的基本概念 17.2 A/D 的主要指标 17.3 PCF8591 的硬件接口 17.4 PCF8591 的软件编程 17.5 A/D 差分输入信号 17.6 D/A 输出 17.7 简易信号发生器实例 17.8 练习题 第18章 RS485通信与 Modbus 协议 18.1 RS485 通信 18.2 Modbus 通信协议介绍 18.2.1 Modbus 协议特点 18.2.2 RTU 协议帧数据 18.3 Modbus 多机通信例程 18.4 练习题 第19章 实践项目开发——多功能电子钟 19.1 类型说明 19.2 头文件 19.3 条件编译 19.4 项目实战——多功能电子钟 19.4.1 项目需求分析 19.4.2 程序结构规划 19.4.3 程序代码编写 19.5 练习题 第20章 单片机开发常用工具的使用 20.1 万用表 20.1.1 什么是万用表 20.1.2 万用表的使用方法 20.2 示波器 20.2.1 什么是示波器 20.2.2 示波器的使用 20.3 逻辑分析仪 20.3.1 什么是逻辑分析仪 20.3.2 逻辑分析仪的参数 20.3.3 逻辑分析仪的使用 20.3.4 应用实例——分析 UART、I2C、SPI 20.3.5 数字电路应用中逻辑分析仪比之示波器的优势 20.4 练习题 附录 1 ASCII 字符表 附录 2 C 语言运算符及优先级 附录 3 KST-51 开发板原理图
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页