下面是我的程序,是不是只有时钟和中断才能实现呢?
#include <REGX52.H>
void Delay(unsigned int xms)//@11.0592MHz
{
unsigned char data i, j;
while(xms--)
{i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};//数码管显示数字断码
void Nixie(unsigned char Location,Number)//第几个数码管,显示的数字
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];//调用第几个断码
Delay(1);
P0=0x00;
}
void main()
{
while(1)
{
Nixie(8,6);Nixie(7,6);Nixie(6,6);
//第八个晶体管,显示6//第七个晶体管,显示6//第六个晶体管,显示6
}
}
/*********************************************************
是普中的A2开发板
89c52rc
下面是数码管和译码器的原理图
多位数码管如何同时亮并间隔一段时间再灭?
关键词: 数码管
为了实现多位数码管同时亮并间隔一段时间再灭,可以使用定时器和中断来实现。下面是修改后的程序:
```c
#include
void Delay(unsigned int xms) {
unsigned char i, j;
while (xms--) {
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
}
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; // 数码管显示数字断码
void Nixie(unsigned char Location, unsigned char Number) {
switch (Location) {
case 1:
P2_4 = 1;
P2_3 = 1;
P2_2 = 1;
break;
case 2:
P2_4 = 1;
P2_3 = 1;
P2_2 = 0;
break;
case 3:
P2_4 = 1;
P2_3 = 0;
P2_2 = 1;
break;
case 4:
P2_4 = 0;
P2_3 = 1;
P2_2 = 1;
break;
}
P0 = NixieTable[Number]; // 显示数字
Delay(1); // 延时1ms
switch (Location) {
case 1:
P2_4 = 0;
P2_3 = 0;
P2_2 = 0;
break;
case 2:
P2_4 = 0;
P2_3 = 0;
P2_2 = 1;
break;
case 3:
P2_4 = 0;
P2_3 = 1;
P2_2 = 0;
break;
case 4:
P2_4 = 1;
P2_3 = 0;
P2_2 = 0;
break;
}
}
void Timer0_Init() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xFC; // 定时器初值
TL0 = 0x18;
ET0 = 1; // 使能定时器0中断
EA = 1; // 使能全局中断
TR0 = 1; // 启动定时器0
}
void Timer0_ISR() interrupt 1 {
TH0 = 0xFC; // 重新加载定时器初值
TL0 = 0x18;
static unsigned char count = 0;
count++;
if (count >= 1000) { // 1000次中断,约1秒
count = 0;
P2 = 0xFF; // 关闭所有数码管
}
}
void main() {
unsigned char i;
Timer0_Init(); // 初始化定时器0
while (1) {
for (i = 1; i <= 4; i++) {
Nixie(i, i); // 显示数字i
}
}
}
```
这个程序使用了定时器0和中断来实现数码管的显示。首先,初始化定时器0,设置为工作模式1,定时器初值为0xFC18,使能定时器0中断和全局中断,然后启动定时器0。在定时器0的中断服务程序中,重新加载定时器初值,并通过一个静态变量`count`来计数。当计数达到1000次(约1秒)时,关闭所有数码管。
在主函数中,使用一个循环来依次显示数字1到4。每次调用`Nixie`函数时,会根据传入的数码管位置和数字来显示相应的数字。这样,数码管会依次显示数字1到4,然后间隔一段时间(约1秒)再灭。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |