数码管显示课程设计报告.docx

上传人:b****4 文档编号:24180333 上传时间:2023-05-25 格式:DOCX 页数:21 大小:237.57KB
下载 相关 举报
数码管显示课程设计报告.docx_第1页
第1页 / 共21页
数码管显示课程设计报告.docx_第2页
第2页 / 共21页
数码管显示课程设计报告.docx_第3页
第3页 / 共21页
数码管显示课程设计报告.docx_第4页
第4页 / 共21页
数码管显示课程设计报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数码管显示课程设计报告.docx

《数码管显示课程设计报告.docx》由会员分享,可在线阅读,更多相关《数码管显示课程设计报告.docx(21页珍藏版)》请在冰豆网上搜索。

数码管显示课程设计报告.docx

数码管显示课程设计报告

 

四.实验内容3

五.实验原理3

六.管脚分配4

七.实验步骤4

八.实验原理图:

5

九.实验程序代码:

6

(1)CH452_I2C.h代码6

(2)Define.h代码8

(4)Key.c代码10

(5)Seven_seg.c代码12

十.结果分析:

15

十一.个人体会与总结:

16

一.实验前的准备

打开实验箱开关,连接好JTAG下载线,将开发平台上的MODUL_SEL组合开关的1、2、7拨上,3、4、5、6、8拨下,使两个共阳极数码管显示为C2。

二.实验目的

(1)熟悉并学习运用I2C总线的读写方式。

(2)运用CH452芯片的数码管显示功能,熟悉两线制访问CH452芯片的工作原理。

三.实验设备

硬件:

PC机

GX-CIDE-SOC/SOPC综合创新开发实验平台

GX-CIDE-SOC/SOPC综合创新开发实验平台核心板

软件:

QuartusII8.0

NiosII8.0

四.实验内容

用七段数码管前三位显示000-999,计数周期为1s;按F1进行加1操作并用数码管显示。

按F2计数停止,并显示当前数。

按F3进行减1操作;当数从000-999时再加1变为000;当数从999-000时再减1变为999。

五.实验原理

根据I2C总线时序要求,对CH452进行操作,送地址,送控制字,送数据。

数码管显示是以BCD译码方式显示。

六.管脚分配

七.实验步骤

(1)打开QuartusII8.0,打开工程cide_c2,进行SOPC操作,裁剪所需要的内容,综合一下再分配管脚。

(2)启动NiosIIIDE并新建一个空白C/C++工程,命名为smm,在SOPCBuilderSystem中选择之前建立好的硬件系统cide_c2.ptf。

(3)转换工程路径,将提供的参考程序seven_seg.c,CH452_I2C.h,define.h加入到建立好的NiosII工程中,修改程序代码符合实验要求。

(4)在SystemLibrary设置页中,把程序和数据区都指定为sdram。

(5)在QuartusII中下载文件,编译整个工程,查找语法错误。

(6)全速运行程序,按下按键观察数码管的显示。

八.实验原理图:

九.实验程序代码:

(1)CH452_I2C.h代码

#include"system.h"

#include"altera_avalon_pio_regs.h"

#include"alt_types.h"

#include"priv/alt_busy_sleep.h"

#include

#include"sys/alt_irq.h"

#include"define.h"

voidCH452_I2c_Start_2(void)//操作起始,两线制方式,SDA用做中断输出,使用以下两个函数

{

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,1);

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,0);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

//usleep(3);

}

voidCH452_I2c_Stop_2(void)//操作结束

{

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,1);

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,0);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,1);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

}

voidack()//确认

{

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,0);

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,0);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

}

voidCH452_I2c_WrByte(unsignedchardat)//写一个字节数据

{

unsignedchartemp_number;

unsignedchari;

intdelay;

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,1);

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);

for(i=0;i<8;i++){

temp_number=dat>>7;

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

usleep(5);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,temp_number);

for(delay=0;delay<5;delay++);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);

dat=dat<<1;

}

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

}

unsignedcharCH452_I2c_RdByte(void)//读一个字节数据

{

unsignedchari=8;

unsignedcharDATA_received=0;

intdelay;

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,0);

IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);

while(i--){

DATA_received<<=1;

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

usleep(5);

for(delay=0;delay<5;delay++);

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);

DATA_received|=IORD_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE);

}

IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);

returnDATA_received;

}

voidCH452_Write(unsignedshortcmd)//写命令

{

CH452_I2c_Start_2();/*启动总线*/

#ifdefENABLE_2_CH452//若有两个CH452并连

CH452_I2c_WrByte((unsignedchar)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0);//CH452的ADDR=0时

#else

CH452_I2c_WrByte((unsignedchar)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1);//CH452的ADDR=1时(默认)

#endif

ack();

CH452_I2c_WrByte((unsignedchar)cmd);/*发送数据*/

ack();

CH452_I2c_Stop_2();/*结束总线*/

}

unsignedcharCH452_Read(void)//读取按键

{

unsignedcharkeycode;

CH452_I2c_Start_2();/*启动总线*/

CH452_I2c_WrByte((unsignedchar)(CH452_GET_KEY>>7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1);//若有两个CH452并连,当ADDR=0时,需修改为CH452_I2C_ADDR0

ack();

keycode=CH452_I2c_RdByte();/*读取数据*/

ack();

CH452_I2c_Stop_2();/*结束总线*/

return(keycode);

}

 

(2)Define.h代码

#ifndef_DEFINE_H_

#define_DEFINE_H_

#endif//_DEFINE_H_

#defineCH452_NOP0x0000//空操作

#defineCH452_RESET0x0201//复位

#defineCH452_LEVEL0x0100//加载光柱值

#defineCH452_CLR_BIT0x0180//段位清0

#defineCH452_SET_BIT0x01C0//段位置1

#defineCH452_SLEEP0x0202//进入睡眠状态

#defineCH452_LEFTMOV0x0300//设置移动方式-作移

#defineCH452_LEFTCYC0x0301//设置移动方式-左循

#defineCH452_RIGHTMOV0x0302//设置移动方式-右移

#defineCH452_RIGHTCYC0x0303//设置移动方式-右循

#defineCH452_SELF_BCD0x0380//自定义BCD码

#defineCH452_SYSOFF0x0400//关显示、键盘

#defineCH452_SYSON10x0401//开显示

#defineCH452_SYSON20x0403//开显示、键盘

#defineCH452_SYSON2W0x0423//开显示、键盘,真正2线接口

#defineCH452_DSP0x0500//设置默认显示方式

#defineCH452_BCD0x0580//设置BCD译码方式

#defineCH452_TWINKLE0x0600//设置闪烁控制

#defineCH452_GET_KEY0x0700//获取按键

#defineCH452_DIG50x0d00//数码管位5显示,需另加8位数据

#defineCH452_DIG60x0e00//数码管位6显示,需另加8位数据

#defineCH452_DIG70x0f00//数码管位7显示,需另加8位数据

#defineCH452_SCL_SET{IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,1);}

#defineCH452_SCL_CLR{IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);}

#defineCH452_SDA_SET{IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE,1);}

#defineCH452_SDA_CLR{IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE,0);}

#defineCH452_SDA_IN(IORD_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE);)

#defineCH452_SDA_D_OUT{IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,1);}//设置SDA为输出方向,对于双向I/O需切换为输出

#defineCH452_SDA_D_IN{IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE,0);}//设置SDA为输入方向,对于双向I/O需切换为输入

#defineCH452_SCL_D_OUT{IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE,1);}//设置SCL为输出方向,对于双向I/O需切换为输出

#defineCH452_I2C_ADDR10x60//CH452的ADDR=1时的地址,默认值

#defineCH452_I2C_MASK0x3E//CH452的2线接口高字节命令掩码

alt_u8flag;//队列放满标志

alt_u32key_value;//存储键盘值

(3)key.h代码

#ifndef_KEY_H_

#define_KEY_H_

#include"alt_types.h"

#defineKEY1_MASK0x01//0xfe

#defineKEY2_MASK0x02//0xfd

#defineKEY3_MASK0x04//0xfb

#defineKEY4_MASK0x08//0xf7

#defineKEY5_MASK0x10//0xef

#defineKEY6_MASK0x20//0xdf

#defineKEY7_MASK0x40//0xbf

#defineKEY8_MASK0x80//0x7f

#defineKEY11

#defineKEY22

#defineKEY33

#defineKEY44

#defineKEY55

#defineKEY66

#defineKEY77

#defineKEY88

#defineNO_KEY0xff

#defineKEY_TIMEOUT0xfe

externalt_u32KeyPIOInit(void);

externalt_u8GetKeyValue(void);

externvoidKeyIntEnable(void);

externvoidKeyIntDisable(void);

#endif//_KEY_H_

(4)Key.c代码

#include"system.h"

#include

#include"altera_avalon_pio_regs.h"

#include"alt_types.h"

#include"sys/alt_irq.h"

#include"key.h"

#defineBUF_SIZE10

alt_u32done=0;//信号量:

通知外部中断事件发生

staticalt_u8key_value;

staticvoidKeyDownISR(void*context,alt_u32id);

staticvoidKeyDownISR(void*context,alt_u32id)

{

/*clearcaptureregister*/

IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);

/*Getthekeyvalue*/

key_value=IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE);

