单片机数码管从00到99C语言_用C语言编写51单片机显示数码管00~99频率可调程序(模块化)...

该博客分享了一段使用C语言编写的51单片机程序,用于在数码管上显示从00到99的计时器。程序包括初始化、定时中断、按键处理等功能,可以实现时间的递增并有整点报时。用户可以修改端口和计时器以适应不同需求。
摘要由CSDN通过智能技术生成

你可以参考下面这个程序,这个是加计时器.把对应端口改下,计时改减就可以了.

数码管的显示网上大把,移植一下就可以了.

//--------LCD 1601 clock----------------------------------------

//---modified from a LCD1602 program,2012/11/21-----------------

#include

#define uchar unsigned char

#define uint unsigned int

//----P3: key input for modify timer ---------------------------

#define KEY_IO P3

#define LCD_IO P0

sbit LCD_RS = P2^0;

sbit LCD_RW = P2^1;

sbit LCD_EN = P2^2;

//----P1.2: timer speaker output-------------------------------

sbit SPK = P1^2;

//----P2.4: timer LED indicator output------------------------

sbit LED = P2^4;

bit new_s, modify = 0;

char t0, sec = 50, min = 59, hour = 23;

//char code LCD_line1[] = "Designed by ZELD";

char code LCD_line2[] = "Timer: 00:00:00 ";

char Timer_buf[] = "23:59:50";

//---------------------------------------------------

void delay(uint z)

{

uint x, y;

for(x = z; x > 0; x--) for(y = 100; y > 0; y--);

}

//---------------------------------------------------

void W_LCD_Com(uchar com) //写指令

{

LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令

LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲

}

//---------------------------------------------------

void W_LCD_Dat(uchar dat) //写数据

{

LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据

LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲

}

//---------------------------------------------------

void W_LCD_STR(uchar *s) //写字符串

{

while(*s) W_LCD_Dat(*s++);

}

//---------------------------------------------------

void W_BUFF(void) //填写显示缓冲区

{

Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;

Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;

Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;

// W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);

//1602 start from address C0H(second row),1601 start from 40H-------

W_LCD_Com(0x80 + 7); W_LCD_STR(Timer_buf);

}

//---------------------------------------------------

uchar read_key(void)

{

uchar x1, x2;

KEY_IO = 255;

x1 = KEY_IO;

if (x1 != 255) {

delay(100);

x2 = KEY_IO;

if (x1 != x2) return 255;

while(x2 != 255) x2 = KEY_IO;

if (x1 == 0x7f) return 0;

else if (x1 == 0xbf) return 1;

else if (x1 == 0xdf) return 2;

else if (x1 == 0xef) return 3;

else if (x1 == 0xf7) return 4;

}

return 255;

}

//---------------------------------------------------

void Init()

{

LCD_RW = 0;

W_LCD_Com(0x38); delay(50);

W_LCD_Com(0x0c);

W_LCD_Com(0x06);

W_LCD_Com(0x01);

// W_LCD_Com(0x80); W_LCD_STR(LCD_line1);

// W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);

W_LCD_Com(0x80); W_LCD_STR(LCD_line2);

TMOD = 0x01; //T0定时方式1

TH0 = 0x4c;

TR0 = 1; //启动T0

PT0 = 1; //高优先级, 以保证定时精度

ET0 = 1;

EA = 1;

}

//---------------------------------------------------

void main()

{

uint i, j;

uchar Key;

Init();

while(1) {

//-------------------------------

if (new_s) { //如果出现了新的一秒, 修改时间

new_s = 0; sec++; sec %= 60;

if(!sec) { min++; min %= 60;

if(!min) { hour++; hour %= 24;}

}

W_BUFF(); //写显示

//-------------------------------

if (!sec && !min) { //整点报时

for (i = 0; i < 200; i++) {

SPK = 0; for (j = 0; j < 100; j++);

SPK = 1; for (j = 0; j < 100; j++);

} }

}

//-------------------------------

Key = read_key(); //读出按键

switch(Key) { //分别处理四个按键

case 0: modify = 1; break;

case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}

case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}

case 3: modify = 0; break;

} }

}

//---------------------------------------------------

void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次

{

TH0 = 0x4c;

t0++; t0 %= 20; //20, 一秒钟

if(t0 == 0) {new_s = 1; LED = ~LED;}

if(modify) LED = 0;

}

//===================================================

取消

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值