补发上节课的电路原理图。当涉及到多个数码管时,我们只需将每个数码管的a、b、c、d、e、f、g和h脚相应地连接在一起,并将控制位分别接至P1.0、P1.1、P1.2和P1.3。只有当对应的控制位为0时,被控制的数码管才会显示。
上节课的显示系统仅能展示一个数码管的内容,并且需要持续在主循环中等待。这并不符合我们的实际使用需求。我们可以考虑在定时器中设置时间变化,使得数码管显示更为流畅。
定义一个状态标志位,用来判断何时需要刷新数码管。比如我们可以设置当时间到达1秒时进行刷新,不足1秒则不进行刷新。
接下来,我们需要定义数码管的控制位,以决定哪个数码管进行显示。
为了方便数字的显示,我们可以定义一个数组来存储要显示的数字的缩写。
在代码中,我们引入了相应的头文件。
include
然后定义了几个控制位为P1的sbit变量。
sbit kongzhi0 = P1^0;
sbit kongzhi1 = P1^1;
sbit kongzhi2 = P1^2;
sbit kongzhi3 = P1^3;
接下来是定义了一个数码管数字编码的数组。
unsigned char code shuzi[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
定义了几个变量来记录时间以及刷新状态。
unsigned int miaoshu = 0; // 时间变量,记录秒数
bit shuaxin = 0; // 刷新状态标志位
unsigned char i = 0; // 控制数码管的索引变量
unsigned char xsds[] = {0xff, 0xff, 0xff, 0xff}; // 用于暂存数码管显示数据的数组
在主函数中,我们首先进行了一些初始化设置。
void main() {
EA = 1; // 开启总中断
TMOD = 0x01; // 设置定时器模式
TH0 = 0xD8; // 设置定时器初值高8位
TL0 = 0xEF; // 设置定时器初值低8位
ET0 = 1; // 开启定时器中断允许位
TR0 = 1; // 启动定时器
while (1) { // 主循环开始
} // 主循环结束
} // 主函数结束
接着是定时器的中断服务程序。
void dingshiqi0() interrupt 1 { // 定时器中断服务程序函数,编号为1的定时器中断服务程序(此处根据实际使用情况而定)
TH0 = 0xD8; // 重置定时器初值高8位(此处重复设置初值可能是为了确确计时)
TL0 = 0xEF; // 重置定时器初值低8位(同上)
j++; // 时间递增计数器(此处j与原代码中的i不同)
if (j >= 10) { // 当时间达到一定值时执行后续操作(根据实际情况设定条件)
j = 0; // 重置时间计数器并重置时间数据及显示等(重置的变量未在原代码中给出)
miaoshu++; // 时间增加(此处miaoshu为秒数变量)