|
【分享】单c,自己用汇编写出来了,呵呵,进步。
[复制链接]
这是c:
#include //包括一个标准的51头函数
#define uchar unsigned char //预定义
#define uint unsigned int //预定义
#define ulong unsigned long //预定义
sbit SDA_164=P0^0; //74HC164端口定义
sbit SCLK_164=P0^1;
sbit DIG1=P1^0; //数码管位选端口
sbit DIG2=P1^1; //数码管位选端口
sbit DIG3=P1^2; //数码管位选端口
sbit DIG4=P1^3; //数码管位选端口
sbit DIG5=P1^4; //数码管位选端口
sbit DIG6=P1^5; //数码管位选端口
sbit DIG7=P1^6; //数码管位选端口
sbit DIG8=P1^7; //数码管位选端口
uchar code LedNumber[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x00,0x04,0x5c,0x77,0x39,0x79,0x71};
void delay(int i,int j) //延时函数
{
int m;
for(;i>0;i--)
{
m=j;
for(;m>0;m--);
}
}
void wirteByte_74164 (uchar ch) //往74164中写一个字节
{
uchar i;
SCLK_164 = 0;
for (i=0;i<8;i++)
{
SDA_164 = ch&0x80;
SCLK_164 = 1;
ch = ch<<1;
delay(3,2);
SCLK_164 = 0;
}
}
void led_display (uchar ch) //一位数码管显示函数
{
wirteByte_74164 (LedNumber[ch]);
P1 = 0x00;
delay(300,200);
P1 = 0xff;
}
void main () //主函数
{
uchar ch;
while (1) //死循环
{
led_display (ch); //显示数字
ch++; //计数
if (ch>17)
{
ch=0;
}
}
}
这是汇编
;LED循环显示0~9:串口转并口74hc164
;此程序是依照zx-51学习板实验四的c语言改换为汇编,其硬件连接图参照zx-51board原理图
;其中74hc164是串口输入并口输出,P1.0选择八个LED中的一个,P0.0为串口输出,P0.1为CLK触发脉冲。
START: MOV DPTR,#TABLE
CLR P1.0
MOV R0,#0
LOOP: MOV R3,#8
MOV A,R0
MOVC A,@A+DPTR
CLR P0.1
INC R0
KV: MOV P1,#00H
CLR C
MOV C,ACC.7
MOV P0.0,C
CPL P0.1
RL A
ACALL DELAY
CPL P0.1
DJNZ R3,KV
ACALL DELAY1
MOV P1,#0FFH
CJNE R0,#10,LOOP
JMP START
DELAY: MOV R5,#2
D1: MOV R6,#2
D2: MOV R7,#1
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1: MOV R5,#50
D3: MOV R6,#100
D4: MOV R7,#100
DJNZ R7,$
DJNZ R6,D4
DJNZ R5,D3
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,80H,00H,04H,5CH
END
两者功能差不多,都可以在keilc下编译通过。
汇编还不大会,可能某些地方实现的比较麻烦,各位大虾发现了多指点一下!!!
|
|