论坛风格切换切换到宽版
  • 3907阅读
  • 7回复

大家帮我看个程序好吗 [复制链接]

上一主题 下一主题
离线两袖清风
 
只看楼主 倒序阅读 0楼 发表于: 2006-12-25
kg equ p3.1 ;档位选择控制
k equ p3.2 ;门控开关控制
res equ p3.3;4040复位
e equ p3.5 ;lcd rs
rw equ p3.6;lcd rw
rs equ p3.7;lcd e
     org 0000h
     mov sp,#60h
     setb res ;4040清零
     ;显示屏初始化
     setb e
     mov p1,#00000001b ;清屏
     acall enable
     mov p1,#00001100b ;显示器开、光标开、闪烁开
     acall enable
     mov r0,#0efh
tt:      nop
     djnz r0,tt ;延时                  
     mov tmod,#00000101b
      ;清计数器及计数ram
start:      mov p0,#0ffh
     mov p2,#0ffh
     mov tl0,#00h
     mov th0,#00h
     jb kg,ghz ;读档位控制开关,为1转为另一档

     clr res   ;使4040可计数
     setb tr0 ;启动计数器0
     setb k ;开计数开关并延时1s,mcu时钟频率为12.8m
mov r1,#08h
time01:
mov r2,#0ffh
time02:
mov r3,#0ffh
time03:
djnz r3,time03
djnz r2,time02
djnz r1,time01

mov r1,#01h
time11:
mov r2,#027h
time12:
mov r3,#0ffh
time13:
djnz r3,time13
djnz r2,time12
djnz r1,time11

mov r1,#01h
time21:
mov r2,#01h
time22:
mov r3,#33h
time23:
djnz r3,time23
djnz r2,time22
djnz r1,time21

;nop ;时间精确调整
clr k   ;关计数开关

nop
nop
nop
clr tr0 ;关计数器0
;读入计数值
mov 20h,p0
mov 21h,p2
mov 22h,tl0
mov 23h,th0
mov a,22h
swap a
mov 22h,a
anl 21h,#0fh
anl a,#0f0h
orl 21h,a
mov a,23h
swap a
mov 23h,a
anl 22h,#0fh
anl a,#0f0h
orl 22h,a
anl 23h,#0fh
setb res
ajmp count

ghz:
     clr res   ;使4040可计数
     setb tr0 ;启动计数器0
     setb k ;开计数开关并延时4s,mcu时钟频率为12.8m
mov r1,#020h
time01g:
mov r2,#0ffh
time02g:
mov r3,#0ffh
time03g:
djnz r3,time03g
djnz r2,time02g
djnz r1,time01g

mov r1,#01h
time11g:
mov r2,#09ch
time12g:
mov r3,#0ffh
time13g:
djnz r3,time13g
djnz r2,time12g
djnz r1,time11g

mov r1,#01h
time21g:
mov r2,#01h
time22g:
mov r3,#0dfh
time23g:
djnz r3,time23g
djnz r2,time22g
djnz r1,time21g

nop ;时间精确调整
clr k   ;关计数开关

nop
nop
nop
clr tr0 ;关计数器0
;读入计数值
mov 20h,p0
mov 21h,p2
mov 22h,tl0
mov 23h,th0
;将计数值乘16
mov a,21h
swap a
mov 21h,a
anl a,#0f0h
mov a,20h
swap a
mov 20h,a
anl 20h,#0f0h
anl a,#0fh
orl 21h,a
setb res


    ;多(四)字节二转十,入口r0为二进制低位字节地址指针,r7为字节数,出口r1为bcd码结果低位字节地址指针
count:   mov     r0,#20h
      mov     r1,#30h
      mov     r7,#04h
bmbcd:   mov     a,r0
      mov     r5,a
      mov     a,r1
      mov     r6,a
      mov     a,r7
      mov     r3,a
      inc     r3
      clr     a
clbcd:   mov     @r1,a
      inc     r1
      djnz     r3,clbcd
      mov     a,r7
      mov     b,#08h
      mul     ab
      mov     r3,a
lp0:   mov     a,r5
      mov     r0,a
      mov     a,r7
      mov     r2,a
      clr     c
lp1:   mov     a,@r0
      rlc a
      mov     @r0,a
      inc     r0
      djnz     r2,lp1
      mov     a,r6
      mov     r1,a
      mov     a,r7
      mov     r2,a
      inc     r2
lp2:   mov     a,@r1
      addc     a,@r1
      da     a
      mov     @r1,a
      inc     r1
      djnz     r2,lp2
      djnz     r3,lp0

mov r0,#30h
mov r1,#24h
abc:mov a,@r0
anl a,#00001111b
orl a,#30h
mov @r1,a
mov a,@r0
anl a,#11110000b
rl a
rl a
rl a
rl a
orl a,#30h
inc r1
mov @r1,a
inc r0
inc r1
cjne r0,#036h,abc
;从高往底判断,不是0就开始显示
mov 02eh,#20h
mov r1,#02dh
cjne @r1,#030h,mhz;2d
mov @r1,#020h
dec r1
cjne @r1,#030h,mhz;2c
mov @r1,#020h
dec r1
cjne @r1,#030h,mhz;2b
mov @r1,#020h
dec r1
cjne @r1,#030h,mhz;2a
mov @r1,#020h
dec r1
cjne @r1,#030h,khz;29
mov @r1,#020h
dec r1
cjne @r1,#030h,khz;28
mov @r1,#020h
dec r1
cjne @r1,#030h,khz;27
mov @r1,#020h
dec r1
cjne @r1,#030h,hz;26
mov @r1,#020h
dec r1
cjne @r1,#030h,hz;25
mov @r1,#020h
dec r1
cjne @r1,#030h,hz;24
ajmp no_ok

mhz:
mov r0,#23h
mov @r0,#4dh;23
dec r0
mov @r0,#48h;22
dec r0
mov @r0,#7ah;21
dec r0
mov @r0,#20h;20
mov a,02ch
mov 02dh,a
mov a,02bh
mov 02ch,a
mov a,02ah
mov 02bh,a
mov 02ah,#2eh
ajmp hz00
khz:
mov r0,#23h
mov @r0,#4bh;23
dec r0
mov @r0,#48h;22
dec r0
mov @r0,#7ah;21
dec r0
mov @r0,#20h;20
mov a,029h
mov 02ah,a
mov a,028h
mov 029h,a
mov a,027h
mov 028h,a
mov 027h,#2eh
ajmp hz00
hz:
mov r0,#23h
mov @r0,#48h;23
dec r0
mov @r0,#7ah;22
dec r0
mov @r0,#20h;21
dec r0
mov @r0,#20h;20
hz00:mov 10h,#053h;
mov 011h,#49h;
mov 012h,#47h
mov 013h,#4eh
mov 014h,#41h
mov 015h,#4ch
mov 016h,#20h
mov 017h,#46h
mov 018h,#52h
mov 019h,#45h
mov 01ah,#51h
mov 01bh,#55h
mov 01ch,#45h
mov 01dh,#4eh
mov 01eh,#43h
mov 01fh,#59h
ajmp ok
no_ok:;没有信号时显示的数据
mov 010h,#4eh
mov 011h,#4fh
mov 012h,#20h
mov 013h,#49h
mov 014h,#4eh
mov 015h,#50h
mov 016h,#55h
mov 017h,#54h
mov 018h,#20h
mov 019h,#53h
mov 01ah,#49h
mov 01bh,#47h
mov 01ch,#4eh
mov 01dh,#41h
mov 01eh,#4ch
mov 01fh,#21h
mov r0,#20h
bbb: mov @r0,#020h
inc r0
cjne r0,#030h,bbb
ok:
acall display
ajmp start

display:
mov r0,#010h
;显示第一行
mov p1,#00111000b ;8位2行5x7点阵
acall enable
mov p1,#00000110b ;文字不动,光标自动右移
acall enable
mov p1,#10000000b ;写入显示起始地址(第一行第一个位置)
acall enable
display1 :mov p1,@r0 ;第一行第n个位置
acall write
inc r0
cjne r0,#020h,display1

;显示第二行
mov p1,#00000100b ;文字不动,光标自动左移
acall enable
mov p1,#00111100b ;8位2行5x10点阵
acall enable
mov p1,#0ceh ;写入显示起始地址(第二行第十五个位置)
acall enable
display2: mov p1,@r0 ;第二行第15个位置
acall write
inc r0
cjne r0,#02eh,display2
ret

enable: clr rs ;写入控制命令的子程序
clr rw
clr e
acall delay
setb e
ret

write: clr rs ;显示一个字符的子程序
setb rs ;rs=1
clr rw ;rw=0
clr e ;e=0
acall delay
setb e ;e=1
ret

delay: mov p1,#0ffh ;判断液晶显示器是否忙的子程序
clr rs
setb rw
clr e
nop
setb e
jb p1.7,delay ;如果p1.7为高电平表示忙就循环等待
ret
end
谁能翻译成下c程序啊,求求大家了 我看不懂汇编
离线BG7YDO
发帖
3654
只看该作者 1楼 发表于: 2006-12-25
为什么一定要用c呀?这不是挺好的马,主要你想做啥吗....
离线两袖清风
只看该作者 2楼 发表于: 2007-01-03
我不懂汇编,我要写成c程序才懂啊急啊,大伙帮我接着写一下好吗?我已经写了一点啊,后天要交了,#include <reg52.h>
#include <intrins.h>//包含可控制编译器生成在线嵌入内部代码的函数原型
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit kg = p3^0;
sbit k = p3^2;//门控信号
sbit res = p3^3;
sbit e = p3^5;
sbit rw = p3^6;
sbit rs = p3^7;
sbit lcdbusy = p1^7;//p1.7为高电平表示忙就循环等待

