📄 ex5.c
字号:
#include "upsd.h" //引入关于upsd的特殊功能寄存器的声明的头文件
xdata unsigned char CONTROL_B _at_ 0x803;
xdata unsigned char DATAOUT_B _at_ 0x805;
xdata unsigned char DIRECTION_B _at_ 0x807;
unsigned char position; // LED的位码存储单元
unsigned char a[8]; // 8字节长显示缓冲区
unsigned char *disp_ptr; // 显示缓冲区的指针
unsigned char code led_code[11] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};
//数字码表0-9,LED无显示时对应码值为0xff
#define TIMER0_COUNT 0xf8CD // TH0=0xf8,TL0=0xcd,在11.0592MHz的晶振频率下,可实现2ms的计数
bit timer0int; // timer0int是定时器0的中断标志位
unsigned char second,minute,hour; // 时钟的时分秒计时单元
/**********初始化定时器0**********/
void timer0_init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01; // 定时器0,工作方式为方式1
TL0 = (TIMER0_COUNT & 0x00ff); // 设置低8位计数值
TH0 = (TIMER0_COUNT >> 8); // 设置高8位计数值
PT0 = 0; // 低优先级
ET0 = 1; // 使能定时器0中断源
EA = 1; // 允许所有中断源
TR0 = 1; // 启动定时器0
timer0int = 0; // 初始化定时器0的中断标志timer0int为0
}
/*定时器0的中断服务程序,每次中断置中断标志位*/
void timer0isr(void) interrupt 1
{
TL0 = TL0 + (TIMER0_COUNT & 0x00FF); // 重载低8位计数值
TH0 = TH0 + (TIMER0_COUNT >> 8); // 重载高8位计数值
timer0int = 1; // 置中断标志
}
/****24小时制的时钟的秒加1更新****/
void clockinc(void)
{
if(++second == 60) // 秒计数值加1
{
second = 0; // 计时满1分钟,秒计时单元清零
if(++minute == 60) // 分钟计数值加1
{
minute = 0; // 计时满1小时,分计时单元清零
if(++hour == 24) hour = 0; // 小时计数值加1,加至24时清零
}
}
}
/********LED显示的初始化********/
void led_init(void)
{
CONTROL_B = 0; // 初始化PB口为MCU模式
DATAOUT_B = 0; // 将PB口的输出数据寄存器清零
DIRECTION_B = 0xff; // PB口数据传输方向为输出
position = 0x80; // 初始化位码为0x80
disp_ptr = &a; // 初始化显示缓冲区指针disp_ptr指向a[0]
}
/*将时分秒以非压缩BCD码的形式装载到显示缓冲区*/
void load_buff(void)
{
a[0] = hour/10; a[1] = hour%10; // 将小时的高位送到a[0],低位到a[1]
a[2] = minute/10; a[3] = minute%10;
a[4] = second/10; a[5] = second%10;
a[6] = 10; a[7] = 10; // a[6],a[7]赋值10,LED无显示内容
}
/*1位LED显示,并更新位码和显示缓冲指针*/
void display(void)
{
P4 = 0xff; // 熄影
DATAOUT_B = position; // 输出位码
position = position>>1; // 更新位码
if(position == 0) position = 0x80;
P4 = led_code[*disp_ptr++]; // 输出段码
if(position == 0x80) disp_ptr = &a; // 更新显示缓冲指针
}
main()
{
unsigned int i = 0;
WDKEY = 0x55; // 关看门狗定时器
second = 0; minute = 59; hour = 23; // 初始化时钟
timer0_init();
led_init();
load_buff();
for(;;)
{
if(timer0int)
{
timer0int=0; // 2ms到,清中断标志
display(); // LED显示
if(++i == 500)
{
i = 0; // 1秒到,i清零
clockinc(); // 24小时制的时钟进行秒加1更新
load_buff(); // 更新显示缓冲区
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -