51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)
51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)3.延时。利用人眼的视觉暂留 1ms<延时<10ms2.送位选 :数组BitCode[]中保存位选信号3.层之间的数据传递(数据缓冲区--数组实现)控制数码管的显示4个步骤1.送段码 :数组leddata[]中保存段码数据
数码管的动态显示,之前都学过,但是一写代码脑子里有些空白。有些不知所措,没有一个大概的步骤,第一步该做什么,第二步该怎么做,逻辑不清晰,还是没有真正的领悟。开始抄代码慢慢修炼....
为什么高手写的代码为什么让人觉得很棒
1.功能模块化封装,
2.层次结构清晰(底层显示和应用层)
3.层之间的数据传递(数据缓冲区--数组实现)
控制数码管的显示4个步骤
1.送段码 :数组leddata[]中保存段码数据
2.送位选 :数组BitCode[]中保存位选信号
3.延时。利用人眼的视觉暂留 1ms<延时<10ms
4.消影 :输出IO口置为低电平
共阴极数码管
Display.h文件
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include <reg51.h>
#include "DelayXms.h"
#define GPIO_SEG P2 //段码 IO 宏定义
#define GPIO_BIT P1 //位选 IO
#define N 4 //数码管的个数
void Display();
void DisplayPost();//显示一小段开机动画
#endif
Display.c文件
#include "display.h"
u8 code leddata[]={ //数码管的段码表
0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x6F //0-9【下标0-9】
0x77 0x7C 0x39 0x5E 0x79 0x71 // A-F【下标10-15】
0x76 0x38 0x37 0x3e 0x73 0x5c 0x40 //h l n u p o -【下标16-22】
};//4位数码管可以显示数字和各种字母字母
u8 code LEDPost[] = {0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80};//开机动画数据
u8 LEDBuf[]={1 1 3 10};//数据显示缓冲区,保存的是leddata[]中下标,显示123A
u8 code BitCode[]={0xfe 0xfd 0xfb 0xf7};//位选控制信号
void Display()
{
/*静态局部变量生命周期:程序结束为止
可以保持变量内容的持久性,函数调用结束时
变量的值仍在*/
static u8 i = 0;
//1.送段码
GPIO_SEG = leddata[LEDBuf[i]];
//2.送位选
GPIO_BIT = BitCode[i];
//3.1ms<延时<10ms
DelayXms(9);
//4.消影
GPIO_SEG = 0x00;//不消影显示会出问题
i ;
if(N == i)
i=0;
}
void DisplayPost() //开机动画
{
u8 j ;
for(j=0;j<sizeof(LEDPost);j )
{
GPIO_SEG = LEDPost[j];
GPIO_BIT = 0xf0;
DelayXms(400);
GPIO_SEG = 0x00;
}
}
main.c文件
#include "display.h"
void main()
{
DisplayPost();//上点小动画
while(1)
{
Display(); //显示【数据缓冲区中存放leddata[]数组下标对应的】数据
}
}
C51和C语言区别
单片机STC89C52
8K字节程序存储空间ROM,断电数据不丢失;
512字节数据存储空间RAM,断电数据丢失;
使用code关键字,可以把常量存储在容量较大的ROM中。