C语言实现数码管同时显示1234的代码如下:
```c
#include <reg51.h>
// 数码管编码表
unsigned char code seg_table[] = {
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90 // 9
};
void main() {
unsigned char i, j, k, l;
while (1) {
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
for (l = 0; l < 10; l++) {
// 显示千位
P0 = seg_table[i];
P2 = 0x08;
delay();
// 显示百位
P0 = seg_table[j];
P2 = 0x04;
delay();
// 显示十位
P0 = seg_table[k];
P2 = 0x02;
delay();
// 显示个位
P0 = seg_table[l];
P2 = 0x01;
delay();
}
}
}
}
}
}
// 延时函数
void delay() {
unsigned char i, j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 200; j++);
}
}
```
汇编语言实现8个数码管同时显示12345678的代码如下:
```assembly
ORG 0x0000
MOV SP, #0x7F
; 数码管编码表
SEG_TABLE: DB 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
; 程序入口
START:
MOV A, #0x00 ; A寄存器存放计数值
LOOP:
INC A ; 计数值加1
CJNE A, #10, LOOP ; 如果计数值不等于10则跳转到LOOP
MOV A, #0x00 ; A寄存器清零
OUT_LOOP:
INC A ; 计数值加1
CJNE A, #10, OUT_LOOP ; 如果计数值不等于10则跳转到OUT_LOOP
MOV A, #0x00 ; A寄存器清零
IN_LOOP:
INC A ; 计数值加1
CJNE A, #10, IN_LOOP ; 如果计数值不等于10则跳转到IN_LOOP
MOV A, #0x00 ; A寄存器清零
MOV R0, #0x00 ; R0寄存器存放数码管段码
MOV R1, #0x80 ; R1寄存器存放数码管位码
MOV R2, #0x00 ; R2寄存器存放循环计数值
MOV R3, #0x01 ; R3寄存器存放位码移位值
DISPLAY_LOOP:
MOV R0, SEG_TABLE+A ; 从编码表中获取段码
MOV P0, R0 ; 将段码输出至P0口
MOV P2, R1 ; 将位码输出至P2口
CALL DELAY ; 调用延时函数
INC R2 ; 循环计数值加1
CJNE R2, #8, BIT_SHIFT ; 如果循环计数值等于8则跳转到BIT_SHIFT
MOV R2, #0x00 ; 循环计数值清零
ADD R1, R3 ; 位码移位1位
CJNE R1, #0x10, DISPLAY_LOOP ; 如果位码不等于0x10则跳转到DISPLAY_LOOP
MOV R1, #0x80 ; 位码恢复为0x80
SJMP LOOP ; 跳转到LOOP,开始下一轮循环
; 位码移位子程序
BIT_SHIFT:
ADD R1, R3 ; 位码移位1位
RET
; 延时函数
DELAY:
MOV R7, #0x0A
L1: MOV R6, #0xFF
L2: DJNZ R6, L2
DJNZ R7, L1
RET
END
```