是的,但你疑问的问题也是存在的。
针对不同的单片机,有不同的编译器,每种单片机的c语言编译器都对c语言做了适用于单片机的扩展。
编译器在编译单片机c语言的代码时要有一些设置选项或者makefile之类的设置,这些设置对了,程序才能适应选定的单片机。
有很多编译器为了让单片机程序更适合用c语言,还将一些固定的程序(比如中断入口、主程序入口、时钟设置等)用汇编写好后,嵌入到c语言程序的工程中,使C语言更适合单片机编程。
做了这么多工作后,用这种编译器编译的程序就可以下载到单片机中执行了。
当然会了,只是有一些具体的值编译器帮你完成了,指针就是地址。
修改如下:
MOV R3, #04H //被除数R3R4R5 = 287654
MOV R4, #63H
MOV R5, #0A6H
……
DIVISION100: //计算百位//
MOV R6, #0
MOV R0, #01H //除数R0R1R=100000
MOV R1, #86H
MOV R2, #0A0H
……
--原程序中,缺少了不少井号#
嘿嘿
1 设计一个双字节无符号数加法子程序,首先要设计一个子程序入口:
即 (R2)(R3)=装双字节无符号数的被加数
(R4)(R5)=装双字节无符号数的加数
2 设计一个双字节无符号数加法子程序出口:
( 32H )( 31H )( 30H)=装和
3 利用加法指令 求双字节无符号数的和。
4 起一个子程序名:
ADD16: MOV A,R3 ;取低字节被加数
ADD A,R5 ;与低字节加数相加
MOV 30H,A ;低字节和送30H 单元
MOV A,R2 ;取高字节被加数
ADDC A,R4 ;与高字节加数相加
MOV 31H,A ;高字节和送31H单元
CLR A ;清零
ADDC A,#0 ;加上进位
MOV 32H,A ;有进位则送32H单元保存
RET ;子程序返回
满意 就给俺加分喽
你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。
#include <reg52h>
#define uchar unsigned char
#define unit unsigned int
#define OPdata P0 //十位数据口
#define OPdata1 P1//个位数据口
sbit se0=P3^6;//十位选择
sbit se1=P3^7;//个位选择
sbit Q=P2^6;
sbit W=P2^5;
sbit E=P2^4;
uchar cis; //按下键盘次数
uchar jia1; //加数1
uchar jia2; //加数2
uchar z; //中转数
uchar shi; //十位数
uchar ge; //个位数
uchar s; //译码结果
uchar j; //译码结果
uchar sum; //加法结果
uchar keytemp;
void judge(uchar m) //数码显像管译码
{
switch (m)
{
case 0: s=0x3F; break;
case 1: s=0x06; break;
case 2: s=0x5B; break;
case 3: s=0x4F; break;
case 4: s=0x66; break;
case 5: s=0x6D; break;
case 6: s=0x7D; break;
case 7: s=0x07; break;
case 8: s=0x7F; break;
case 9: s=0x6F; break;
}
}
void judge1(uchar h) //十位数码显像管译码
{
switch (h)
{
case 0: j=0x3F; break;
case 1: j=0x06; break;
}
}
void judgecis()
{
if (cis==1)
{
jia1=z;
ge=z;
shi=0;
}
else if (cis==2)
{
jia2=z;
ge=z;
shi=0;
cis=0;
}
}
void jiafa(uchar m,uchar n) //加法
{
sum=m+n;
if (sum>=10)
{
ge=sum-10;
shi=1;
}
else
{
ge=sum;
shi=0;
}
}
void main()
{
cis=0;
jia1=0;
jia2=0;
shi=0;
ge=0;
s=0;
j=0;
P2=0XFF;
se0=0;//开启十位
se1=0;//开启个位
OPdata=0x3f;//十位
OPdata1=0x3f;//个位
while (1)
{
Q=0;
keytemp=P2;
switch (keytemp)
{
case 0xbb: z=3; cis++;while(P2==0xbb); break;
case 0xbd: z=6; cis++;while(P2==0xbd); break;
case 0xbe: z=9; cis++;while(P2==0xbe); break;
case 0xb7: //等于号
jiafa (jia1,jia2); cis=0; break;
}
Q=1;
W=0;
keytemp=P2;
switch (keytemp)
{
case 0xde: z=8; cis++;while(P2==0xde); break;
case 0xdd: z=5; cis++;while(P2==0xdd); break;
case 0xdb: z=2; cis++;while(P2==0xdb); break;
case 0xd7: z=0; cis++;while(P2==0xd7); break;
}
W=1;
E=0;
keytemp=P2;
switch (keytemp)
{
case 0xee: z=7; cis++;while(P2==0xee); break;
case 0xed: z=4; cis++;while(P2==0xed); break;
case 0xeb: z=1; cis++;while(P2==0xeb); break;
}
judgecis();
judge(ge);
OPdata1=s;
judge1(shi);
OPdata=j;
E=1;
}
}
以上就是关于单片机问题:编程实现对 (20H)(21H)(22H) 中三字节数据的求补运算。不要用c语言全部的内容,包括:单片机问题:编程实现对 (20H)(21H)(22H) 中三字节数据的求补运算。不要用c语言、单片机三字节除法程序,错在哪里、求单片机编写双字节无符号数加法子程序。来个高手吧!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)