数码管显示课程设计报告.docx
- 文档编号:24180333
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:21
- 大小:237.57KB
数码管显示课程设计报告.docx
《数码管显示课程设计报告.docx》由会员分享,可在线阅读,更多相关《数码管显示课程设计报告.docx(21页珍藏版)》请在冰豆网上搜索。
数码管显示课程设计报告
四.实验内容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)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 显示 课程设计 报告