这程序也写的太复杂了!既然51单片机有DIV指令,并且只是把A中的数字转变为BCD,那就用DIV直接运算:
MOV A,#0FDH
MOV B,#100
DIV AB
MOV 50H,A
MOV A,B
MOB B,#10
DIV AB
MOV 51H,A
MOV 52H,B
计算完成,这样50H就是百位数,51H是十位数,52H是个位数
直接看输入的bit2和bit3,如果不是00输出为0,否则输出为1。
1、module com(a,b);
input[3:0]a;
output b;
assign b=(a>=4'h4)1:0;
endmodule
module t_com;
reg[3:0]a;
wire b;
initial
begin
a=4'h1;
#5 a=4'h5;
#5 $stop;
end
com m(a,b);
endmodule
2、module compare(clk, rst_n, din, flag_out)
input clk, rst_n;
input [3:0] din;
output flag_out;
always @ (posedge clk or negedge rst_n)
if (!rst_n)
flag_out <= 0;
else if (din > 4'd4)
flag_out <= 1'b1;
else
flag_out <= 1'b0;
扩展资料:
使用Verilog描述硬件的基本设计单元是模块(module)。构建复杂的电子电路,主要是通过模块的相互连接调用来实现的。模块被包含在关键字module、endmodule之内。实际的电路元件。
Verilog中的模块类似C语言中的函数,它能够提供输入、输出端口,可以实例调用其他模块,也可以被其他模块实例调用。模块中可以包括组合逻辑部分、过程时序部分。例如,四选一的多路选择器,就可以用模块进行描述。
参考资料来源:百度百科-Verilog HDL
#include <stdioh>
// 8421BCD码长整数转换为长整数
unsigned long BCD2BIN_l(unsigned long num)
{
unsigned long out = 0;
unsigned char i = 0;
while(num && i++ < 8)
{
if(out) out =10;
if(num & 0xF0000000 == 0) continue;
out += (num >> 28) & 0xF;
num <<= 4;
}
while(i++ < 8) out = 10;
return out;
}
// 长整数转换为8421BCD码长整数
unsigned long BIN2BCD_l(unsigned long num)
{
unsigned long out = 0;
unsigned char i = 0;
while(num && i++ < 8)
{
out >>= 4;
out |= (num % 10) << 28;
num /= 10;
}
while(i++ < 8) out >>= 4;
return out;
}
// 8421BCD码短整数转换为短整数
unsigned short BCD2BIN_s(unsigned short num)
{
unsigned short out = 0;
unsigned char i = 0;
while(num && i++ < 4)
{
if(out) out =10;
if(num & 0xF000 == 0) continue;
out += (num >> 12) & 0xF;
num <<= 4;
}
while(i++ < 4) out = 10;
return out;
}
// 短整数转换为8421BCD码短整数
unsigned short BIN2BCD_s(unsigned long num)
{
unsigned short out = 0;
unsigned char i = 0;
while(num && i++ < 4)
{
out >>= 4;
out |= (num % 10) << 12;
num /= 10;
}
while(i++ < 4) out >>= 4;
return out;
}
// 整数转换为8421BCD码整数
unsigned char BIN2BCD_c(unsigned char num)
{
return ((num / 10) << 4) | (num % 10);
}
// 整数转换为8421BCD码整数
unsigned char BCD2BIN_c(unsigned char num)
{
return ((num & 0xF0) >> 4) 10 + (num & 0xF);
}
unsigned char rMul_BCD_c(unsigned char x, unsigned char y, unsigned char p)
{
// p为小数位数
unsigned short r = BCD2BIN_s(x) BCD2BIN_s(y);
while(p != 1) {r /= 10; p--;}
return BIN2BCD_c((unsigned char)((r + 5) / 10));
}
unsigned short rMul_BCD_s(unsigned short x, unsigned short y, unsigned char p)
{
// p为小数位数
unsigned long r = BCD2BIN_l(x) BCD2BIN_l(y);
while(p != 1) {r /= 10; p--;}
return BIN2BCD_s((unsigned short)((r + 5) / 10));
}
unsigned char rMul_BIN_c(unsigned char x, unsigned char y, unsigned char p)
{
// p为小数位数
unsigned short r = (unsigned short)x (unsigned short)y;
while(p != 1) {r /= 10; p--;}
return (unsigned char)((r + 5) / 10); // 四舍五入
}
unsigned short rMul_BIN_s(unsigned short x, unsigned short y, unsigned char p)
{
// p为小数位数
unsigned long r = (unsigned long)x (unsigned long)y;
while(p != 1) {r /= 10; p--;}
return (unsigned short)((r + 5) / 10); // 四舍五入
}
// 演示函数结果
void main()
{
// 整数计算演示
unsigned long x = 0x9678;
unsigned long y = 0x4865;
printf("整数计算演示\nunsigned long\nBIN: %u %u = %u\n", x, y, x y);
printf("BCD: %X %X = %X\n", x, y, BIN2BCD_l(BCD2BIN_l(x) BCD2BIN_l(y)));
unsigned short sx = 0x97;
unsigned short sy = 0x48;
printf("unsigned short\nBIN: %u %u = %u\n", sx, sy, sx sy);
printf("BCD: %X %X = %X\n", sx, sy, BIN2BCD_s(BCD2BIN_s(sx) BCD2BIN_s(sy)));
unsigned char cx = 0x6;
unsigned char cy = 0x12;
printf("unsigned char\nBIN: %u %u = %u\n", cx, cy, cx cy);
printf("BCD: %X %X = %X\n", cx, cy, BIN2BCD_c(BCD2BIN_c(cx) BCD2BIN_c(cy)));
// 1位定点小数演示
printf("1位定点小数演示\n2 Byte\nBIN: %g %g = %g\n", sx 01 , sy 01 , rMul_BIN_s(sx, sy, 1) 01);
printf("BCD: %g %g = %g\n", BCD2BIN_s(sx) 01, BCD2BIN_s(sy) 01, BCD2BIN_s(rMul_BCD_s(sx, sy, 1)) 01);
printf("1 Byte\nBCD: %g %g = %g\n", cx 01 , cy 01 , rMul_BIN_c(cx, cy, 1) 01);
printf("BCD: %g %g = %g\n", BCD2BIN_c(cx) 01, BCD2BIN_c(cy) 01, BCD2BIN_c(rMul_BCD_c(cx, cy, 1)) 01);
// 2位定点小数演示
printf("2位定点小数演示\n2 Bytet\nBIN: %g %g = %g\n", sx 001 , sy 001 , rMul_BIN_s(sx, sy, 2) 001);
printf("BCD: %g %g = %g\n", BCD2BIN_s(sx) 001, BCD2BIN_s(sy) 001, BCD2BIN_s(rMul_BCD_s(sx, sy, 2)) 001);
printf("1 Byte\nBCD: %g %g = %g\n", cx 001 , cy 001 , rMul_BIN_c(cx, cy, 2) 001);
printf("BCD: %g %g = %g\n", BCD2BIN_c(cx) 001, BCD2BIN_c(cy) 001, BCD2BIN_c(rMul_BCD_c(cx, cy, 2)) 001);
}
void HextoBCD(u8 pBuff,u8 len) //十六进制转为BCD码
{
u8 i,temp;
for(i=0;i<len;i++)
{
temp=pBuff[i]/10;
time[i]=pBuff[i]%10+temp16;
}
}
bcd码就是用二进制数来表示常用的十进制数。就是用四个位的二进制来表示一个二进制数。一个字节一共有八个位,它就可以表示两个bcd码。比如,0FH等于二进制物15,用一个字节低四位来表示5,高四位来表示1合起来就是15H,不用转换两次的。
扩展资料例如:
63÷10=6……3
即商是6,余数是
如果将商乘以16再加上余数,就是:6×16+3=99,其16进制数就是63H,即是十进制数63(16进制为3FH)的BCD码为63H。
如果在单片机中,程序这么写:char HEX,BCD;BCD=(HEX/1016)+(HEX%10);
其中HEX存储十六进制数,BCD中存储的就是其BCD码。
参考资料来源:百度百科-BCD码
这程序也写的太复杂了!既然51单片机有div指令,并且只是把a中的数字转变为bcd,那就用div直接运算:
mov
a,#0fdh
mov
b,#100
div
ab
mov
50h,a
mov
a,b
mob
b,#10
div
ab
mov
51h,a
mov
52h,b
计算完成,这样50h就是百位数,51h是十位数,52h是个位数
一个ASCII码最多需要四个BCD码存储,也就是两个字节。比如‘A',ASCII码值是65,用BCD表示是0000,0000,0110,0101,’1‘的ASCII码值是49,用BCD表示是0000,0000,0100,1001。现在的问题是这些BCD码是如何提供的?这里假定,用整数值表示BCD码,如'e'的ASCII码值(101)10,用整数表示的BCD是0000,0001,0000,0001,也就是257。
#include <stdioh>const int MAXLEN = 128;
int main() {
char asciis[MAXLEN];
short bcds[] = {101,277,104,130,72,73,66};// AsDR12
int i,j,t,p,m,k = 0,n = sizeof(bcds)/sizeof(bcds[0]);
for(i = 0; i < n; ++i) {
t = bcds[i];
m = 0;
for(j = 0; j < 4; ++j) {
p = (t & 0XF000) >> 12;
m = 10 m + p;
t <<= 4;
}
asciis[k++] = m;
}
asciis[k] = '\0';
printf("%s\n",asciis);
return 0;
}
以上就是关于关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中全部的内容,包括:关于单片机编写程序 将A中的二进制数变换成3为BCD码 并将百,十,个位数分别防御内部RAM的50H 51H 52H中、有一个比较电路,当输入的一位8421BCD码大于4时,输出为1,否则为0.试编写出Verilog HDL程序.、求助c语言小程序!求z=x*y;x,y分别为二进制数和BCD码时怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)