模块:数码管动态显示 (官方竞赛开发平台)
一直在奔跑的孩子 发布了12 篇原创文章 · 获赞 2 · 访问量 4065 私信 关注功能; 在CD107D单片机综合训练平台上,实现数码管的动态显示,在8位数码管中,前面4位显示年份“2020”,接下来的两位是分隔符“-” , 最后两位显示月份,从1月开始,每间隔一段时间加一月,到12月后,又从一月开始递增,依次重复
#include "STC15F2K60S2.H" #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit fe = P0^6; sbit ji = P0^4; uchar num = 1; uint code SMG_duanma[] = //数码管段选表 {0xc0 ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; void Delay2ms() //@12.000MHz { unsigned char i, j; i = 24; j = 85; do { while (--j); } while (--i); } void HC138init (uchar n) // HC138 译码器初始化函数 当形参是数字几 就让第几个端口 输出低电平 { switch (n) { case 4: P2 = (P2 & 0x1f) | 0x80; // 4 是流水灯控制位 break; case 5: //5 是蜂鸣器以及继电器控制位 P2 = (P2 & 0x1f) | 0xa0; break; case 6: // 6 是数码管位选控制位 P2 = (P2 & 0x1f) | 0xc0; break; case 7: // 7 是数码管段选控制位 P2 = (P2 & 0x1f) | 0xe0; break; } } void LEDinit() // LED 初始化函数 因为LED和数码管都是接在P0口 需要把LED 全部熄灭 { HC138init(4); P0 = 0xff; } void displaybit (uchar pos,dat) // 数码管静态显示 { HC138init (6); P0 = 0x01<<(pos-1); HC138init (7); P0 = SMG_duanma[dat]; } void display() { displaybit (1,2) ;// 第一个数码管显示2 Delay2ms(); displaybit (2,0) ;// 第二个数码管显示0 Delay2ms(); displaybit (3,2) ;// 第三个数码管显示2 Delay2ms(); displaybit (4,0) ;// 第四个数码管显示0 Delay2ms(); displaybit (5,10) ; // 第五个数码管显示 第一个分隔符 Delay2ms(); displaybit (6,10) ; // 第六个数码管显示 第二个分隔符 Delay2ms(); displaybit (7,(num/10)) ; // 第五个数码管显示 第一个分隔符 Delay2ms(); displaybit (8,(num%10)) ; // 第六个数码管显示 第二个分隔符 Delay2ms(); } void delay (uchar time) { while(time--) { display(); } } void main () { LEDinit(); while(1) { display(); num++; if(num == 13) num = 1; delay(50); // 题目要求,要经过一段时间后,数字累加变化。要有一个延时,这个延时过程中,保持数字不变 } }