void enablelcd();
void delay();
void writelcd();
void delays();
uchar * bchangasii(long x);
void display(uchar *add);
void displaychar(uchar c,uchar x,uchar y);

void main()
{
uchar i,*display;
long fre,temp;
res = 1;
p1 = 0x01;//清屏
enablelcd();
p1 = 0x0c;//显示器开、光标开、闪烁开
enablelcd();
for(i = 0;i<0xef;i++)//0xef=239
{
_nop_();
}
tmod = 0x05;//定时/计数器0,方式1,计数
p0 = 0xff;//0xff=255
p2 = 0xff;
th0 = 0x00;
tl0 =0x00;//设置计数初值
while(1)
{
if(kg)
{//150mhz-1.1ghz处理
res = 0;//使4040可计数
tr0 =1;//启动计数器0
k = 1;//开门控信号
delays();//1s
k = 0;//关门控信号
_nop_ ();      //精确延时//三条nop指令nop
_nop_ ();
_nop_ ();
tro=0;
fre = 0x00000000;//8位16进制最高可计数到4,294,967,295
fre = th0;//单片机芯片16位计数器的高8位
fre = fre<<20;
temp = tl0;
temp = temp<<12;
fre = fre + temp;//读单片机芯片16位计数器
temp = p2 && 0x0f;
temp =temp << 8;
fre = fre + temp;
fre = fre + p0;
fre = fre * 64;//怎么是64?前置64分频是对10进制数来说的,写成16进制应该是40啊
}
else
{
//<150mhz处理
res = 0;
tr0 =1;
k = 1;
delays();
k = 0;
_nop_ ();      //精确延时//三条nop指令nop
_nop_ ();
_nop_ ();
tro=0;
fre = 0x00000000;
fre = th0;
fre = fre<<20;
temp = tl0;
temp = temp<<12;
fre = fre + temp;
temp = p2 && 0x0f;
temp =temp << 8;
fre = fre + temp;
fre = fre + p0;
}
display = bchangasii(fre);//fre为测得的频率;
}

void enablelcd()
{
rs = 0;
rw = 0;
e = 0;
delay();
e = 1;
}
void delay()
{
while(~lcdbusy)
{
p1 = 0xff;
rs = 0;
rw =0;
e = 0;
_nop_();
e =1;
}
}
void writelcd()
{
rs = 1;
rw = 0;
e = 0;
delay();
e = 1;

}
void delays() //1秒延时,需实际调整
{
uchar i,j;
for(i = 0;i<0xff;i++)//ff相当于10进制255
{
for(j = 0 ;j<0xff;j++)
  {
  _nop_();//晶振速度太高所以加个小的延时
  }
}
}
uchar *bchangasii(long x)
{
uchar *bcd;//定义指针变量bcd
long y;
y = x;
bcd =0x20;//0x20是地址?
*bcd = y/1000000000+0x30;
y = y%1000000000;
bcd++;//++干什么?
*bcd = y/100000000+0x30;
y = y%100000000;
bcd++;
*bcd = y/10000000+0x30;
y = y%10000000;
bcd++;
*bcd = y/10000000+0x30;
y = y%10000000;
bcd++;
*bcd = y/100000+0x30;
y = y%100000;
bcd++;
*bcd = y/10000+0x30;
y = y%10000;
bcd++;
*bcd = y/1000+0x30;
y = y%1000;
bcd++;
*bcd = y/100+0x30;
y = y%100;
bcd++;
*bcd = y/10+0x30;
bcd++;
*bcd = y%10+0x30;
return(bcd);//返回指针bcd干什么?
}
void display(uchar *add)
{
uchar *addr;
uchar le;
addr = add-10;
while(1)
{
if(*addr ==0x30)//0x30为值
{
addr++;
}
else
{ }
}
大伙快来救命啊
离线bd7rf
发帖
10148
只看该作者 3楼 发表于: 2007-01-04
频率计吗?
离线两袖清风
只看该作者 4楼 发表于: 2007-01-04
是频率计啊,大家帮我写成c下好吗?求各位大侠了,快点好吗?急死我了
离线bd7rf
发帖
10148
只看该作者 5楼 发表于: 2007-01-04
不熟,帮不了你.
离线BG4XCR
发帖
33381
只看该作者 6楼 发表于: 2007-01-04
[quote=两袖清风]是频率计啊,大家帮我写成c下好吗?求各位大侠了,快点好吗?急死我了[/quote]
不知道为何要改成c语言??
最简单就是c语言嵌入汇编
gcc环境下:

asm volatile (      
          你的汇编代码
            ::);
离线Sullivan
发帖
4817
只看该作者 7楼 发表于: 2007-01-04
汇编语言是一个程序员的最基本的知识基础,呵呵
慢慢玩吧...