嵌入式键盘及LED驱动实验
嵌入式ARM键盘控制LED灯实验报告.pdf
![嵌入式ARM键盘控制LED灯实验报告.pdf](https://img.taocdn.com/s3/m/73ab95f5804d2b160a4ec028.png)
(6) 运行超级终端, 选择正确的串口号, 并将串口设置位: 波特率(115200)、 奇偶校验( None)、数据位数( 8)和停止位数( 1),无流控,打开串口;
(7) 运行程序,在超级终端中输入的数据将回显到超级终端上,结果如图 5.4 所示:
图 6.1 初始化运行结果
图 6.2 main 运行结果
putc( (unsigned char) str[i++] ); } return i; ⑤按键初始化 int key_init()/* 按键初始化 */ { GPFCON = 0x55aa; GPFUP = 0xff; printk(" 按键初始化 OK\r\n"); return 0; } ⑥中断初始化 void irq_init()/* 中断初始化 */ { INTMSK &= ~(3<<2); printk(" 中断初始化 OK\r\n"); } (5) 编译 keypad;
UFCON0 = 0x00;
//不使用 FIFO
UMCON0 = 0x00;
//不使用流控
UBRDIV0 = 26; //波特率为 57600,PCLK=12Mhz } ②发送数据
while( ! (UTRSTAT0 & TXD0READY) ); UTXH0 = c; ③接收数据 while( ! (UTRSTAT0 & RXD0READY) ); return URXH0; ④打印数据 int i = 0; while( str[i] ){
①串口初始化程序
void uart_init()/* UART 串口初始化 */
{
GPHCON |= 0xa0;
嵌入式系统led实验报告
![嵌入式系统led实验报告](https://img.taocdn.com/s3/m/872d02270a4e767f5acfa1c7aa00b52acfc79cc0.png)
嵌入式系统led实验报告嵌入式系统是融合了计算机技术、控制技术和通信技术的复杂系统。
它的应用范围涵盖了从智能家电到工业自动化等多个领域。
在嵌入式系统中,LED的应用非常广泛,它可以用于指示灯、背光源,还可以用于制作LED屏幕等。
本报告基于STM32F103RBT6开发板,介绍了一次LED实验的过程。
一、硬件准备实验所需的硬件包括:1. STM32F103RBT6开发板;2. 顶部插座模块(用于连接LED灯);3. LED灯;4. USB线(用于连接开发板和电脑)。
1. Keil uVision5开发环境;2. STM32 CubeMX配置软件。
三、实验步骤2. 在Pinout&Configuration界面,选择将LED灯连接到开发板的哪个引脚上。
这里选择PC13引脚。
3. 在Clock Configuration界面,设置时钟源和时钟频率。
本实验中,选择HSI时钟源和72MHz的频率。
4. 在Pinout&Configuration界面的USART1选项卡中,开启USART1串口通信。
5. 在Project Manager界面,选择Generate Code,生成代码。
6. 打开Keil uVision5软件,在File菜单中选择New Project,创建新工程。
选择STM32F103C8系列,单片机型号选择STM32F103RBT6,前面板及链接器设置选择STM32F10x。
然后选择Project菜单,点击Options for Target,进入Target Options窗口,将Use MicroLIB选项打钩。
然后在Project Manager界面中找到Inc和Src文件夹,右键选择Add Files to Group并导入STM32CubeMX生成的头文件和代码文件。
```#include "stm32f1xx_hal.h"void SystemClock_Config(void);static void MX_GPIO_Init(void);while (1){HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); //LED亮灭HAL_Delay(100); //延时100ms}}void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct;RCC_ClkInitTypeDef RCC_ClkInitStruct;__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);}__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);}```8. 保存代码并使用USB线将开发板和电脑连接起来。
键盘及LED驱动实验操作步骤
![键盘及LED驱动实验操作步骤](https://img.taocdn.com/s3/m/19700ee80975f46527d3e1ef.png)
键盘及LED驱动实验操作步骤1. 将PC机的串口与开发板的UART0串口相连。
2. 将PC机的并口与JTAG仿真器的一端相连连接,将仿真器的另一端与ARM的JTAG硬件仿真口相连。
3. 安装ADS1.2。
4. 安装JTAG,在控制面板里设置添加硬件驱动,参考:UarmJtag2.0使用说明.pdf(UarmJtag2.0 的使用:一.添加驱动)5. 在PC上设置超级终端,参考:串口实验演示.pdf的第三页内容。
超级终端连接好后,将显示如下信息:6. 在ADS下建立工程,编写、编译代码。
①新建工程②将拷贝到工程目录下。
③ADS面板下,在空白处右键单击Create Group,创建init组和startup组,将工程文件夹里两个文件夹下的所有文件分别添加到相应的组内,如下图所示:④设置编译Debug,如下图所示:⑤单击按钮,在弹出的Debug Settings窗口(如下图)中设置参数:⑥首先在Target ——> Target Settings下设置,设置结果如上图所示。
⑦在Target ——> Arm Target下设置,设置如下:⑧在Linker ——> ARM Linker下设置,设置如下:⑨在Linker ——> Arm fromELF下设置,设置如下:⑩在Language Settings ——> ARM Assembler下设置,设置如下:在Language Settings ——> ARM C Compiler下设置,设置如下:7. 打开JTAG窗口(注:AXD调试前需打开,便于硬件仿真)。
单击:设置初始化配置如下:单击:保存文件到当前建立的工程下,文件名为:system.bin,如下图所示:8. 打开AXD进行仿真调试。
① Options ——> Configure Target选择硬件仿真:②选择ADP 即远程调试,点Configure 按钮进一步设置具体参数,设置仿真器的IP 地址:点Select 按钮选择远程连接为ARM ethernet driver,点Configure 按钮输入简易并行口仿真器的IP 地址,输入127.0.0.1(本机IP地址)即可,即可进行仿真调试。
嵌入式系统-流水灯、按键、定时器实验报告
![嵌入式系统-流水灯、按键、定时器实验报告](https://img.taocdn.com/s3/m/b02cc72d5022aaea988f0f88.png)
嵌入式系统应用实验报告姓名:学号:学院:专业:班级:指导教师:实验1、流水灯实验编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。
实验主要考察对STM32F10X系列单片机GPIO的输出操作。
参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。
由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。
由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。
反之,LED灯熄灭。
软件方面,在程序启动时,调用SystemInit()函数〔见附录1〕,对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。
GPIO配置函数为SZ_STM32_LEDInit()〔见附录2〕,函数中首先使能GPIO 时钟:RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。
初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,到达流水灯的效果〔程序完整代码见附录3〕。
实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:实验二、按键实验利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。
嵌入式led控制实验报告
![嵌入式led控制实验报告](https://img.taocdn.com/s3/m/9d4f4fe3b1717fd5360cba1aa8114431b90d8ea5.png)
嵌入式led控制实验报告嵌入式LED控制实验报告引言:嵌入式系统是一种集成了计算机硬件和软件的特殊计算机系统,广泛应用于各个领域,包括家电、汽车、医疗设备等。
而LED(Light Emitting Diode)则是一种半导体器件,可以将电能转化为光能。
在嵌入式系统中,LED的控制是一项重要的实验,本文将介绍嵌入式LED控制的实验过程和结果。
实验目的:本次实验的目的是通过嵌入式系统控制LED灯的亮灭,进一步理解嵌入式系统的工作原理以及学习如何编写相应的程序。
实验器材和方法:实验器材包括嵌入式开发板、LED灯、电源和连接线。
实验方法如下:1. 将LED灯连接到嵌入式开发板的GPIO引脚上;2. 使用开发板提供的编程软件,编写控制LED灯亮灭的程序;3. 将程序下载到开发板中;4. 运行程序,观察LED灯的亮灭情况。
实验结果:经过实验,LED灯可以根据程序的控制实现亮灭的变化。
通过改变程序中GPIO 引脚的电平状态,可以控制LED灯的亮灭。
例如,将GPIO引脚的电平设置为高电平,LED灯将亮起;将GPIO引脚的电平设置为低电平,LED灯将熄灭。
实验分析:本次实验的结果表明,嵌入式系统可以通过编写相应的程序来控制外部设备,如LED灯。
这是因为嵌入式系统中的GPIO引脚可以通过改变电平状态来控制外部设备的工作。
在本实验中,通过将GPIO引脚的电平设置为高电平或低电平,可以控制LED灯的亮灭。
嵌入式系统中的GPIO引脚是一种通用输入输出引脚,可以通过编程来控制其电平状态。
在实际应用中,可以将GPIO引脚连接到各种外部设备上,如传感器、电机等,通过改变引脚的电平状态,实现对外部设备的控制。
嵌入式系统的优势之一是其实时性和可靠性。
在本实验中,LED灯的亮灭可以实时响应程序的控制指令,没有明显的延迟。
这使得嵌入式系统在需要对外部设备进行快速响应的应用中具有优势,如工业自动化、智能家居等。
此外,嵌入式系统还具有较小的体积和低功耗的特点。
嵌入式课程三个实验结合
![嵌入式课程三个实验结合](https://img.taocdn.com/s3/m/e7a22c28fd4ffe4733687e21af45b307e971f950.png)
嵌入式课程三个实验结合
这是一个嵌入式课程的三个实验结合的示例:
1. LED闪烁控制实验
说明:在这个实验中,我们将使用C语言编程控制LED灯闪烁。
实验步骤:
- 连接电路:将LED连接到开发板的GPIO口。
- 编写程序:在开发板上使用C语言编写程序,使LED从亮到灭闪烁。
- 调试程序:在开发板上运行程序,观察LED是否从亮到灭闪烁。
- 利用按键控制LED闪烁频率:使用按键来控制LED闪烁的频率。
例如,按下按键后,闪烁频率变快,再按下按键后,闪烁频率变慢。
2. 蜂鸣器控制实验
说明:在这个实验中,我们将使用C语言编程控制蜂鸣器发出声音。
实验步骤:
- 连接电路:将蜂鸣器连接到开发板的GPIO口。
- 编写程序:在开发板上使用C语言编写程序,使蜂鸣器发出声音。
- 调试程序:在开发板上运行程序,听取蜂鸣器发出的声音。
- 利用按键控制蜂鸣器的声音:使用按键来控制蜂鸣器发出的声音。
例如,按下按键后,蜂鸣器发出高频声音,再按下按键后,蜂鸣器发出低频声音。
3. 温度传感器实验
说明:在这个实验中,我们使用温度传感器来测量环境温度。
实验步骤:
- 连接电路:将温度传感器连接到开发板的GPIO口。
- 编写程序:在开发板上使用C语言编写程序,读取温度传感器测量到的环境温度,并将其显示在开发板上。
- 调试程序:在开发板上运行程序,并读取显示温度的值。
- 利用LED显示温度:使用LED来显示温度。
例如,当温度达到一定值时,LED会亮起来,表示环境温度过高或过低。
嵌入式键盘及LED驱动实验
![嵌入式键盘及LED驱动实验](https://img.taocdn.com/s3/m/aab0e33cf111f18583d05a10.png)
《嵌入式系统设计》实验报告(2011-2012学年第2学期)实验三键盘及LED驱动实验—C语言实现方法一、实验目的1.学习键盘及LED驱动原理。
2.掌握ZLG7289芯片的使用方法。
二、实验内容通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上显示出来。
三、预备知识1.掌握在ARM SDT 2.5或ADS1.2集成开发环境中编写和调试程序的基本过程。
2.了解ARM应用程序的框架结构。
3.了解µC/OS-II多任务的原理。
四、实验设备及工具硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。
软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序五、实验原理ZLG7289A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示﹑键盘接口的全部功能。
ZLG7289A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式。
此外,还具有多种控制指令,如消隐﹑闪烁﹑左移﹑右移﹑段寻址等。
ZLG7289A具有片选信号可方便地实现多于8位的显示或多于64键的键盘接口。
其特点如下:a.串行接口无需外围元件可直接驱动LED。
b.各位独立控制译码/不译码及消隐和闪烁属性。
c.(循环)左移/(循环)右移指令。
d.具有段寻址指令方便控制独立LED。
e.键盘控制器内含去抖动电路。
表2-5 引脚说明引脚名称说明1 ,2 VDD 正电源3 ,5 NC 悬空4 VSS 接地6 /CS 片选输入端,此引脚为低电平时,可向芯片发送指令及读取键盘数据7 CLK 同步时钟输入端,向芯片发送数据及读取键盘数据时,此引脚电平上升沿表示数据有效8 DATA 串行数据输入/输出端,当芯片接收指令时此引脚为输入端,当读取键盘数据时此引脚在读指令最后一个时钟的下降沿变为输出端9 /KEY 按键有效输出端,平时为高电平,当检测到有效按键时,引脚变为低电平10-16 SG-SA 段g—段a 驱动输出17 DP 小数点驱动输出18-25 DIG0-DIG7 数字0—数字7驱动输出26 OSC2 振荡器输出端27 OSC1 振荡器输入端28 /RESET 复位端ZLG7289A的控制指令分为二大类——纯指令和带有数据的指令:1.纯指令(1)复位(清除)指令,如表2-6所示:表2-6 复位指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 1 0 0当ZLG7289A收到该指令后,将所有的显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。
嵌入式设计实验报告
![嵌入式设计实验报告](https://img.taocdn.com/s3/m/5761b2d585868762caaedd3383c4bb4cf7ecb727.png)
一、实验目的1. 熟悉嵌入式系统开发的基本流程和常用工具;2. 掌握嵌入式系统硬件资源的使用方法;3. 熟悉嵌入式系统软件开发的基本方法;4. 提高嵌入式系统设计能力。
二、实验内容1. 硬件平台:基于STM32F103系列单片机的开发板;2. 软件平台:Keil uVision5集成开发环境;3. 实验任务:设计一个简单的嵌入式系统,实现按键输入和LED灯控制功能。
三、实验原理1. 硬件原理:STM32F103系列单片机是一款高性能、低功耗的ARM Cortex-M3内核微控制器,具有丰富的片上外设资源,如GPIO、定时器、ADC等。
在本实验中,主要使用GPIO进行按键输入和LED灯控制。
2. 软件原理:嵌入式系统软件开发主要包括底层驱动程序、中间件和应用层。
底层驱动程序负责硬件资源的管理和配置;中间件提供系统服务,如通信、定时器等;应用层实现用户功能。
在本实验中,主要使用C语言编写程序,实现按键输入和LED灯控制功能。
四、实验步骤1. 硬件连接:将开发板上的按键和LED灯分别连接到单片机的GPIO端口;2. 软件编写:(1)创建项目:在Keil uVision5中创建一个新的项目,选择STM32F103系列单片机作为目标设备;(2)添加源文件:添加一个C语言源文件,用于编写主程序;(3)配置GPIO:在源文件中编写GPIO初始化代码,配置按键和LED灯的GPIO端口为输入和输出模式;(4)编写按键输入程序:编写按键扫描函数,用于检测按键状态,并根据按键状态控制LED灯;(5)编译程序:编译项目,生成目标文件;(6)下载程序:将编译好的程序下载到开发板;3. 实验验证:在开发板上运行程序,观察按键输入和LED灯控制功能是否正常。
五、实验结果与分析1. 实验结果:按键按下时,LED灯点亮;按键松开时,LED灯熄灭;2. 实验分析:通过编写程序,实现了按键输入和LED灯控制功能,验证了嵌入式系统开发的基本流程和常用工具。
实验七-单片机键盘LED显示实验
![实验七-单片机键盘LED显示实验](https://img.taocdn.com/s3/m/2ea04c9beff9aef8951e0631.png)
实验七单片机键盘LED显示实验一、实验目的1、掌握键盘和LED显示器的接口方法和编程方法。
2、掌握键盘扫描和LED八段码显示器的工作原理。
3、学习并口扩展的程序编写方法。
二、实验说明利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。
实验程序可分成三个模块。
①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。
②显示模块:将显示单元的内容在显示器上动态显示。
③主程序:调用键输入模块和显示模块。
三、实验仪器计算机伟福实验箱(lab2000P )四、实验内容1、本实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
在判断有键按下后,要有一定的延时,防止键盘抖动。
地址中的X是由KEY/LED CS 决定,参见地址译码。
做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。
以便用相应的地址来访问。
例如将KEY/LED CS信号接CS0上,则列扫描地址为08002H,行码地址为08001H。
列扫描码还可以分时用作LED的位选通信号。
2、本实验仪提供了6 位8段码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
3、本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。
此处X是由KEY/LED CS 决定,参见地址译码。
做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LED CS 接到CS0上,则段码地址为08004H,位码地址为08002H。
实验十五 LED显示和键盘实验--第八次实验内容
![实验十五 LED显示和键盘实验--第八次实验内容](https://img.taocdn.com/s3/m/87d9ab1aa300a6c30c229fbd.png)
实验十五LED显示和键盘实验一、实验目的:加深用户对I2C总线的理解,熟悉I2C器件的使用,掌握ZLG7290芯片显示和键盘的简单程序设计。
二、实验设备及器件:IBM PC 机一台DP-51PROC 单片机综合仿真实验仪一台三、实验内容:ZLG7290芯片LED显示、键盘控制器驱动实验。
四、实验要求熟练掌握I2C总线的控制,灵活运用I2C主控器软件包,深刻理解ZLG7290芯片LED显示、键盘控制的各种功能,编写驱动程序,读出用户按键值并依次显示在8个LED数码管上(保留显示最后8次按键值,显示内容从右向左移动,最后一次按键值显示在最右侧LED 数码管上)。
五、实验步骤①用导线连接D5区和A2区的P16→SCL,P17→SDA,P10→RST_L,INT_KEY→INT0,短接D5区的JP1跳线。
②模拟I2C软件包VI2C_ASM.INC文件,使用 $INCLUDE (VI2C_ASM.INC) 命令加入到你的汇编源文件中。
在你的汇编源文件中定义SCL、SDA、ACK等信号。
③先编写显示的子程序(Display)和获取用户按键子程序(GetKey)。
④然后再进行整体编程。
如果还有一难,可以先画流程一,再编写程序。
⑤显示结果为:上电运行时,8位数码管显示01234567,用户按键时,键值在最右侧LED数码管显示,原显示内容左移一位,例如:显示由“01234567”变为“1234567x”,(x:用户按键值,1~16,显示为1~F,g)。
一、实验参考程序SDA BIT P1.7 ;I2C总线定义串行数据存取位SCL BIT P1.6 ;I2C总线定义串行时钟位RST BIT P1.0 ;MCU复位输出信号,低电平复位ZLG7290INT_KEY BIT P3.2 ;MCU中断信号输入,有效的按键动作使该引脚信号变为低电平MTD EQU 40H ;I2C总线发送数据缓冲区(8字节)MRD EQU 48H ;I2C总线接收数据缓冲区(8字节)DISBUF EQU 38H ;显示缓冲区(8字节,可对应8位数码管显示) ;定义ZLG7290器件地址及子地址ZLG7290 EQU 70H ;ZLG7290的器件地址ACK BIT 10H ;应答标志位SLA DATA 50H ;器件的从地址SUBA DATA 51H ;器件的子地址NUMBYTE DATA 52H ;读/写的字节数变量KEY DATA 53H ;返回用户按键值SYSTEMREG E QU 00H ;系统寄存器地址,保存ZLG7290系统状态KEYREG EQU 01H ;键值寄存器,表示被压按键的键值CMDBUF0 EQU 07H ;命令缓冲区0CMDBUF1 EQU 08H ;命令缓冲区1DPRAM EQU 10H ;显示缓存寄存器ORG 8000HLJMP MAINORG 8100H;-------主程序如下:MAIN: MOV SP,#70H ;堆栈区从70H开始CLR R ST ;复位ZLG7290LCALL DELAY ;等待复位完成,ZLG7290复位周期比较长,必须等待SETB RST ;结束复位LCALL DELAYLCALL CLSDISP ;清除显示MAINLOOP: MOV DISBUF+0,#0 ;上电运行时,8位数码管显示01234567MOV DISBUF+1,#1 ;给显示缓冲区赋值,01234567MOV DISBUF+2,#2MOV DISBUF+3,#3MOV DISBUF+4,#4MOV DISBUF+5,#5MOV DISBUF+6,#6MOV DISBUF+7,#7LCALL DISPLAY ;调用显示子程序,显示内容WAITKEY: JB;查询按键INT_KEY,W AITKEYLCALL GETKEY ;获取键值MOV A,KEYJZ WAITKEY ;KEY=0无键按下,继续查询MOV;显示内容左移DISBUF+7,DISBUF+6MOVDISBUF+6,DISBUF+5MOVDISBUF+5,DISBUF+4MOVDISBUF+4,DISBUF+3MOVDISBUF+3,DISBUF+2MOVDISBUF+2,DISBUF+1MOVDISBUF+1,DISBUF+0MOV DISBUF+0,KEYLCALL DISPLAYLJMP W AITKEY;子程序名:CLSDISP;功能:清除显示内容;调用:VI2C_ASM.INC;入口参数:无;出口参数:无;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CY,R5(当前工作寄存器组)CLSDISP: MOV R5,#8 ;循环计数器初值,8位数码管MOV A,#01100000B ;按位下载数据且译码指令01100 A2A1A0;A2~A0:对应显示位置1~8位数码管CLS1: MOV SLA,#ZLG7290;指定器件地址MOV;指定子地址SUBA,#CMDBUF0MOV MTD,A ; 命令送I2C总线发送数据缓冲区MOV MTD+1,#1FH ;命令参数,1FH:无显示MOV;待发送数据2字节NUMBYTE,#02HPUSH ACC ;保护ACCPUSH PSW ;保护PSWSETB RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1CLR RS1LCALL IWRNBYTE ;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)POP PSW ;恢复PSWPOP ACC ;恢复ACCINC A ;按位下载数据且译码指令地址部分+1LCALL DELAY ;延时,等待ZLG7290执行上述命令DJNZ R5,CLS1 ;没有达到8次,继续循环RET ;子程序返回;子程序名:DISPLAY;功能:在8段LED数码管显示;调用:VI2C_ASM.INC;入口参数: DISBUF+0~ DISBUF+7,8字节显示缓冲区;出口参数:无;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CY,R0,R5(当前工作寄存器组)DISPLAY: MOV R5,#8 ;循环计数器初值,8位数码管MOV A,#01100000B ;按位下载数据且译码指令01100 A2A1A0;A2~A0:对应显示位置1~8位数码管MOV R0,# DISBUF ;R0-> DISBUFDISP1: MOV SLA,#ZLG7290;指定器件地址MOV;指定子地址SUBA,#CMDBUF0MOV MTD,A ;命令送I2C总线发送数据缓冲区MOV MTD+1,@R0 ;命令参数,待显示数据送I2C总线发送数据缓冲区MOV;待发送数据2字节NUMBYTE,#02HPUSH ACC ;保护ACCPUSH PSW ;保护PSWSETB RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1CLR RS1LCALL IWRNBYTE ;调用写2字节数据程序(VI2C_ASM.INC,I2C模拟软件包)POP PSW ;恢复PSWPOP ACC ;恢复ACCINC A ;按位下载数据且译码指令地址部分+1INC R0 ;R0+1,指向下一个待显示数据LCALL DELAY ;延时,等待ZLG7290执行上述命令DJNZ R5,DISP1 ;没有达到8次,继续循环RET ;子程序返回;子程序名:GETKEY;功能:获取用户按键值(KEY);调用:VI2C_ASM.INC;入口参数:无;出口参数:KEY;占用资源: R0,R1,R2,R3(工作寄存器组1),ACC,CYGETKEY: MOV;指定器件地址SLA,#ZLG7290MOV SUBA,#01H ;指定子地址MOV;读1字节数据NUMBYTE,#01HPUSH ACC ;保护ACCPUSH PSW ;保护PSWSETB RS0 ;切换工作寄存器,I2C通信软件使用工作寄存器组1CLR RS1LCALL IRDNBYTE ;调用读1字节数据程序POP PSW ;恢复PSWPOP ACC ;恢复ACCMOV KEY,MRD ;读取的数据送KEYRET ;子程序返回;子程序名: DELAY;功能:延时约36.5 MS(11.0592MHZ时钟);调用:YS500US;入口参数:无;出口参数:无;占用资源: R7,R6DELAY: MOV R7,#80HMIN: LCALL YS500USDJNZ R7,MINRET;子程序名: YS500US;功能:延时约279US(11.0592MHZ时钟);调用:无;入口参数:无;出口参数:无;占用资源: R6YS500US:MOV R6,#80HDJNZ R6,$ ;延时128×2T=256T (T=1/1159200)RET$INCLUDE(VI2C_ASM.INC) ;将VIIC软件包加入到本段代码后END七、实验思考题①编写LED数码管闪烁控制子程序,实现对指定位进行闪烁控制。
实验五 键盘、LED、LCD应用实验
![实验五 键盘、LED、LCD应用实验](https://img.taocdn.com/s3/m/52c287c7482fb4daa48d4b79.png)
一、实验目的:
1.熟练运用嵌入式开发系统环境、C语言及调试方式; 2.理解行扫描工作原理; 3. 理解LED动态显示原理 3.理解LCD显示原理 二、实验要求:
1.仔细阅读本实验指导书。 2.复习有关的章节。 3.熟悉键盘、LED、LCD模块的原理及编程方法。 4.根据实验内容要求编写好程序,为实验做充分地准备。
三.实验设备及其连接 1.PC机 2.飞思卡尔嵌入式实验开发系统
一台
四.实验内容
1.理解并运行样例程序 (1)KL25 SD13-01 EVB板板上的lcd显示Wait
Receiving..Soochow 2013.01. (2)键盘按键数据显示在LCD上面 (3)led上显示0235 2. 设计实验
(1)将键盘按键数据送PC机显示(利用串口调试工具) (2)LED上显示2016
PC机显示的内容
六.实验报告要求 1.按实验报告格式认真完成实验报告 .实验报告上填写的程序
1)样例中的isr.c和mai.c 2)设计实验中的isr.c和mai.c
湖南工程学院嵌入式实验报告键盘的应用
![湖南工程学院嵌入式实验报告键盘的应用](https://img.taocdn.com/s3/m/c9fc2e7c9b6648d7c1c74641.png)
实验报告课程名称嵌入式系统实验名称键盘的应用专业计算机技术与科学班级学号姓名指导教师胡瑛年月日实验二键盘的应用实验名称键盘的应用评分实验日期年月日指导教师胡瑛姓名专业班级学号一、实验目的掌握键盘的工作原理及应用二实验内容按下KEY0键,LED0灯闪烁一次,按下WK_UP键,LED1灯闪烁一次。
原理图如图1、2所示:图1 LED灯电路原理图图2 键盘的电路原理图Led.h:void LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //LED0-->PB.5端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHZ GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6); //PE.6输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //推挽输出GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_5);}Led.c:void KEY_Init(void) //初始化{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENAB LE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //KEY0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化,下拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入默认下拉GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0}main.c:int main(void){vu8 key=0;delay_init(); //延时函数初始化LED_Init(); //LED端口初始化KEY_Init(); //初始化与按键连接的硬件端口while(1){key=KEY_Scan(0); //得到键值if(key){switch(key){case WKUP_PRES: //控制LED0闪烁LED0=!LED0delay_ms(300);LED0=!LED0;break;case WKUP_PRES: //控制LED1闪烁LED1=!LED1delay_ms(300);LED1=!LED1;break;}}else delay_ms(10);}}三实验结果实现按键闪烁,按下KEY0键,LED0灯闪烁一次,按下WK_UP键,LED1灯闪烁一次.四.实验体会成功编写了按键闪烁程序,明白了实验的原理,更加深入的理解了嵌入式。
实验四 小键盘+LED驱动实验
![实验四 小键盘+LED驱动实验](https://img.taocdn.com/s3/m/501d1e6dddccda38376baf4e.png)
实验五、六小键盘+LED驱动实验一、实验目的学习小键盘驱动原理和LED显示原理,掌握轮询方式获取键值的原理,理解驱动程序采用轮询方式和中断方式的区别;学习将最近的按键值移位显示在LED 上的方法。
二、实验内容熟悉开发环境和工具,通过烧写程序,按下对应的小键盘,能都在LED上显示相对的数字循环右移。
三、实验步骤1.编写键盘驱动函数keybd.c,实现函数keybd_read,keybd_open,keybd_release和keybd_init。
其中代码主要是keybd_read,keybd_init函数。
注意keybd_read函数需要延时。
2.编写LED驱动函数led.c。
实现函数led_read,led_open,led_ioctl,led_write,led_release 和led_init。
其中代码主要是led_write,led_ioctl,led_init 函数。
3.在主程序key.c中编写代码,获取按键值。
并根据获得的按键值,点亮相应的LED灯。
6个LED将显示最近的6次按键值。
程序如下:int main(){char ret[7]; // ret[0]为本次读入的按键值。
ret[1..7]中保存最近6次的按键值,//ret [i]为向LED[i]写入的数据。
数组初始化为0xdf(对应数值8),//即使得6个LED的所有段都点亮,显示数值“8”。
打开键盘;打开LED;初始化ret数组;向LED[i]分别写入ret[i];//点亮6个LED,等待键盘输入。
While (1) //查询方式{读取键盘;if (有键按下){ret数组逻辑右移;向LED[i]分别写入ret[i];//LED显示最新的6次按键值}usleep(100000); //释放一下CPU}关闭LED;关闭键盘;return 0;}#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/socket.h>#include <syslog.h>#include <signal.h>#include <errno.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <syslog.h>#include <signal.h>#include <led_ioctl.h>#define NOKEY 0int main(){int keybd_fd,led_fd,count;char ret[7]; //ret[i] is the data send to LED[i]keybd_fd = open("/dev/keybd", O_RDONLY); //open keyboard if(keybd_fd<=0){printf("open keybd device error!\n");return 0;}led_fd = open("/dev/led",O_RDWR); //open led.if (led_fd <= 0){printf("open led device error\n");return 0;}ret[0] = NOKEY; //maintain the latest key value for (count=1; count<7; count++){ret[count] = 0xdf; //initiate to char '8'.}ioctl(led_fd,IOCTRL_LED_1); //light the first led:led[1] count = write(led_fd,ret+1,1);if (count != 1){printf("write device led error\n");return 0;}//light led[2]~led[6] with the init value '8'ioctl(led_fd,IOCTRL_LED_2);count = write(led_fd,ret+2,1);ioctl(led_fd,IOCTRL_LED_3);count = write(led_fd,ret+3,1);ioctl(led_fd,IOCTRL_LED_4);count = write(led_fd,ret+4,1);ioctl(led_fd,IOCTRL_LED_5);count = write(led_fd,ret+5,1);ioctl(led_fd,IOCTRL_LED_6);count = write(led_fd,ret+6,1);//poll endlesswhile(1){read(keybd_fd,ret,1);if (ret[0] != NOKEY) //when key pressed {// printf("key = %c\n",ret[0]);//keep ret[1~6] the latest 6 pressed key value.for( count=7; count>0; count--){ret[count] = ret[count-1]; //right rotate }//light led[1~6]ioctl(led_fd,IOCTRL_LED_1);count = write(led_fd,ret+6,1);ioctl(led_fd,IOCTRL_LED_2);count = write(led_fd,ret+5,1);ioctl(led_fd,IOCTRL_LED_3);count = write(led_fd,ret+4,1);ioctl(led_fd,IOCTRL_LED_4);count = write(led_fd,ret+3,1);ioctl(led_fd,IOCTRL_LED_5);count = write(led_fd,ret+2,1);ioctl(led_fd,IOCTRL_LED_6);count = write(led_fd,ret+1,1);}//end ifusleep(100000); //free cpu a while}//end whileclose(keybd_fd);close(led_fd);return 0;}四、遇到问题及解决方法在led中显示循环右移的数字时,会出现乱码的情况,后来发现是程序错误,经改正后,显示结果如下:。
天津理工嵌入式实验5Linux应用程序开发--按键控制LED灯
![天津理工嵌入式实验5Linux应用程序开发--按键控制LED灯](https://img.taocdn.com/s3/m/864b96cd84254b35eefd3467.png)
《嵌入式系统》实验考核表实验名称:实验五:嵌入式Linux应用程序开发-按键控制LED灯2015级班时间: 2017年11月28日组号:表二注:●每组1-2人,必须在一个教学班中,学生自由组合完成本课程所有实验,实验过程中不允许换人换组。
●表1除“成绩”栏外由学生填写,表2由老师填写。
每个成员在表1的“分工情况”一栏中详细填写实验中的分工。
●本页打印,附在实验报告正文前。
●实验报告如发现雷同,一律以0分计。
实验报告一、实验目的编写程序运行LED和按键控制程序。
二、实验内容1. 在Linux的开发环境下,使用GCC、VI、Makefile、GDB等工具完成简单程序开发2. 基本要求如下:a. 运行已有的Led程序和按键Key程序;b.合并Led和Key程序,完成以下功能:在开发板上按键,控制开发板上的灯点亮,再次按开发板上按键,控制开发板上的灯熄灭。
c. 在ARM端运行可执行程序;d. 观测实验结果。
三、实验要求实验报告中体现全部实验内容,可以粘贴代码,运行结果图等。
四、实验步骤1.进入目录/UP-CPU210-II /SRC/KERNEL/LINUX-2.6.35.7/2.使用make menuconfig 指令来配置内核对LED模块的支持3.退出保存配置,重新编译内核,执行make命令Scripts/kconfig/comf -s arch/arm/KconfigCHK include/linux/version/hSYMLINK include/asm-arm/arch -> include/agm-arm/arch-s3c2410Make[1]: ‘include/asm-arm/mach-types.h’ is up to dateCHK include/linux/compile.h编译LED应用测试程序1.进入实验目录2.清除中间代码重新编译3.生成可执行程序test_led1、启动Contex-A8的开发板,连上电源线、连好网线、串口线。
键盘、LED发光实验报告
![键盘、LED发光实验报告](https://img.taocdn.com/s3/m/276c43290722192e4536f68f.png)
EDA设计课程实验报告实验题目:键盘、LED发光实验学院名称:专业:班级:姓名:高胜学号小组成员:指导教师:一、实验目的通过实验让同学们进一步了解、熟悉和掌握FPGA开发软件的使用方法及Verilog HDL 的编程方法,并熟悉以Verilog HDL文件为顶层模块的设计;学会和体会分支条件语句case 的使用方法及FPGA I/O口的输出控制。
二、设计任务及要求smartSOPC试验箱上有八个按键KEY1~KEY8和八个发光二极管LED1~LED8。
在smartSOPC试验箱上有KEY1~KEY8通过跳线JP6的KEY1~KEY8分别与芯片的121~124、143、141、158、和156引脚相连(QuickSOPC芯片板上的KEY1~KEY4与SmartSOPC试验箱上KEY1~KEY4是并接的)。
本试验的内容是要求在SmartSOPC试验箱上完成对8个键盘KEY1~KEY8进行监控,一旦有键输入则判断其键值,并点亮相应个发光二极管。
三、系统设计1、整体设计方案FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。
当这种I/O口被设置为输入口使用时(如定义key0为输入引脚:input key0;),该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚可作为专用输入引脚。
正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可判断其键值并作出相应的处理。
2、功能模块电路设计(1)输入输出模块框图(见图1)图1(键盘led发光模块图)(2)模块逻辑表达(见表1)表1(按键led发光真值表)(3)算法流程图(见图2)(4)Verilog源代码module ledkey(key,led); //模块名ledkeyinput [7:0]key; //输入按键状态output [7:0]led; //输出led发光状态reg [7:0]k; //定义8位按键状态寄存器k reg [7:0]l; //定义8位led状态寄存器lassign led=l; //输出led发光状态选择always @(key) //定义按键信号变化触发begink=key; //按键状态选择case (k)8'b11111110:l=8'b11111110; //亮一盏led8'b11111101:l=8'b11111100; //亮二盏led8'b11111011:l=8'b11111000; //亮三盏led8'b11110111:l=8'b11110000; //亮四盏led8'b11101111:l=8'b11100000; //亮五盏led8'b11011111:l=8'b11000000; //亮六盏led8'b10111111:l=8'b10000000; //亮七盏led8'b01111111:l=8'b00000000; //亮八盏leddefault:l=8'b11111111; //不亮endcaseendendmodule四、系统调试1、仿真调试(1)仿真代码`timescale 1ns/1nsmodule ledkey_tp;reg [7:0]key;wire [7:0]led;ledkey u1(key,led);initialbegin#100 key=8'b11111110;#100 key=8'b11111101;#100 key=8'b11111011;#100 key=8'b11110111;#100 key=8'b11101111;#100 key=8'b11011111;#100 key=8'b10111111;#100 key=8'b01111111;#100 key=8'b00111111;#100 $finish;endinitial $monitor($time,,,"%b,%b",key,led);endmodulemodule ledkey(key,led);input [7:0]key;output [7:0]led;reg [7:0]k;reg [7:0]l;assign led=l;always @(key)begink=key;case (k)8'b11111110:l=8'b11111110;8'b11111101:l=8'b11111100;8'b11111011:l=8'b11111000;8'b11110111:l=8'b11110000;8'b11101111:l=8'b11100000;8'b11011111:l=8'b11000000;8'b10111111:l=8'b10000000;8'b01111111:l=8'b00000000;default:l=8'b11111111;endcaseendendmodule(2)仿真波形图(见图3)图3(3)波形分析# 0 xxxxxxxx,xxxxxxxx # 100 11111110,11111110 # 200 11111101,11111100# 300 11111011,11111000 # 400 11110111,11110000 # 500 11101111,11100000 # 600 11011111,11000000 # 700 10111111,10000000 # 800 01111111,00000000 # 900 00111111,11111111 (4)引脚图表2-1 引脚锁定方法五、实验感想。
实验四 LED及键盘接口实验
![实验四 LED及键盘接口实验](https://img.taocdn.com/s3/m/cf240e215901020207409cef.png)
实验四LED显示器及键盘接口实验
实验电路见文件EX04_1.DSN和EX04_2.DSN,两电路完全等价,区别在于EX04_1.DSN中是由分离LED数码显示管和按扭元件组成LED显示器和键盘;EX04_2.DSN是由封装元件组成LED显示器和键盘。
程序功能:
1、当键盘输入数字时,新输入的数显示在显示器的最右端,原来的显示左移一位。
2、当输入‘*’或‘#’时,清除所有显示的内容。
参考:
1、可参考教材P169~176,注意实验电路中使用的是8255,教材使用的是8155,两者
在初始化命令设置和寻址上有区别。
2、8255的命令控制字详见微机原理教材。
控制字
在实验电路中的地址分配如下:PA 0000H
PB 0400H
PC 0800H
控制0C00H
3、访问8255用MOVX指令。
键盘及LED显示试验
![键盘及LED显示试验](https://img.taocdn.com/s3/m/f3dcfb04aeaad1f346933ffc.png)
实验三键盘及 LED显示实验一、实验内容利用8255 可编程并行接口控制键盘及显示器,当有按键按下时向单片机发送外部中断请求(INT0,INT1),单片机扫描键盘,并把按键输入的键码一位LED 显示器显示出来。
二、实验目的及要求(一)实验目的通过该综合性实验,使学生掌握8255 扩展键盘和显示器的接口方法及C51 语言的编程方法,进一步掌握键盘扫描和LED显示器的工作原理;培养学生一定的动手能力。
(二)实验要求1.学生在实验课前必须认真预习教科书与指导书中的相关内容,绘制流程图,编写C51 语言源程序,为实验做好充分准备。
2.该实验要求学生综合利用前期课程及本门课程中所学的相关知识点,充分发挥自己的个性及创造力,独立操作完成实验内容,并写出实验报告。
三、实验条件及要求计算机,C51语言编辑、调试仿真软件及实验箱50台套。
四、实验相关知识点1.C51编程、调试。
2.扩展8255 芯片的原理及应用。
3.键盘扫描原理及应用。
4.LED显示器原理及应用。
5.外部中断的应用。
五、实验说明本实验仪提供了8位8段LED显示器,学生可选用任一位LED显示器,只要按地址输出相应的数据,就可以显示所需数码六、实验原理图1 / 98255七、连线说明F4区: CS 、A0 、A1A3 区:CS1、A0 、A1 B6 区: JP56(PA 口)F4 区: JP41(C) B6 区: JP53(PB 口) F4 区: JP42(B) B6 区: JP52(PC 口) F4 区: JP47(A) A3 区: JP51F4 区: JP92(D)A3 区: P1.6、 P1.7A3 区: INT0 、INT1注: F4 的 D 无法与 INT0(P3.2) 、INT1(P3.3) 直接连接,所以使用 P1 口桥接。
DS30 LG4041AHBSEGB (8255 PB6) 7 SEGC (8255 PB5) 4 SEGD (8255 PB4) 2 SEGE (8255 PB3) 1SEGA (8255 PB7) 11SEGH (8255 PB0) JP42 a ba c d g bf ed cg dp dpGND42afgb e d c dp GND39a fgb ed d cpGND28afgb e d c dp GND16DS29LG4041AHSEGH 3SEGA 11 SE SEGC 4 SEGD 2SEGE 1a b c d e fgdpa gbdd c paGND3a GND2adpGND1GND498 6 JP41(PA7)(8255 PA6) (8255 PA5) (8255 PA4) (8255 PA3) (8255 PA2)(8255PA1)(8255 PA0)12 3 45C6VCCR162 5.1KVCCR1635.1KU36D0 34 D1 33 D2 32D3 31 D4 30 D5 29D6 28 D7 27RD 5 WR 36D0PA0 D1PA1 D2PA2 D3 PA3 D4 PA4 D5 PA5 D6 PA6 D7PA7 RD PB0 WR PB1 A0 PB2 A1 PB3 RESET PB4 CSPB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC74 PA0 3 PA1 2 PA2 1 PA3 40 PA4 39 PA5 38 PA6 37 PA7 18 PB019 PB1 20 PB2 21 PB3 22 PB4 23 PB5 24 PB6 25 PB714 PC0 15 PC1 16 PC2 17 PC3 13 PC4 12 PC5 11 PC6 10PC71 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 8JP56JP53JP526 7)2.3P (0T NABCDE)3.3P (0T N(8255 PC7) (8255 PC6) (8255 PC5) (8255 PC4) (8255 PC3) (8255 PC2) (8255 PC1) (8255 PC0)JP92 1 23 54D 67 8 JP47 1 2 3 54A 6 7 8八、实验参考流程图1.主程序流程图2.外中断服务程序流程外部中断1图外部中断3. LED 显示程序流程图九、 C51语言参考源程序#include "reg52.h" unsigned char KeyResult; unsigned char buffer[8]; bit bKey;xdata unsigned char P_8255 _at_ 0xf003; xdata unsigned char PA_8255 _at_ 0xf000; xdata unsigned char PB_8255 _at_ 0xf001; xdata unsigned char PC_8255 _at_ 0xf002; code unsigned char SEG_TAB[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x0};sbit bLine0 = P3^2; sbit bLine1 = P3^3; // 延时 1ms void Delay1ms() {unsigned char i;Y// 存放键值// 显示缓冲区 // 是否有键按//8255 的控制//8255的 PA 口 //8255的 PB 口 //8255的 PC 口 // 段i = 0;while (--i); } // 显示 void Display() { unsigned char i = 0x7f; unsigned char j; for (j = 0; j < 8; j++) {PA_8255 = i; PB_8255 = SEG_TAB[buffer[j]];i = i / 2 + 0x80; Delay1ms(); }} // 扫描 // 段数据// 更新显示缓冲区数据 void RefurbishData() { char i; for (i = 7; i >0; i--) buffer[i] = buffer[i-1]; buffer[0] = KeyResult; }void Int0Int() interrupt 0 { unsigned char i = 0x80; unsigned char KeyResult0 = 0x0; EX0 = 0; P_8255 = 0x89; bLine0 = 0; // 关外部中断//PC 口输入 //P3.2 作行输出while (i){if ((PC_8255 & i) ==0) break;KeyResult0++; i >>= 1;}P_8255 = 0x80; PC_8255 = 0;//8255 的 PA 、PC 口全作输出口IE1 = 0; EX1 = 1;}bLine0 = 1; if (i){TH0 = 60; TL0 = 176; TR0 = 1; KeyResult = KeyResult0;}// 定时中断计数器初值// 定时 50msIE0 = 0; EX0 = 1; }// 清除中断 // 开外部中断void Int1Int() interrupt 2 { unsigned char i = 0x80; unsigned char KeyResult0 = 8; EX1 = 0; P_8255 = 0x89; bLine1 = 0; // 关外部中断//PC 口输入 //P3.2 作行输出while (i) {if ((PC_8255 & i) == 0) break; KeyResult0++; i >>= 1;}P_8255 = 0x80; PC_8255 = 0; bLine1 = 1;//8255 的 PA 、 PB 、PC 口全作输出口if (i){TH0 60;TL0 = 176;TR0 1; }KeyResult = KeyResult0;// 定时中断计数器初值// 定时 50ms// 清除中断 // 开外部中断//50ms 中断服务程序void INT_Timer0(void) interrupt 1{if (((KeyResult < 8) && !bLine0) || ((KeyResult >= 8) && !bLine1)){bKey = 1;}TR0 = 0;}void main(){char i;for (i = 0; i < 8; i++) buffer[i] = 0x10; // TR0 = 1;// bRefurbish = 1;while (1){if (bKey){bKey = 0; RefurbishData(); }Display();}}十、实验实施步骤1 .仔细阅读实验内容及要求,编写 C51 源程序。
嵌入式键盘控制实验
![嵌入式键盘控制实验](https://img.taocdn.com/s3/m/c386d5d8ec3a87c24028c4ec.png)
嵌入式系统键盘控制实验日期:报告分:一、实验目的1.学习键盘及LED 驱动原理。
2.掌握ZLG7289 芯片的使用方法。
二、实验内容通过ZLG7289 芯片驱动17 键的键盘和8 个共阴极LED,将按键值在LED 上显示出来。
三、实验步骤1.新建工程2.定义ZLG7289 寄存器(ZLG7289.h)#define ZLG7289_CS (0x20) //GPB5#define ZLG7289_KEY (0x10) //GPG43.编写ZLG7289 驱动函数图2-2 ZLG7289 复位图2-3 读取键值4.定义键盘映射表unsigned char KeyBoard_Map[]={4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值5.定义键值读取函数,流程图如图2-4 所示图2-4 键值读取函数6.编写主函数,将按键值在数码管上显示,流程图如图2-5 所示。
图2-5 主函数四、实验主要过程截图:添加LCD320.H和lcd320.c文件实验结果拍照:五、实验关键代码(有注释,最好有流程图)#include"uhal.h"#include"keyboard.h"#include"zlg7289.h"#include"44b.h"#include"LCD320.H"#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihostingextern int Zlg7289SIOBand;extern int Zlg7289SIOCtrl;int main(void){U32 key;ARMTargetInit(); //开发版初始化LCD_Init();LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式Uart_Printf("\nArm Target Init OK.");Zlg7289_Reset();//zlg7289复位while(1){ key=GetKey();//得到按键值if(key==1) LCD_printf("/ \n");if(key==2) LCD_printf("* \n");if(key==3) LCD_printf("- \n");if(key==4) LCD_printf("7 \n");if(key==5) LCD_printf("8 \n");if(key==6) LCD_printf("9 \n");if(key==7) LCD_printf("+ \n");if(key==8) LCD_printf("4 \n");if(key==9) LCD_printf("5 \n");if(key==10) LCD_printf("6 \n");if(key==11) LCD_printf("1 \n");if(key==12) LCD_printf("2 \n");if(key==13) LCD_printf("3 \n");if(key==14) LCD_printf("Enter \n");if(key==15) LCD_printf("0 \n");if(key==0) LCD_printf("NumLock \n");Delay(1);ZLG7289_ENABLE();//使zlg7289占有同步串口Delay(10);//延时WriteSDIO(ZLG7289_CMD_DATA0|0);//数码管以方式0译码,第一个数码管亮WriteSDIO(key%10);//显示个位Delay(3000);//延时if(key>9){//键值大于9显示十位WriteSDIO(ZLG7289_CMD_DATA0|1);//发送十位数据WriteSDIO((unsigned char)(key/10));Delay(1);WriteSDIO(ZLG7289_CMD_HIDE);//使一、二两位数码管显示WriteSDIO(3);}else{//键值小于10不显示十位WriteSDIO(ZLG7289_CMD_HIDE);//使个位数码管显示WriteSDIO(1);}ZLG7289_DISABLE();//zlg7289放弃同步串口控制权}return 0;}六、遇到的问题及解决方法每次做实验都是要改代码。
嵌入式系统开发实验五LED驱动实验
![嵌入式系统开发实验五LED驱动实验](https://img.taocdn.com/s3/m/d131c8c328ea81c758f578ce.png)
实验项目:实验五LED驱动实验实验类型:验证性指导老师:杜经纬实验地点:硬件实验室时间:2013年4月15日14:00-16:00一、实验目的:1、掌握Windows CE 6.0 流驱动程序架构以及流驱动的编写方法;2、学习如何在Windows CE系统下添加流驱动程序。
二、实验内容:1、编写Windows CE 6.0 下的LED驱动,控制相应LED灯的亮灭;2、编译添加了LED驱动的Windows CE系统工程,下载固化NK.bin,并在实验平台上运行LED控制应用程序,观看LED灯控制效果;3、认识Windows CE 6.0驱动开发中常用的配置文件。
三、实验方案设计:Windows CE驱动的功能就是在底层实现对硬件的操作,向上导出接口函数给操作系统和应用层。
从驱动功能来看,在软件上要完成的工作包含了如何操作硬件,如何导出接口函数。
通过前面的章节可以了解到,Windows CE的流驱动可以分为两层:MDD层和PDD层。
MDD层是与硬件平台无关的,向上层导出驱动接口给应用层调用;PDD层是与硬件平台相关的,在软件上就是操作硬件的代码层。
四、实验步骤:1)将光盘DISK2_PXA270\03-Codes\01-WinCE\01-BSP目录下的MINI270-IV文件夹复制到%_WINCEROOT%\PLATFORM\目录下。
在将光盘DISK2_PXA270\03-Codes\01-WinCE目录下的02-Application文件夹拷贝到D:\Embest目录下。
2)首先屏蔽掉原来的LED驱动。
把%_WINCEROOT%\PLATFORM\MINI270-IV\ SRC\DRIVERS\下的EduLed文件夹改名,改为EduLed_(当然你也可以改为其它名字,但不要带中文)。
图6-1-3 将原来的EduLed驱动目录改名3)在%_WINCEROOT%\PLATFORM\MINI270-IV\SRC\DRIVERS\下新建一个文件夹,该文件夹用来存放LED的驱动代码。
嵌入式LED实验
![嵌入式LED实验](https://img.taocdn.com/s3/m/9bdaab5cf7ec4afe04a1df2b.png)
石家庄铁道大学《嵌入式系统》实验报告--实验四 LED 驱动及控制实验实验者姓名:崔乐乐实验者学号:********同组人:孔维春实验者班级:信1201-2所在学院:信息科学与技术学院课程编号:L090211****:***报告完成日期:2015年4月 19 日1. 实验目的♦了解 ARM 设备外围电路结构与接口原理♦熟悉 Linux 系统下硬件驱动编程♦编程实现对嵌入式设备上 LED 灯的控制2. 实验内容♦阅读 UP-Magic6410 平台硬件文档,熟悉 ARM 处理硬件外围接口电路♦编程实现 UP-Magic6410 平台设备上 LED 驱动及应用测试程序3. 实验环境♦硬件:UP-Magic6410 型嵌入式实验平台,PC 机 Pentium 500 以上, 硬盘 40G 以上,内存大于 256M♦软件:Vmware Workstation +Fedora Core 8 + MiniCom/Xshell + ARM-LINUX 交叉编译开发环境4. 实验原理4.1 硬件接口原理♦ UP-Magic6410 魔法师实验套件 LED 硬件接口UP-Magic6410 魔法师实验套件上共有 5 个 LED 显示灯,分别接在 S3C6410X 处理器的 GPQ2、GPQ3、GPQ4、GPQ5、GPQ6 上。
5 个 LED 显示灯分别共阳极 3.3V 电压,因此相应 GPIO 低电平点亮,高电平熄灭。
如图 4.1.1 所示:♦ S3C6410 处理器 GPIO 寄存器S3C6410X 处理器的 GPIO 作为控制 I/O 要进行必要的设置才能对外设进行正确控制,此实验将相应 I/O 设置为输出模式,并向相应 I/O 数据寄存器进行写入数据便可控制 LED 的开关。
如下表 4.1.2 给出的 S3C6410X GPIO 寄存器配置:GPQ IO 寄存器列表:GPQ 配置寄存器:GPQ 数据寄存器:4.2 关键代码分析Linux 系统下,应用程序不可直接操作底层硬件寄存器,必须经过驱动层来完成对硬件的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《嵌入式系统设计》实验报告(2011-2012学年第2学期)实验三键盘及LED驱动实验—C语言实现方法一、实验目的1.学习键盘及LED驱动原理。
2.掌握ZLG7289芯片的使用方法。
二、实验内容通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上显示出来。
三、预备知识1.掌握在ARM SDT 2.5或ADS1.2集成开发环境中编写和调试程序的基本过程。
2.了解ARM应用程序的框架结构。
3.了解µC/OS-II多任务的原理。
四、实验设备及工具硬件:ARM嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上。
软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序五、实验原理ZLG7289A是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示﹑键盘接口的全部功能。
ZLG7289A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式。
此外,还具有多种控制指令,如消隐﹑闪烁﹑左移﹑右移﹑段寻址等。
ZLG7289A具有片选信号可方便地实现多于8位的显示或多于64键的键盘接口。
其特点如下:a.串行接口无需外围元件可直接驱动LED。
b.各位独立控制译码/不译码及消隐和闪烁属性。
c.(循环)左移/(循环)右移指令。
d.具有段寻址指令方便控制独立LED。
e.键盘控制器内含去抖动电路。
表2-5 引脚说明引脚名称说明1 ,2 VDD 正电源3 ,5 NC 悬空4 VSS 接地6 /CS 片选输入端,此引脚为低电平时,可向芯片发送指令及读取键盘数据7 CLK 同步时钟输入端,向芯片发送数据及读取键盘数据时,此引脚电平上升沿表示数据有效8 DATA 串行数据输入/输出端,当芯片接收指令时此引脚为输入端,当读取键盘数据时此引脚在读指令最后一个时钟的下降沿变为输出端9 /KEY 按键有效输出端,平时为高电平,当检测到有效按键时,引脚变为低电平10-16 SG-SA 段g—段a 驱动输出17 DP 小数点驱动输出18-25 DIG0-DIG7 数字0—数字7驱动输出26 OSC2 振荡器输出端27 OSC1 振荡器输入端28 /RESET 复位端ZLG7289A的控制指令分为二大类——纯指令和带有数据的指令:1.纯指令(1)复位(清除)指令,如表2-6所示:表2-6 复位指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 1 0 0当ZLG7289A收到该指令后,将所有的显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。
执行该指令后,芯片所处的状态与系统上电后所处的状态一样。
(2)测试指令,如表2-7所示:表2-7 测试指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 1 1 1 1 1该指令使所有的LED全部点亮,并处于闪烁状态,主要用于测试。
(3)左移指令,如表2-8所示:表2-8 左移指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 0 0 1使所有的显示自右向左(从第1位向第8位)移动一位(包括处于消隐状态的显示位),但对各位所设置的消隐及闪烁属性不变。
移动后,最右边一位为空(无显示)。
例如,原显示为1 2 3 4 5 6 7 8其中第2位…2‟和第4位…4‟为闪烁显示,执行了左移指令后,显示变为2 3 4 5 6 7 8第2位…3‟和第4位…5‟为闪烁显示。
(4)右移指令,如表2-9所示:表2-9 右移指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 0 0 0与左移指令类似,但所做移动为自左向右(从第8位向第1位)移动,移动后,最左边一位为空。
(5)循环左移指令,如表2-10所示:表2-10 循环左移指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 0 1 1与左移指令类似,不同之处在于移动后原最左边一位(第8位)的内容显示于最右位(第1位)。
在上例中执行完循环左移指令后的显示为2 3 4 5 6 7 8 1第2位…3‟ 和第4位…5‟为闪烁显示。
(6)循环右移指令,如表2-11所示:表2-11 循环右移指令格式D7 D6 D5 D4 D3 D2 D1 D01 0 1 0 0 0 1 0与循环左移指令类似,但移动方向相反。
2.带有数据的指令(1)下载数据且按方式0译码,其指令与数据格式如表2-12所示:表2-12 下载数据具按方式0译码的指令与数据格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 0 0 a2 a1 a0 DP X X X d3 d2 d1 d0其中X表示无影响。
命令由二个字节组成,前半部分为指令,其中a2,a1 ,a0 为位地址,具体分配如表2-13所示:表2-13 位地址a2 a1 a0 显示位0 0 0 1 0 0 1 2 0 1 0 30 1 1 41 0 0 5 1 0 1 6 1 1 0 7 1 1 1 8d0 ——d3为数据,收到此指令时,ZLG7289A按以下规则(译码方式0)进行译码,如表2-14所示:表2-14 译码方式0d0——d3 (十六d3 d2 d1 d0 7 段显示进制)00H 0 0 0 0 001H 0 0 0 1 102H 0 0 1 0 203H 0 0 1 1 304H 0 1 0 0 405H 0 1 0 1 506H 0 1 1 0 607H 0 1 1 1 708H 1 0 0 0 809H 1 0 0 1 90AH 1 0 1 0 -0BH 1 0 1 1 E0CH 1 1 0 0 H0DH 1 1 0 1 L0EH 1 1 1 0 P0FH 1 1 1 1 空(无显示)小数点的显示由DP位控制,DP=1时,小数点显示,DP=0,时小数点不显示。
(2)下载数据且按方式1 译码,其指令与数据格式如表2-15所示:表2-15 下载数据且按方式1 译码的其指令与数据格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 1 0 0 1 a2 a1 a0 DP X X X d3 d2 d1 d0 其中X表示无影响此指令与上一条指令基本相同,所不同的是译码方式,该指令的译码按表2-16进行:表2-16译码方式1d0——d3 (十六d3 d2 d1 d0 7 段显示进制)00H 0 0 0 0 001H 0 0 0 1 102H 0 0 1 0 203H 0 0 1 1 304H 0 1 0 0 405H 0 1 0 1 506H 0 1 1 0 607H 0 1 1 1 708H 1 0 0 0 809H 1 0 0 1 90AH 1 0 1 0 A0BH 1 0 1 1 B0CH 1 1 0 0 C0DH 1 1 0 1 D0EH 1 1 1 0 E0FH 1 1 1 1 F(3)下载数据但不译码,其指令与数据格式如表2-17所示:表2-17 下载数据但不译码的指令与数据格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 1 0 a2 a1 a0 DP A B C D E F G其中,a2,a1,a0 为位地址(参见“下载数据且译码”指令),A-G 和DP 为显示数据,分别对应7段LED数码管的各段。
数码管各段的定义如表2-18所示。
当相应的数据位为…1‟时,该段点亮,否则不亮。
(4)闪烁控制,如表2-18所示:表2-18 闪烁控制指令格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 0 1 0 0 0 d8 d7 d6 d5 d4 d3 d2 d1此命令控制各个数码管的消隐属性,d1——d8 分别对应数码管1——8,0=闪烁,1=不闪烁。
开机后,缺省的状态为各位均不闪烁。
(5)消隐控制,如表2-19所示:表2-19 消稳控制指令格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 1 1 0 0 0 d8 d7 d6 d5 d4 d3 d2 d1此命令控制各个数码管的消隐属性。
d1——d8 分别对应数码管1——8 ,1=显示,0=消隐。
当某一位被赋予了消隐属性后,ZLG7289A 在扫描时将跳过该位,因此在这种情况下无论对该位写入何值,均不会被显示,但写入的值将被保留,在将该位重新设为显示状态后,最后一次写入的数据将被显示出来。
当无需用到全部8个数码管显示的时候。
将不用的位设为消隐属性,可以提高显示的亮度。
注意:至少应有一位保持显示状态,如果消隐控制指令中d1——d8 全部为0,该指令将不被接受,ZLG7289A 保持原来的消隐状态不变。
(6)段点亮指令,如表2-20所示:表2-20 段点亮指令格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 1 1 1 0 0 0 0 0 X X d5 d4 d3 d2 d1 d0此为段寻址指令,作用为点亮数码管中某一指定的段,或LED 矩阵中某一指定的LED。
指令中,X=无影响;d0——d5 段,地址范围从00H——3FH,具体分配为:第1个数码管的G段地址为00H ,F段为01H …. …A 段为06H,小数点DP为07H,第2个数码管的G段为08H,F段为09H,… …,依此类推直至第8个数码管的小数点DP地址为3FH。
(7)段关闭指令,如表2-21所示:表2-21 段关闭指令格式D7 D6 D5 D4 D3 D2 D1 DD7 D6 D5 D4 D3 D2D1D01 1 0 0 0 0 0 0 X X d5 d4 d3 d2 d1 d0段寻址命令,作用为关闭(熄灭)数码管中的某一段,指令结构与…段点亮‟指令相同。
(8)读键盘数据指令,如表2-22所示:表2-22 读键盘数据指令格式D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 1 0 1 0 1 d7 d6 d5 d4 d3 d2 d1 d0该指令从ZLG7289A读出当前的按键代码。
与其它指令不同,此命令的前一个字节0001010B为微控制器传送到ZLG7289A的指令,而后一个字节d0——d7则为ZLG7289A返回的按键代码,其范围是0——3FH(无键按下时为0xFF)。