电子秤VHDL代码
基于51单片机的电子秤程序
基于51单片机的电子秤程序
#include
#include
//#include "LCD1602.h"
//#include "HX711.h"
#define uint unsigned int
#define uchar unsigned char
sbit LCD1602_RS = P2^5;
sbit LCD1602_RW = P2^6;
sbit LCD1602_EN = P2^7;
sbit HX711_DOUT=P2^0;
sbit HX711_SCK=P2^1;
unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0,Weight_Shiwu = 0;
char Price_Count = 0;
uchar KEY_NUM = 0;
uchar Price_Buffer[3] = {0x00,0x00,0x00};
unsigned long Money = 0;
bit Flag_OK = 0;
uchar com;
//延时函数
//**************************************************** void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)< p="">
for(j=0;j<123;j++);
电子秤应用C语言源程序
char code message2[]="输入日期 :"; char code message3[16]=" --山东大学 -- "; char code message5[16]="垃圾公司欢迎您 !!"; char xdata bianhao[16]="收银员: "; char xdata riqi[16]=" - - "; long int xdata zongjia=0,jine=0,jine1=0; int xdata shizhong=0,pizhong=0,zhongliang=0; long int xdata qingdan[20][4]; char code shangPIN[11][4]={{"单价 "},{"苹果 "},{"梨 "},{"花生 "},{"大米 "}, {"桃子 "},{"塑料 "},{"瓜子 "},{"桔子 "},{"香蕉 "},{"玉米 "}}; long int xdata danjia[11]= {0,2000,3635,5502,6660,3320,5502,660,3210,6600,5600}; char xdata jiage[6]={0x0,0x0,0x0,0xfe,0x0,0x0}; // 0.00 short xdata xiuzheng[]={0,2,5,6,7,8,9,12,13}; char s[16]; {s[6]=shuju[0]; s[7]=shuju[1]; s[8]=shuju[2]; s[9]=shuju[3]; s[10]=shuju[4]; s[11]=shuju[5]; s[12]=shuju[6]; } //**************************************************************** void main() {short i,j; long int x,z; int y; int xdata duilie[3]={0}; P1=0xff; ini_lcd(); //初始化 LCD lcdi_send(0x8a); while(message0[i]) lcdd_send(message0[i++]); ini_7289(); //初始化 7289 pizhong=ad1(); lcdi_send(0x1); //总清屏 ini(); //初始页面 ,收银员编号,日期 lcdi_send(0x1); //总清屏 EA=1;EX0=1; //中断 //EX1=1; //ad_start=1; while(1) {if(list){lcdi_send(0x80); //显示单位名称 for(i=0;i<16;i++) lcdd_send(message3[i]); x=qingdan[0][0]; //商品名单价 for(i=0;i<4;i++) s1[i]=shangpin[x][i]; x=qingdan[0][1]; d_change(x); change(s1); lcdi_send(0x90); for(i=0;i<16;i++) lcdd_send(s1[i]); x=qingdan[0][2]; //显示重量
电子秤stm32程序
#include "led.h"
#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "lcd.h"
#include "usart.h"
#include "lcdfot.h"
#include "hx711.h"
#include "key.h"
int main(void)
{
u8 num,flag;
float vol1;
delay_init();
uart_init(9600);
LED_Init();
LCD_Init();
Adc_Init();
KEY_Init();
HX711_Init();
POINT_COLOR=RED;
HZ_show();
LCD_ShowString(54+25,55,200,24,16,":000.00g");//提示信息显示
LCD_ShowString(54+25,85,200,24,16,":00.00$");//提示信息显示
LCD_ShowString(54+25,115,200,24,16,":000.00$");//提示信息显示
LCD_ShowString(54+25,145,200,24,16,":000.00g");//提示信息显示
while(1)
{
vol1=HX711_count();
if(KEY_Scan(1)==WKUP_PRES) //单价设置num的值可直接用
{
num++;
if(num==100)
num=0;
LCD_ShowxNum(54+25+8,85,num,2,16,0);
电子秤51程序
#include#include#define uchar unsigned char #define uint unsigned intsbit OE=P2^7;sbit clk=P2^2;sbit EOC=P2^1;sbit START=P2^0;sbit sclk=P2^5;//使能 //串行同步时钟sbit sid=P2^4; //1读 0写 //串行数据口sbit cs=P2^3; //1数据 0命令 //串行片选 sbit led=P2^6; //超重报警指示灯uchar code dis1[]={" 毕业设计 "};uchar code aa[]={"."};uchar code dan[]={"元"};uchar code jia[]={"单价:"};uchar code mg1[]={"重量:"};uchar code zjia[]={"价格:"}; uchar code zji[]={"总计:"};uchar code kg[]={"kg"};uchar code a1[]={"毕业设计"};uchar code a2[]={"作品;"};uchar code a3[]={"作者;"};uchar code a4[]={"欢迎使用"}; uchar key;uchar a; uchar s;//固定单价标志uchar danjia;bit p=0;uchar k,shiwei,gewei,jiao,feng;uint Zmoney;money,mg,mg3; void delay(uint z) //ms{uint x,y;for(x=z;x>0;x--);for(y=110;y>0;y--);}void write_cmd(uchar dat) //写指令,分为三个字节{uchar i;uchar com;com=0xf8; //第一字节cs=1;sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1; }com=dat; //第二字节 ****0000com&=0xf0; //sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1; }com=dat; //第三字节 移位后****0000com<<=4;//sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1; }cs=0;delay(10);}void write_dat(uchar dat) //写数据,同指令 {uchar i;uchar com;com=0xfa;cs=1;//sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1;}com=dat;com&=0xf0;//sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1;}com=dat;com<<=4;//sclk=0;for(i=0;i<8;i++){sid=(bit)(com&0x80);sclk=0;sclk=1;com=com<<1;}cs=0;delay(10);}void lcd_init(){// lcd_psb=1;write_cmd(0x30);delay(10);write_cmd(0x0C);delay(10);write_cmd(0x01);delay(10);}void display(){ uchar i;write_cmd(0x82); //第一行 1for(i=0;i<8;i++){write_dat(a1[i]);delay(5);}write_cmd(0x90); //第2行 1for(i=0;i<12;i++){write_dat(a2[i]);delay(5);}write_cmd(0x88); //第3行 1for(i=0;i<16;i++){write_dat(a3[i]);delay(5);}write_cmd(0x9a); //第4行 1for(i=0;i<8;i++){write_dat(a4[i]);delay(5);}}void display6(){ uchar zshiwei,zgewei,zjiao,j;write_cmd(0x80); //第4行 for(j=0;j<6;j++){write_dat(zji[j]);delay(5);}zshiwei=Zmoney/10000;zgewei=Zmoney%10000/1000;zjiao=Zmoney%10000%1000/100;write_cmd(0x83);write_dat(0x30+zshiwei);write_dat(0x30+zgewei);
VHDL简易计算器代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cal1 IS
PORT (inclk: IN STD_LOGIC;
--num: IN STD_LOGIC_VECTOR(9 DOWNTO 0);
--plus: IN STD_LOGIC; --加法按键
--subt: IN STD_LOGIC; --减法按键
--mult: IN STD_LOGIC; --乘法按键
--mdiv: IN STD_LOGIC; --除法按键
--equal: IN STD_LOGIC; --等号键
--c: IN STD_LOGIC; --清零键
num1: out STD_LOGIC_VECTOR(3 DOWNTO 0);--col
num2: in STD_LOGIC_VECTOR(3 DOWNTO 0);--row fan
--onum1,onum2,onum3,onum4,onum5,onum6: OUT STD_LOGIC_VECTOR(0 TO 6);
CAT: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); --选通端,用6个数码管。最左侧数码管表示正负,从-99999到99999
DIGITAL:OUT STD_LOGIC_VECTOR(6 DOWNTO 0) --控制数码管显示不同的数字); --3个7段译码显示管
END cal1;
vhdl各种实验程序代码
1.三与门
library ieee;
use ieee.std_logic_1164.all;
entity yumen is
port(a,b,c : in std_logic;
f : out std_logic);
end yumen;
architecture and3_1 of yumen is
begin
f<=a and b and c;
end architecture and3_1;
2.三八译码器
library ieee;
use ieee.std_logic_1164.all;
entity jg is
port(a,b,c,g1,g2a,g2b:in std_logic;
y:out std_logic_vector(7 downto 0));
end entity jg;
architecture rt1 of jg is
signal indata:std_logic_vector(2 downto 0); begin
indata<=c&b&a;
process(indata,g1,g2a,g2b)is
begin
if(g1='1' and g2a='0' and g2b='0')then case indata is
when"000"=>y<="11111110"; when"001"=>y<="11111101"; when"010"=>y<="11111011"; when"011"=>y<="11110111"; when"100"=>y<="11101111"; when"101"=>y<="11011111"; when"110"=>y<="10111111"; when"111"=>y<="01111111";
VHDL实验代码示例
将8421BCD转换为余3码源代码:
Library ieee;
Use ieee.std_logic_1164.all;
Entity bcd is
Port(a:in std_logic_vector(3 downto 0);
y:out std_logic_vector(3 downto 0));
End;
Architecture rtl of bcd is
Begin
Process(a)
Begin
Case a is
When"0000"=>y<="0011";
When"0001"=>y<="0100";
When"0010"=>y<="0101";
When"0011"=>y<="0110";
When"0100"=>y<="0111";
When"0101"=>y<="1000";
When"0110"=>y<="1001";
When"0111"=>y<="1010";
When"1000"=>y<="1011";
When"1001"=>y<="1100";
When others=>y<="ZZZZ";
End case;
End process;
End;
仿真图形:
(仿真结果均有延时,大约20ns)
四输入表决器
源代码:
Library ieee;
Use ieee.std_logic_1164.all;
Entity bjq is
Port(i:in std_logic_vector(3 downto 0);
f:out std_logic);
End;
Architecture nm2 of bjq is
Begin
电子称代码
/********************头文件***********************/#include#include#include#include#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};#define AD_data P1 //AD数据口#define LCD_data P0 //液晶数据口/********************函数声明*********************/void display_weigh ();void Alarm();void AD_0809();void lcd_init();void clr_screen();void bytecode();void fitle();void funkey();unsigned char keyscan();/********************定义变量*********************/sbit LCD_RS = P3^0; //寄存器选择输入 sbit LCD_RW = P3^1; //液晶读/写控制sbit LCD_EN = P3^2; //液晶使能控制sbit led=P3^5; sbit bell=P3^4;sbit AD_EOC=P3^3; //A/D转换接口sbit ST=P3^6; //A/D转换启动sbit OE=P3^7; //A/D输出允许unsigned char ab[8]=0;//unsigned char abc[4]=0;unsigned char ptr[4]=0;unsigned char ptrl[4]=0;int i;int m,n;float ss; int j;int zhongliang;uint danjia;int YZ=5000; //初始阈值为5unsigned int getdata;float VOL;unsigned char rekey=0,ge=0,shi=0,xiaoshu=0;unsigned char setflag=0,fuwei;float x[5]={0.00,0.00,0.00,0.00,0.00};uchar code DIS1[]={"西安科技大学"};uchar code DIS2[]={"毕业设计课题"};uchar code DIS3[]={"多功能电子称"};uchar code DIS4[]={"康昊 张晨"};uchar aDIS1[]={"重量:"};uchar aDIS2[]={'k','g'};uchar bDIS1[]={"单价:"};uchar bDIS2[]={"元/Kg"};uchar cDIS1[]={"金额:"};/*************************************************函数名称: AD_0809函数功能: 数模转换*************************************************/void AD_0809(){ OE = 0; //输出禁止 _nop_();_nop_();ST = 0; //启动转换 _nop_();_nop_();ST = 1;_nop_(); //保证足够的上升沿 ST = 0;while(!AD_EOC); //等待输出 OE = 1; //输出允许 P1=0xFF;getdata=P1;_nop_();_nop_();_nop_();_nop_();VOL=4.44*getdata/256; //ADC0809实际基准电压为4.44 } /**************************************************延时函数 **************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<150;i++) {_nop_(); _nop_();_nop_();_nop_();}}} /**************************************************检查LCD忙状态lcd_busy为1时,忙,等待;lcd_busy为0时。闲,可写指令与数据。 **************************************************/bit lcd_busy(){ bit result;LCD_RS = 0;LCD_RW = 1;LC
51单片机电子秤程序设计
51单片机电子秤程序设计概述
本文档介绍了如何使用51单片机(AT89C51)设计一个简单的电子秤程序。通过该程序,电子秤能够测量物体的重量并实时显示在液晶显示屏上。
硬件准备
在开始编写程序之前,我们需要准备以下硬件设备:
- AT89C51单片机开发板
- 电子秤传感器模块
- 16x2液晶显示屏
- 连接线
程序设计
以下是该电子秤的主要程序设计步骤:
1. 引入必要的头文件
include <reg51.h>
include <lcd.h>
2. 定义端口和变量
sbit DOUT = P3^7; // 电子秤传感器数据接口float weight = 0; // 测量到的重量
3. 初始化液晶显示屏
void lcd_init()
{
// 在这里初始化液晶显示屏的相关设置
}
4. 启动AD转换
void start_conversion()
{
// 在这里启动AD转换,将传感器的模拟数据转换为数字数据}
5. 读取AD转换结果
float read_conversion()
{
// 在这里读取AD转换结果并返回
}
6. 主程序
void main()
{
lcd_init(); // 初始化液晶显示屏
while (1)
{
start_conversion(); // 启动AD转换
weight = read_conversion(); // 读取AD转换结果
// 将重量显示在液晶显示屏上
lcd_gotoxy(1, 1); // 设置光标位置
lcd_print("Weight: %.2f kg", weight); // 显示重量
用VHDL编写的各种功能的计数器代码
Library IEEE ;
use IEEE.std_logic_1164.all ;
use IEEE.std_logic_arith.all ;
ENTITY counters IS
PORT
(
d : IN INTEGER RANGE 0 TO 255;
clk : IN BIT;
clear : IN BIT;
ld : IN BIT;
enable : IN BIT;
up_down : IN BIT;
qa : OUT INTEGER RANGE 0 TO 255;
qb : OUT INTEGER RANGE 0 TO 255;
qc : OUT INTEGER RANGE 0 TO 255;
qd : OUT INTEGER RANGE 0 TO 255;
qe : OUT INTEGER RANGE 0 TO 255;
qf : OUT INTEGER RANGE 0 TO 255;
qg : OUT INTEGER RANGE 0 TO 255;
qh : OUT INTEGER RANGE 0 TO 255;
qi : OUT INTEGER RANGE 0 TO 255;
qj : OUT INTEGER RANGE 0 TO 255;
qk : OUT INTEGER RANGE 0 TO 255;
ql : OUT INTEGER RANGE 0 TO 255;
qm : OUT INTEGER RANGE 0 TO 255;
qn : OUT INTEGER RANGE 0 TO 255 );
END counters;
电子称课程设计(含流程图、代码)
湖南理工学院课程设计报告
课程名称:专业综合课程设计专业班级:
学生姓名:
指导教师:
完成时间:
报告成绩:
目录
摘要 (1)
第一章绪论 (3)
1.1引言: (3)
第二章系统方案的设计 (3)
2.1 电子秤的设计要求 (3)
2.1.1 基本要求 (3)
2.1.2 特色与创新 (4)
2.2 设计作用与目的: (4)
2.3 所用仪器与设备: (4)
2.4 设计原理及设计基本思路: (5)
2.4.1系统的原理: (5)
2.4.2 系统的基本设计思路: (5)
2.5 系统总体设计方案选择 (5)
2.6单片机的选型:............................... 错误!未定义书签。
2.7输入输出设备指派: (5)
2.7.1 键盘输入 (5)
2.7.2 输出显示 (6)
2.8系统电源 (6)
第三章系统硬件设计 (9)
3.1 基于AT89S52的主控电路 (9)
3.1.1芯片介绍 (9)
3.1.2 主控电路 (14)
3.2 基于ICL7135的前端信号处理电路 (14)
3.2.1 芯片介绍 (14)
3.2.2 信号处理电路 (19)
3.3 人机交互界面 (21)
3.3.1 键盘控制电路 (21)
3.3.2 液晶显示电路 (24)
3.4 系统电源 (26)
3.4.1 芯片介绍 (26)
3.4.2 电源电路 (27)
3.5 报警电路.................................... 错误!未定义书签。第四章软件流程 (28)
4.1 主程序流程图 (28)
4.2 主要中断程序流程图 (29)
电子秤stm32程序
电子秤stm32程序(总8页)
-CAL-FENGHAI.-(YICAI)-Company One 1 ■CAL■本页仅作为文档封面,使用请直接删除#include #include #include #include #include #include #include #include #include
int main(void)
u8 num, flag; float voll: delay_init (); uart_init (9600); LED_Init(); LCD_Init(); Adc_Init (); KEY_Init(); HX711_Init();
P0INT_C0L0R二RED;
HZ_show ();
LCD.ShowString (54+25, 55, 200, 24, 16, 〃:〃);便查看LCD 驱动IC. {
LCD_WriteReg(0x00, 0x0000);
LCD_WriteReg(0x01, 0x0100);
LCD_Wr辻eReg(0x02, 0x0700);
LCD_Wr辻eReg(0x03, 0x1030);
LCD_WriteReg(0x04, 0x0000);
LCD.WriteReg(0x0& 0x0202) ; 0x0207)
LCD_WriteReg(0x09, 0x0000); LCD_WriteReg(0x0a, 0x0000); LCD_WriteReg(0x0c, (l«0)); LCD_WriteReg(0x0d, 0x0000); 0x0000) 0x0000) 0x0000)
VHDL重要代码
1、设计一个具有进位输入和进位输出的8位行波进位加法器。其引脚名称如下表所示。
library ieee;
use ieee.std_logic_1164.all;
entity adder8 is
port
( a,b : in
std_logic_vector(7 downto 0);
Cin :in std_logic;
cout : out std_logic;
s :out
std_logic_vector(7 downto 0));
end entity;
architecture rtl of adder8 is
signal temp:std_logic_vector(7 downto 0);
begin
s(0)<=a(0) xor b(0) xor cin;
temp(0)<=((a(0) and b(0) ) or (a(0) and cin) or (b(0) and cin)) ;
s(1) <=a(1) xor b(1) xor temp(0); temp(1) <=((a(1) and b(1) ) or (a(1) and temp(0)) or (b(1) and temp(0)));
s(2) <=a(2) xor b(2) xor temp(1); temp(2) <=((a(2) and b(2) ) or (a(2) and temp(1)) or (b(2) and temp(1))) ;
s(3) <=a(3) xor b(3) xor temp(2); temp(3)<=((a(3) and b(3) ) or (a(3) and temp(2)) or (b(3) and temp(2)) );
VHDL代码
VHDL代码
[例1.4.26] 2输入与门的VHDL描述LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY and2 IS
PORT(a, b : IN STD_LOGIC;
y: OUT STD_LOGIC);
END and2; ARCHITECTURE one OF and2 IS BEGIN
y<= a and b;
END one;
[例2.5.1] 2输入与非门的VHDL描述LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand2 IS
PORT(a, b : IN STD_LOGIC;
y: OUT STD_LOGIC);
END nand2; ARCHITECTURE one OF nand2 IS BEGIN
y<= a nand b;
END one;
[例2.5.2] 2输入或门的VHDL描述LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2 IS
PORT(a, b : IN STD_LOGIC;
y: OUT STD_LOGIC);
END or2;
ARCHITECTURE one OF or2 IS BEGIN
y<= a or b;
END one;
[例2.5.3]非门的VHDL描述LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY hnot IS
PORT(a : IN STD_LOGIC;
存鑫电子秤代码
存鑫电子秤代码
一、按代码+24681357++05+
出现CAL代表按校准开关,用铁线按一下校准开关。
二、按再按按1再按1
出现CAPACTIVE(重量工程)
三、按0(2次)出现CAPACTIVE
四、按1
出现SET PRELOAD(空秤)
五、按1
出现SET PULLCAP 30KG(新称输入重量)
六、按0
选至5KG
七、放上法码+按1
出现UNLOAD
八、拿下砝码+按1(确认)
九、按1(保留数据)
电子秤检测
1.测试键盘:代码2468135701↓
2.删除PLU数据(强制):代码24681357171
3.清除EEPROM:代码24681357141
3600 RL00 V4.0 简易标定步骤
一、按代码+24681357+*+05+*出现CAL代表按校准开关,用铁线按一下校准开关。
二、按再按按1再按1出现CAPACTIVE(重量工程)
三、按0(2次)出现CAPACTIVE
四、按1出现SET PRELOAD(空秤)
五、按1出现SET PULLCAP 30KG
六、按0选至5KG
七、放上法码+按1出现UNLOAD
八、拿下砝码+按1(确认)
九、按1(保留数据)
3600 RL00 V5.0 标定详细步骤
电子称程序
#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
int weight;
double money;
uint temp;
uchar button;
sbit lcdrs=P2^4;
sbit lcdwr=P2^5;
sbit lcden=P2^6;
sbit hx711_dout=P2^0;
sbit hx711_sck=P2^1;
sbit spk=P2^2;
///////////////////////////////////////////////////////////////////// ///////////////
///////////////////hx711程序//////////////////////////////////////////////////
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
ulong ReadCount(void) //增益128
{
ulong count;
uchar i;
hx711_dout=1;
Delay__hx711_us();
hx711_sck=0;
count=0;
while(hx711_dout);
for(i=0;i<24;i++)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-- 输入电压范围0-5V,显示0-255数位
--------------------库定义、包定义--------------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------实体定义--------------------
ENTITY balance IS
port (
clk : IN STD_LOGIC; -- 全局时钟输入,12Mhz晶振产生
reset : IN STD_LOGIC; -- 复位输入
intr : IN STD_LOGIC; -- AD转换结束产生的中断输入
data_i : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- ADC转换后的数据输入
data_o : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 数码管数据输出
l : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- 输出数码管位选
cs : OUT STD_LOGIC; -- ADC使能
wr : OUT STD_LOGIC; -- ADC写控制
rd : OUT STD_LOGIC -- ADC读控制
);
END balance;
--------------------结构体--------------------
ARCHITECTURE bhv OF balance IS
TYPE state IS (start, convert, read1, read2);-- 状态机定义
SIGNAL current_state, next_state : state; -- 状态定义
SIGNAL read_data : STD_LOGIC; -- 读数据寄存器
SIGNAL clock : STD_LOGIC; -- 扫描时钟
SIGNAL p : INTEGER RANGE 0 TO 255; -- 数据寄存器
SIGNAL b0,b1,b2 : INTEGER RANGE 0 TO 9; -- 3位数码管显示数据寄存器
SIGNAL cnt : INTEGER RANGE 0 TO 3 := 0; -- 扫描寄存器
BEGIN
--------------------显示进程--------------------
PROCESS(p, clk)
BEGIN
CASE p IS
WHEN 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170|180|190|200|210|220|230|240|250 => b0 <= 0;
WHEN 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171|181|191|201|211|221|231|241|251 => b0 <= 1;
WHEN 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172|182|192|202|212|222|232|242|252 => b0 <= 2;
WHEN 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173|183|193|203|213|223|233|243|253 => b0 <= 3;
WHEN 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174|184|194|204|214|224|234|244|254 => b0 <= 4;
WHEN 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175|185|195|205|215|225|235|245|255 => b0 <= 5;
WHEN 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176|186|196|206|216|226|236|246 => b0 <= 6;
WHEN 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177|187|197|207|217|227|237|247 => b0 <= 7;
WHEN 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178|188|198|208|218|228|238|248 => b0 <= 8;
WHEN 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179|189|199|209|219|229|239|249 => b0 <= 9;
WHEN OTHERS => NULL;
END CASE;
CASE p IS
WHEN 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|200|201|202|203|204|205|206|207|208|209 => b1 <= 0; WHEN 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117|118|119|210|211|212|213|214|215|216|217|218|219 => b1 <= 1; WHEN 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127|128|129|220|221|222|223|224|225|226|227|228|229 => b1 <= 2; WHEN 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137|138|139|230|231|232|233|234|235|236|237|238|239 => b1 <= 3; WHEN 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147|148|149|240|241|242|243|244|245|246|247|248|249 => b1 <= 4; WHEN 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157|158|159|250|251|252|253|254|255 => b1 <= 5; WHEN 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167|168|169 => b1 <= 6; WHEN 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177|178|179 => b1 <= 7; WHEN 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187|188|189 => b1 <= 8; WHEN 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197|198|199 => b1 <= 9; WHEN OTHERS => NULL;
END CASE;
IF (p < 100) THEN b2 <= 0;
ELSIF (p >= 100 and p < 200) THEN b2 <= 1;
ELSIF (p >= 200) THEN b2 <= 2;
END IF;
END PROCESS;
--------------------分频进程--------------------
PROCESS(clk)
VARIABLE cnt1 : INTEGER RANGE 0 TO 100;
VARIABLE cnt2 : INTEGER RANGE 0 TO 20;
BEGIN
IF (clk'EVENT AND clk = '1') THEN
IF (cnt1 = 100) THEN
cnt1 := 0;
IF (cnt2 = 20) THEN
cnt2 := 0;
clock <= NOT clock;
IF (cnt = 3) THEN
cnt <= 0;
ELSE
cnt <= cnt + 1;
END IF;
ELSE
cnt2 := cnt2 + 1;
END IF;
ELSE
cnt1 := cnt1 + 1;
END IF;
END IF;