模块:数码管 (使用的蓝桥杯官方竞赛开发平台)
功能:八个数码管依次显示0~9 (也可以到F) 然后全部数码管显示 0~9 (也可以到F)依次往复循环
/************************************
功能: 数码管从左至右依次显示0~9 之后八个数码管同时显示0~F
************************************/
#include "STC15F2K60S2.H"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint code SMG_duanma[] = //数码管段选表
{0xc0 ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Delay50ms() //@12.000MHz 软件延时
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 72;
k = 161;
do
{
do
{
while (--k);
} 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) // 带形参的 表示让第pos位显示dat
{
HC138init(6); // 使控制数码管位选的锁存器 打开
P0 = 0x01 << (pos-1); // 起始是数码管第一个 然后左移 pos-1
HC138init(7);
P0 = SMG_duanma[dat] ;
}
void display ()
{
uchar i=1; uchar j;
for(i=1;i<10;i++) // 用来控制数码管的位数
{
for(j=0;j<10;j++) // 用来控制数码管的段数
{
displaybit(i,j);
Delay50ms();
Delay50ms();
Delay50ms();
Delay50ms();
}
}
for(j=0;j<16;j++)
{
HC138init(6); // 使控制数码管位选的锁存器 打开
P0 = 0xff;
HC138init(7);
P0 = SMG_duanma[j];
Delay50ms();
Delay50ms();
Delay50ms();
Delay50ms();
}
}
void main () // 主函数
{
LEDinit();
while(1)
{
display (); // 因为 程序要一直循环下去 要在while 中 一直执行
}
}