通过将Now_degree与各位对应的编码二进制一一比较,使用状态机得出具体实现各数据位上的数值:Decimal1Decimal1、Single、Ten、Hundred。具体Verilog HDL代码如下所示:
always@(posedge Clk_50M)
begin
4′b0000:
begin
if(Buf_degree>=Hundred_degree)
begin
Buf_degree=Buf_degree-Hundred_degree;
Temp_Hundred=Temp_Hundred+1;
Sta=4′b0000;
end
else
begin
Sta=4′b0010;
end
end
4′b0001:
begin
if(Buf_degree>=Ten_degree)
begin
Buf_degree=Buf_degree-Ten_degree;
Temp_Ten=Temp_Ten+1;
Sta=4′b0001;
end
else
begin
Sta=4′b0010;
end
end
4′b1100:
begin
if(Buf_degree>=Decimal10_degree)
begin
Buf_degree=Buf_degree-Decimal10_degree;
Temp_Decimal10=Temp_Decimal10+1;
Sta=4′b1101;
end
else
begin
Sta=4′b1101;
end
end
4′b1101:begin
Hundred=Temp_Hundred;
Ten=Temp_Ten;
Single=Temp_Single;
Decimal1=Temp_Decimal1;
Decimal2=Temp_Decimal2;
Decimal3=Temp_Decimal3;
Decimal4=Temp_Decimal4;
Decimal5=Temp_Decimal5;
Decimal6=Temp_Decimal6;
Decimal7=Temp_Decimal7;
Decimal8=Temp_Decimal8;
Decimal9=Temp_Decimal9;
Decimal10=Temp_Decimal10;
Sta=4′b0000;
end
default:begin
Sta=4′b0000;
end
endcase
end
该程序最终实现了将绝对值编码器输出的普通二进制数转化为角度值。例如,一个普通二进制数0100100110010先通过式(3)运算,转化为Now_degree,然后再通过上述代码就可以被转化为103447265625(依次为从百位上的值到小数点后第10位上的值)。这样就得到了角度值103.447 265 625°。 4 液晶显示屏驱动
LCD1602是一个16行2列的液晶显示屏,因为所需要的数据位(算上小数点)总共14位,所以完全满足角度值输出要求。LCD1602内置192种字符,显示字符时,要先输入显示字符地址,即告诉模块在哪里显示字符[4]。由于只需要显示角度,因此只需要知道数字0~9和小数点(.)的地址就可以了,如表2所示。从表2中可以看出,数字地址的前4位都是0011,而后4位正好是数字的二进制表示,这给编写驱动液晶屏的编码带来了很大方便,可以直接采用类似下面的语句输出:
Lcd_data<={4′b0011,Hundred};
这样就将从百位上的值Hundred到小数点后10位上的值Decimal10依次输到液晶显示屏上了。其中的Lcd_data是接LCD1602的8 bit数据位。上面并不是程序中的真正代码,因为液晶显示屏驱动需要初始化,且需要严格时序控制,程序较长,这里就不给出具体代码了。