done++;

}

alt_u32KeyPIOInit(void)

{

//initializetheKEY_PIOdirectionasinput

IOWR_ALTERA_AVALON_PIO_DIRECTION(BUTTON_PIO_BASE,0x00);//thedirectionisinput

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xff);//enableinterrupts

IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x00);//clearcaptureregister

//registerkeydownISR

returnalt_irq_register(BUTTON_PIO_IRQ,NULL,KeyDownISR);

}

voidKeyIntEnable(void)

{

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xff);//enableinterrupts

}

voidKeyIntDisable(void)

{

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0x00);//disableinterrupts

}

alt_u8GetKeyValue(void)

{

alt_u8value;

alt_u8err;

if(0!

=done)

{

/*中断事件数量减1*/

done--;

value=key_value;

key_value=0;//clearkey_value

}

else

value=0xff;

//thehighestpriorityofkeyiskey1

//thelowestpriorityofkeyiskey8

if((value&KEY1_MASK)==0)

returnKEY1;

elseif((value&KEY2_MASK)==0)

returnKEY2;

elseif((value&KEY3_MASK)==0)

returnKEY3;

elseif((value&KEY4_MASK)==0)

returnKEY4;

elseif((value&KEY5_MASK)==0)

returnKEY5;

elseif((value&KEY6_MASK)==0)

returnKEY6;

elseif((value&KEY7_MASK)==0)

returnKEY7;

elseif((value&KEY8_MASK)==0)

returnKEY8;

else

returnNO_KEY;

}

(5)Seven_seg.c代码

/*****************************************************

//点亮数码管程序

//2007.4.5

*///***************************************************

#include"system.h"

#include"altera_avalon_pio_regs.h"

#include"alt_types.h"

#include"priv/alt_busy_sleep.h"

#include

#include"sys/alt_irq.h"

#include"define.h"

#include"CH452_I2C.h"

#include"key.h"

#defineSPEED_UPKEY1//

#defineSPEED_DOWNKEY2//

#defineREVERSEKEY3//

#defineSTOP_STARTKEY4//

alt_u8KeyVlaue;

main()

{

KeyPIOInit();

KeyIntEnable();

inti=0,a=0,b=0,c=0,u=0;

while

(1)

{

KeyVlaue=GetKeyValue();

switch(KeyVlaue)

{

caseSPEED_UP:

{

CH452_Write(CH452_SYSON2);//两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23)

CH452_Write(CH452_BCD);//BCD译码,8个数码管

while

(1)

{

if(u==1000)

{

u=0;

}

c=u/100;

b=u/10-c*10;

a=u%10;

CH452_Write(CH452_DIG7|c);

CH452_Write(CH452_DIG6|b);

CH452_Write(CH452_DIG5|a);

u++;

KeyVlaue=GetKeyValue();

if(KeyVlaue==SPEED_DOWN)

{

break;

alt_busy_sleep(1000000);

i=u-1;

}

break;

}

caseREVERSE:

{

CH452_Write(CH452_SYSON2);//两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23)

CH452_Write(CH452_BCD);//BCD译码,8个数码管

while

(1)

{

c=i/100;

b=i/10-c*10;

a=i%10;

CH452_Write(CH452_DIG7|c);

CH452_Write(CH452_DIG6|b);

CH452_Write(CH452_DIG5|a);

i--;

KeyVlaue=GetKeyValue();

if(KeyVlaue==SPEED_DOWN)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1