历史上的今天
今天是:2025年07月21日(星期一)
2018年07月21日 | 51单片机之数码管显示实验
2018-07-21 来源:eefocus
/*
名称:51单片机之数码管显示实验
说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。
本实验编写了几个数码管显示的简单程序。在此不做赘述了。
*/
#include
#define uchar unsigned char
//共阳极段码(a在高位,dp在低位)
uchar code _data[16] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,
0x11,0xC1,0x63,0x85,0x61,0x71
};
//共阳极段码(a在低位,dp在高位)
uchar code _data1[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
0x83,0xC6,0xA1,0x86,0x8E
};
//延时函数
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i for(j=0;j<123;j++); } //一位数码管循环显示0-F(共阳极) void OneNixieTube() { uchar i = 0; while(1) { for(i = 0;i<16;++i) { P2 = _data1[i]; delay_ms(1000); } } } //静态数码管循环显示0-8 void StaticNixieTube() { uchar i = 0,temp = 0; while(1) { for(i = 0;i<16;++i) { //片选部分 if(i%8 == 0) temp = 0x01; else temp = temp<<1; P0 = ~temp; //P0为片选输出端口,低电平有效 //显示部分 P2 = ~_data1[i]; //P2为显示输出端口 delay_ms(1000); } } } //动态数码管显示(0-7,8-F,8个数码管分两次显示) void DynamicNixieTube() { uchar i = 0; unsigned int delay_time = 0; //0-7 8-F每段的延时时间 uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //片选码 while(1) { if(delay_time++ < 250) { //0-7段显示 for(i = 0;i < 8;++i) { P0 = CS[i]; P2 = ~_data1[i]; delay_ms(1); //延时极小的时间间隔,人眼察觉不出来 } } else if(delay_time++ < 500 ) //???都是循环250次,为什么0-7段显示的时间长于8-F段显示的时间??? { //8-F段显示 for(i = 0;i < 8;++i) { P0 = CS[i]; P2 = ~_data1[i+8]; delay_ms(1); //延时极小的时间间隔,人眼察觉不出来 } } else delay_time = 0; //重新置零 } } //数码管显示指定时间格式为 HH-MM-SS void DisplayTime(uchar hour,uchar min,uchar sec) { uchar time[8] = {0}; uchar i = 0,j = 0; uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //片选码 //获取时间的每位信息 if(hour >= 0 && hour <=23 ) { time[0] = hour / 10; time[1] = hour % 10; time[2] = ':'; } if(min >= 0 && min <= 59) { time[3] = min /10; time[4] = min % 10; time[5] = ':'; } if(sec >= 0 && sec <= 59) { time[6] = sec / 10; time[7] = sec % 10; } //显示部分 for(i = 0;i<7;++i) { for(i = 0;i < 8;++i) { P0 = CS[i]; //片选 //显示时间 if(i != 2 && i != 5) { j = time[i]; P2 = ~_data1[j]; } else //显示分隔符‘-’ { j = 0xBF; P2 = ~j; } delay_ms(1); //延时极小的时间间隔,人眼察觉不出来 } } } int main() { // OneNixieTube(); // StaticNixieTube(); //DynamicNixieTube() //DisplayTime(12,40,56); return 0; }
上一篇:C51之外部中断
下一篇:51单片机之按键实验
史海拾趣
|
1、引脚式(Lamp)LED封装 引脚式封装就是常用的Æ3-5mm封装结构。一般用于电流较小(20-30mA),功率较低(小于0.1W)的LED封装。主要用于仪表显示或指示,大规模集成时也可作为显示屏。其缺点在于封装热阻较大(一般高于100K/W),寿命较短。 ...… 查看全部问答> |
|
单片机测控系统中的抗干扰技术 (转载!) 摘 要:本文针对单片机测控系统中的干扰因素,并结合实际应用系统给出了采取软、硬件两种方法抗干扰的具体措施。 关键词:单片机测控系统抗干扰? 概述 干扰是造成单片机测控系统故障的主要原 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 大家好,就像座机电话后面长途锁,拧到左边就能打长途,拧到右边就不能打长途了,这种信号锁叫什么名字啊。什么工作原理呢?好奇,望大家赐教啊....... … 查看全部问答> |
|
STM8S的bootloader,能STM32一样串口ISP? 仔细看了UM0560,UM0462,并试了一下UM0462.zip;还是不知道STM8S能不能像STM32一样,通过串口ISP? UM0560里提到可以通过UART、CAN、SPI等进行bootloader,好像是通过寄存器的值来选择启动方式。 但是,如果我只有一个STM8S板,没有ST-LINK ...… 查看全部问答> |
|
智能电网和IED 智能电网是一种使用信息和通信技术对电网内信息进行采集,并基于采集到的信息(例如发电厂和电能消耗的对等信息)可以自动协调的电网。智能电网通过电力系统的高度自动化,可以改进发电和配电的效率、可靠性、经济性以保证电力网络的 ...… 查看全部问答> |




