数码管显示课程设计报告.doc_第1页
数码管显示课程设计报告.doc_第2页
数码管显示课程设计报告.doc_第3页
数码管显示课程设计报告.doc_第4页
数码管显示课程设计报告.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

片上系统技术课程设计 题 目: 数码管的显示 学 号: 姓 名: 班 级: 教 师: 日 期: 目录一实验前的准备3二实验目的3三实验设备3四实验内容3五实验原理3六管脚分配4七实验步骤4八实验原理图:5九实验程序代码:6(1)ch452_i2c.h代码6(2)define.h代码8(3)key.h代码10(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综合创新开发实验平台核心板软件:quartus ii 8.0 nios ii 8.0四实验内容用七段数码管前三位显示000-999,计数周期为1s;按f1进行加1操作并用数码管显示。按f2计数停止,并显示当前数。按f3进行减1操作;当数从000-999时再加1变为000;当数从999-000时再减1变为999。五实验原理根据i2c总线时序要求,对ch452进行操作,送地址,送控制字,送数据。数码管显示是以bcd译码方式显示。六管脚分配七实验步骤(1)打开quartus ii 8.0,打开工程cide_c2,进行sopc操作,裁剪所需要的内容,综合一下再分配管脚。(2)启动nios ii ide并新建一个空白c/c+工程,命名为smm,在sopc builder system中选择之前建立好的硬件系统cide_c2.ptf。(3)转换工程路径,将提供的参考程序seven_seg.c,ch452_i2c.h,define.h加入到建立好的nios ii工程中,修改程序代码符合实验要求。(4)在system library设置页中,把程序和数据区都指定为sdram。(5)在quartus ii中下载文件,编译整个工程,查找语法错误。(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.hvoid ch452_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);void ch452_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) ;void ack()/确认 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);void ch452_i2c_wrbyte(unsigned char dat) /写一个字节数据 unsigned char temp_number; unsigned char i; int delay; iowr_altera_avalon_pio_direction(seg_key_sda_base, 1); iowr_altera_avalon_pio_direction(seg_key_scl_base, 1); for(i=0;i7; 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;delay5;delay+); iowr_altera_avalon_pio_data(seg_key_scl_base, 1); dat=dat1; iowr_altera_avalon_pio_data(seg_key_scl_base, 0);unsigned char ch452_i2c_rdbyte(void) /读一个字节数据 unsigned char i=8; unsigned char data_received=0; int delay; 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;delay7)&ch452_i2c_mask|ch452_i2c_addr0); / ch452的addr=0时#else ch452_i2c_wrbyte(unsigned char)(cmd7)&ch452_i2c_mask|ch452_i2c_addr1); / ch452的addr=1时(默认)#endif ack(); ch452_i2c_wrbyte(unsigned char)cmd); /*发送数据*/ ack(); ch452_i2c_stop_2(); /*结束总线*/ unsigned char ch452_read(void) /读取按键 unsigned char keycode; ch452_i2c_start_2(); /*启动总线*/ ch452_i2c_wrbyte(unsigned char)(ch452_get_key7)&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_#define ch452_nop 0x0000 / 空操作#define ch452_reset 0x0201 / 复位#define ch452_level 0x0100 / 加载光柱值#define ch452_clr_bit 0x0180 / 段位清0#define ch452_set_bit 0x01c0 / 段位置1#define ch452_sleep 0x0202 / 进入睡眠状态#define ch452_leftmov 0x0300 /设置移动方式-作移#define ch452_leftcyc 0x0301 /设置移动方式-左循#define ch452_rightmov 0x0302 /设置移动方式-右移#define ch452_rightcyc 0x0303 /设置移动方式-右循 #define ch452_self_bcd 0x0380 /自定义bcd码#define ch452_sysoff 0x0400 /关显示、键盘#define ch452_syson1 0x0401 /开显示#define ch452_syson2 0x0403 /开显示、键盘#define ch452_syson2w 0x0423 /开显示、键盘, 真正2线接口#define ch452_dsp 0x0500 /设置默认显示方式#define ch452_bcd 0x0580 /设置bcd译码方式#define ch452_twinkle 0x0600 /设置闪烁控制#define ch452_get_key 0x0700 / 获取按键#define ch452_dig5 0x0d00 / 数码管位5显示,需另加8位数据#define ch452_dig6 0x0e00 / 数码管位6显示,需另加8位数据#define ch452_dig7 0x0f00 / 数码管位7显示,需另加8位数据#define ch452_scl_set iowr_altera_avalon_pio_data(seg_key_scl_base, 1);#define ch452_scl_clr iowr_altera_avalon_pio_data(seg_key_scl_base, 0);#define ch452_sda_set iowr_altera_avalon_pio_data(seg_key_sda_base, 1);#define ch452_sda_clr iowr_altera_avalon_pio_data(seg_key_scl_base, 0);#define ch452_sda_in (iord_altera_avalon_pio_data(seg_key_sda_base);)#define ch452_sda_d_out iowr_altera_avalon_pio_direction(seg_key_sda_base, 1); / 设置sda为输出方向,对于双向i/o需切换为输出#define ch452_sda_d_in iowr_altera_avalon_pio_direction(seg_key_sda_base, 0); / 设置sda为输入方向,对于双向i/o需切换为输入#define ch452_scl_d_out iowr_altera_avalon_pio_direction(seg_key_scl_base, 1); / 设置scl为输出方向,对于双向i/o需切换为输出#define ch452_i2c_addr1 0x60 / ch452的addr=1时的地址,默认值#define ch452_i2c_mask 0x3e / ch452的2线接口高字节命令掩码alt_u8 flag; /队列放满标志alt_u32 key_value;/存储键盘值(3)key.h代码#ifndef _key_h_#define _key_h_#include alt_types.h#define key1_mask 0x01/0xfe#define key2_mask 0x02/0xfd#define key3_mask 0x04/0xfb#define key4_mask 0x08/0xf7#define key5_mask 0x10/0xef#define key6_mask 0x20/0xdf#define key7_mask 0x40/0xbf#define key8_mask 0x80/0x7f#define key1 1#define key2 2#define key3 3#define key4 4#define key5 5#define key6 6#define key7 7#define key8 8#define no_key 0xff#define key_timeout 0xfe extern alt_u32 keypioinit(void);extern alt_u8 getkeyvalue(void);extern void keyintenable(void);extern void keyintdisable(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#define buf_size 10alt_u32 done = 0; / 信号量:通知外部中断事件发生static alt_u8 key_value;static void keydownisr(void* context, alt_u32 id);static void keydownisr(void* context, alt_u32 id) /* clear capture register */ iowr_altera_avalon_pio_edge_cap(button_pio_base,0); /* get the key value */ key_value = iord_altera_avalon_pio_data(button_pio_base); done+; alt_u32 keypioinit(void)/initialize the key_pio direction as input iowr_altera_avalon_pio_direction(button_pio_base, 0x00); /the direction is inputiowr_altera_avalon_pio_irq_mask(button_pio_base, 0xff); /enable interruptsiowr_altera_avalon_pio_edge_cap(button_pio_base, 0x00); /clear capture register/register keydown isr return alt_irq_register(button_pio_irq, null, keydownisr);void keyintenable(void)iowr_altera_avalon_pio_irq_mask(button_pio_base, 0xff); /enable interruptsvoid keyintdisable(void)iowr_altera_avalon_pio_irq_mask(button_pio_base, 0x00); /disable interruptsalt_u8 getkeyvalue(void) alt_u8 value; alt_u8 err; if(0 != done) /* 中断事件数量减1 */ done-; value = key_value; key_value = 0; /clear key_value else value = 0xff; /the highest priority of key is key1 /the lowest priority of key is key8 if(value&key1_mask) = 0) return key1; else if(value&key2_mask) = 0) return key2; else if(value&key3_mask) = 0) return key3; else if(value&key4_mask) = 0) return key4; else if(value&key5_mask) = 0) return key5; else if(value&key6_mask) = 0) return key6; else if(value&key7_mask) = 0) return key7; else if(value&key8_mask) = 0) return key8; else return no_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#define speed_up key1 /#define speed_down key2 /#define reverse key3 /#define stop_start key4 /alt_u8 keyvlaue;main() keypioinit(); keyintenable(); int i=0,a=0,b=0,c=0,u=0; while(1) keyvlaue= getkeyvalue(); switch(keyvlaue) case speed_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 = spee

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论