快捷搜索:  汽车  科技

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)3.延时。利用人眼的视觉暂留 1ms<延时<10ms2.送位选 :数组BitCode[]中保存位选信号3.层之间的数据传递(数据缓冲区--数组实现)控制数码管的显示4个步骤1.送段码 :数组leddata[]中保存段码数据

数码管的动态显示,之前都学过,但是一写代码脑子里有些空白。有些不知所措,没有一个大概的步骤,第一步该做什么,第二步该怎么做,逻辑不清晰,还是没有真正的领悟。开始抄代码慢慢修炼....

为什么高手写的代码为什么让人觉得很棒

1.功能模块化封装,

2.层次结构清晰(底层显示和应用层)

3.层之间的数据传递(数据缓冲区--数组实现)

控制数码管的显示4个步骤

1.送段码 :数组leddata[]中保存段码数据

2.送位选 :数组BitCode[]中保存位选信号

3.延时。利用人眼的视觉暂留 1ms<延时<10ms

4.消影 :输出IO口置为低电平

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)(1)

共阴极数码管

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)(2)

显示功能实现

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[]数组下标对应的】数据 } }

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)(3)

C51和C语言区别

单片机STC89C52

8K字节程序存储空间ROM,断电数据不丢失;

512字节数据存储空间RAM,断电数据丢失;

使用code关键字,可以把常量存储在容量较大的ROM中。

51单片机是如何控制数码管的(记住这几个步骤数码管变得简简单单)(4)

猜您喜欢: