原代码:
DBUF0 EQU 30H ;置存储区首址
TEMP EQU 40H ;置存储区首址
DIN BIT 0B0H ;置串行输出口
CLK BIT 0B1H ;置时钟输出口
ORG 00H
MOV 30H,#1H ;存入显示数据
MOV 31H,#5H
DISP: MOV R0,#DBUF0
MOV R1,#TEMP
MOV R2,#2
DP10: MOV DPTR,#SEGTAB ;表头地址
MOV A,@R0
MOVC A,@A+DPTR ;查表指令
MOV @R1,A
INC R1
INC R0
DJNZ R2,DP10
MOV R0,#TEMP ;段码地址指针
MOV R1,#2 ;段码字节数
DP12: MOV R2,#8 ;输出子程序
MOV A,@R0 ;取段码
DP13: RLC A ;段码左移
MOV DIN,C ;输出一位段码
CLR CLK ;发送位移脉冲一位
SETB CLK
DJNZ R2,DP13
INC R0
DJNZ R1,DP12
SJMP $
SEGTAB: DB 3FH,06H,5BH,4FH,66H ;0,1,2,3,4
DB 6DH,7DH,07H,7FH,6FH ;5,6,7,8,9
DELAY: MOV R4,#03H ;延时子程序
AA1: MOV R5,#0FFH
AA: DJNZ R5,AA
DJNZ R4,AA1
RET
END
用C语言改写:下面是自己改写的,或者说是硬翻译
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define DBUF0 XBYTE [0x30]
#define TEMP XBYTE [0x40]
#define DIN XBYTE [0xb0]
#define CLK XBYTE [0xb1]
void delayms(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}
void main()
{
uint m;
uint n;
uint i;
uint j;
uint A;
uint sz[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
m = 0x01;
n = 0x05;
for (i = 0;i < 2;i++)
{
A = DBUF0;
A = sz[i];
TEMP = A;
}
DBUF0 = TEMP;
for (i = 0;i< 2;i++)
{
A = DBUF0;
for (j = 0;j < 8;j++)
{
}
}
while(1);
}
但是关于如何使用串行不会了,看书也没看太懂!
------解决方案--------------------------------------------------------
你用什么芯片,有xdata吗?XBYTE不是随便可用的。