基于C语言在8×8点阵实现9到0倒计时牌显示

基于C语言在8×8点阵实现9到0倒计时牌显示。
每个数之间为1秒间隔,采用定时器实现。

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

code unsigned char image[10][8]={
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xC3},		   //要显示数字9时,对于的P0值
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDB,0xDB,0xC3},
{0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF},		   //要显示数字7时,对于的P0值
{0xFF,0xFB,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3},
{0xFF,0xC3,0xFB,0xFB,0xC3,0xDF,0xDF,0xC3},
{0xFF,0xDB,0xDB,0xDB,0xC3,0xDF,0xDF,0xDF},
{0xFF,0xC3,0xDF,0xDF,0xC3,0xDF,0xDF,0xC3},
{0xFF,0xC3,0xDF,0xDF,0xC3,0xFB,0xFB,0xC3},
{0xEF,0xE7,0xE3,0xE7,0xE7,0xE7,0xE7,0x81},
{0xFF,0xC3,0xDB,0xDB,0xDB,0xDB,0xC3,0xFF}
};

void main()
{
	ENLED = 0;		  //使能点阵
	ADDR3 = 0;		 

	EA = 1;			  //打开中断
	ET0 = 1;		  

	TMOD = 0x01;	  //定时器初始化
	TH0 = 0xFC;
	TL0 = 0x67;
	TR0 = 1;		   

	while(1);
}

void InterrupTimer0() interrupt 1
{
	static unsigned long cnt = 0;	//ms计数
	static unsigned char sec = 0;	//s计数
	static unsigned char i = 0;		//点阵行号

	TH0 = 0xFC;			   //定时器重新赋值,保证每次为1ms
	TL0 = 0x67;

	cnt++;
	if(cnt>=1000)			
	{
		cnt = 0;
		sec++;
		if(sec>9)
		{
		sec = 0;
		}

	}

	P0 = 0xFF;				//消隐
	switch(i)
	{
		case 0 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[sec][0];break;
		case 1 : ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[sec][1];break;
		case 2 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[sec][2];break;
		case 3 : ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++;P0 = image[sec][3];break;
		case 4 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = image[sec][4];break;
		case 5 : ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++;P0 = image[sec][5];break;
		case 6 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i++;P0 = image[sec][6];break;
		case 7 : ADDR2 = 1;ADDR1 = 1;ADDR0 = 1;i=0;P0 = image[sec][7];break;
		default : break;
	}
}
  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是51单片机点阵倒计时程序的代码: ``` #include <reg51.h> #include <intrins.h> typedef unsigned char uchar; typedef unsigned int uint; #define CLK 6 // 时钟线 #define DATA 7 // 数据线 #define LATCH 5 // 锁存线 sbit CLK_PIN = P2^CLK; sbit DATA_PIN = P2^DATA; sbit LATCH_PIN = P2^LATCH; uchar code LED_DuanMa[17] = { // 共阴极数码管的段码 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00 }; uchar code LED_WeiMa[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // 共阴极数码管的位码 uchar code TimeSet[8] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; // 倒计时时间,从1秒开始 void delay(uint t) { // 延时函数 uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void Display() { // 显示函数 uchar i, j, k; for (i = 0; i < 8; i++) { // 逐位扫描 k = LED_WeiMa[i]; // 获取当前位码 LATCH_PIN = 0; // 锁存线拉低 for (j = 0; j < 8; j++) { // 逐段输出 DATA_PIN = (LED_DuanMa[TimeSet[j]] & (0x01 << i)) ? 1 : 0; // 获取当前段码 CLK_PIN = 0; _nop_(); CLK_PIN = 1; } DATA_PIN = (k & 0x01) ? 1 : 0; // 输出位码 CLK_PIN = 0; _nop_(); CLK_PIN = 1; LATCH_PIN = 1; // 锁存线拉高 } } void main() { uchar i, j; while (1) { for (i = 0; i < 8; i++) { // 倒计时循环 TimeSet[i]--; if (TimeSet[i] == 0xff) { // 溢出处理 TimeSet[i] = 9; if (i == 7) { // 倒计时结束 delay(1000); for (j = 0; j < 8; j++) TimeSet[j] = 0; } else TimeSet[i+1]--; } } Display(); // 显示倒计时 delay(5); // 每个数码管显示5ms } } ``` 本程序使用共阴极的4位数码管,通过逐位扫描和逐段输出的方式实现倒计时显示。其中,TimeSet数组存储倒计时时间,每个元素表示一个数码管的值,从左到右依次为秒(十位)、秒(个位)、分(十位)、分(个位)、时(十位)、时(个位)、天(十位)、天(个位)。每隔5ms刷新一次数码管,倒计时结束后延时1秒并清零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值