实验三:数码管与键盘控制
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IICSTAT (0x54000004)
[0]: IIC-bus last-received bit status flag
0: Last-received bit is 0 (ack was received) 1: … (ack was not received)
实验三任务
看教程理解示例代码 在开发板上跑通示例代码 编程实现:把键盘按键次数显示在数码 管上 提交实验报告
连接电路
连接电路
连接图
IICSDA S3C2410 IICSCL ZLG7290
...
S3C2410通过IIC向ZLG7290写入一个8位编码即可控制数码管的显示
编程实现——初始化
由于通过IIC向控制芯片写数据,所以必须初始化IIC
void iic_init_8led(void) { 有疑问吗? f_nGetACK = 0; 难道GPIO端口E的14、15 // Enable interrupt 引脚不用指定IIC功能? rINTMOD = 0x0; rSRCPND = rSRCPND; // clear all interrupt rINTPND = rINTPND; // clear all interrupt rINTMSK &= ~BIT_IIC; pISR_IIC= (unsigned)iic_int_8led; // Initialize iic rIICADD = 0x10; // S3C2410X slave address rIICCON = 0xef; // Enable ACK, interrupt, set IICCLK=MCLK/512 rIICSTAT= 0x10; // Enable TX/RX }
键盘控制
键盘扫描阵列
+5V
行 (输出端口)
一个瞬时接触 开关(按钮)放置 在每一行与线一列 的交叉点。
B1 1 2 3
B2 4 B3 5 6
7
列 (输入端口)
8
9
B1 B2 B3
键盘电路设计原理
读取键值的方法
中断式
键盘按下时产生一个外部中断通知CPU,并由中断处理程 序通过不同的地址读取数据线上的状态,判断哪个按键被 按下。 对键盘上的某一行发送低电平,其他为高电平,然后读取 列值,若列值中有一位是低,表明该行与低电平对应列的 键被按下。否则扫描下一行。 先将所有行扫描线输出低电平,读列值,若列值有一位是 低,表明有键按下;接着所有列扫描线输出低电平,再读 行值。根据读到的值组合就可以查表得到键码。
示例——向从设备发送数据
void iic_write_8led(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData) { f_nGetACK = 0; // Send control byte rIICDS = unSlaveAddr; // 0x70 rIICSTAT = 0xf0; // Master Tx,Start 11110000 while(f_nGetACK == 0); _nGetACK = 0; // Send address rIICDS = unAddr; rIICCON = 0xef; // Resumes IIC operation. 11101111 while(f_nGetACK == 0); f_nGetACK = 0; // Wait ACK // Send data rIICDS = ucData; rIICCON = 0xef; // Resumes IIC operation. while(f_nGetACK == 0); f_nGetACK = 0; // Wait ACK // End send rIICSTAT = 0xd0; // Stop Master Tx condition rIICCON = 0xef;// Resumes IIC operation. delay(5); // Wait until stop condtion is in effect.
实验三 数码管与键盘控制
IIC总线接口
IIC (I2C)概述
S3C2410处理器支持一个多主IIC串行总线接口,用于 连接微控制器及其外围设备 两根串行线
一根专用串行数据线SDA 一根串行时钟线SCL
每个连接到总线的器件根据唯一的地址来识别 传输数据的设备间是简单的主从关系 两个或多个器件同时发起数据传输时,可以通过冲突 检测和仲裁来防止数据被破坏 数据传输位速率在标准模式下可达100kbit/s,在快速 模式下可达400kbit/s,在高速模式下可达3.4Mbit/s 发送到SDA上的每个数据必须是8位的
键值寄存器(Key) 地址01H,复位值00H。Key 表示被压按键的键值。当Key=0 时,表 示没有键被压按 连击次数计数器(RepeatCnt) 地址02H,复位值00H 。0表示单击键; 大于0 表示键的连击次数。 功能键寄存器(FunctionKey) 地址03H,复位值0FFH。FunctionKey 对应位的值=0 表示对应功能 键被压按。 命令缓冲区(CmdBuf0~CmdBuf1) 地址07H~08H,复位值00H~00H。用于传输指令。 闪烁控制寄存器(FlashOnOff) 地址0CH,高4 位表示闪烁时亮的时间,低4 位表示闪烁时灭的时间 扫描位数寄存器(ScanNum) 地址0DH,复位值7。用于控制最大的扫描显示位数 显示缓存寄存器(DpRam0~DpRam7) 地址10H~17H,复位值00H~00H。缓存中位置1表示该像素亮
示例
中断处理
void __irq keyboard_int(void) { ClearPending(BIT_EINT1); g_nKeyPress = 1; }
示例
读取键值
while(g_nKeyPress == 0); iic_read_keybd(0x70, 0x1, &ucChar);
[1]: address zero status flag [2]: address-as-slave status flag [3]: arbitration status flag [4]: serial output [5]: start/stop condition [6-7]: mode selection
IIC总线接口(1)
4种操作模式
主发送器模式 主接收器模式 从发送器模式 从接收器模式
IIC总线接口(2)
IIC总线接口空闲时通常处于从模式 起始条件
当SCL保持高电平时,一个SDA下降沿初始 化一个起始条件
停止条件
当SCL保持高电平时SDA的一个上升沿产生 一个停止信号
编程实现——数码管显示
void led8_test(void) { int i, j, k; iic_init_8led(); for(;;) { for(j=0; j<10; j++) { for(i=0; i<8; i++) { k = 9-(i+j)%10; iic_write_8led(0x70, 0x10+i, f_szDigital[k]); //write to DpRam0~DpRam7 of ZLG7290 } delay(10000); }}}
IIC总线接口(3)
IIC总线接口(4)
(主设备)数据发送过程
产生起始信号 发送从设备地址(即寻找通信对象) 接收ACK信号(表明从设备已连接到总线) 发送8位数据 接收ACK 产生结束信号
IIC总线接口(5)
IIC总线接口(6)
IIC总线接口(7)
IIC总线接口(8)
实验三数码管与键盘控制iic总线接口s3c2410处理器支持一个多主iic串行总线接口用于连接微控制器及其外围设备两根串行线一根专用串行数据线sda一根串行时钟线scl每个连接到总线的器件根据唯一的地址来识别传输数据的设备间是简单的主从关系两个或多个器件同时发起数据传输时可以通过冲突检测和仲裁来防止数据被破坏数据传输位速率在标准模式下可达100kbits在快速模式下可达400kbits在高速模式下可达34mbits发送到sda上的每个数据必须是iic总线接口主发送器模式主接收器模式从发送器模式从接收器模式iic总线接口iic总线接口空闲时通常处于从模式起始条件scl保持高电平时一个sda下降沿初始化一个起始条件scl保持高电平时sda的一个上升沿产生一个停止信号iic总线接口iic总线接口产生起始信号发送从设备地址即寻找通信对象接收ack信号表明从设备已连接到总线发送位数据接收ack产生结束信号iic总线接口iic总线接口iic总线接口iic总线接口iic相关寄存器总线控制寄存器iiccon总线控制状态寄存器iicstat总线txrx移位寄存器iicds总线地址寄存器iicaddiiccon0x5400000003
IICADD (0x54000008)
[1-7]: slave address [0]: not mapped
IICDS (0X500000C)
[0-7]: 8-bit data
示例——IIC初始化
void iic_init_8led(void) { f_nGetACK = 0; // Enable interrupt rINTMOD = 0x0; rSRCPND = rSRCPND; // clear all interrupt rINTPND = rINTPND; // clear all interrupt rINTMSK &= ~BIT_IIC; pISR_IIC= (unsigned)iic_int_8led; // Initialize iic rIICADD = 0x10; // S3C2410X slave address rIICCON = 0xef; // Enable ACK, interrupt, set IICCLK=MCLK/512 rIICSTAT= 0x10; // Enable TX/RX }
IIC相关寄存器
总线控制寄存器,IICCON 总线控制/状态寄存器,IICSTAT 总线Tx/Rx移位寄存器,IICDS 总线地址寄存器,IICADD
IICCON (0x54000000)
[0-3]: IIC-bus transmit clock frequency [4]: IIC-BUS TX/RX interrupt pending flag [5]: TX/RX interrupt [7]: ack generation
扫描法
反转法
IIC读取键值
ZLG7290连接键盘 由ZLG7290实现键盘按键的检测,并保 存在其中的键值寄存器(0X01)中 S3C2410通过IIC接口从ZLG7290取得按 键数据
键盘中断信号,IICSDA IICSCL INT GPIO引脚须功能设置
ZLG7290 (slave address =70H )
数码管显示
结构
由8个发光二极管组成源自“日”字加上右下角的小数点
类型
共阳极
8根二极管阳极连在一起 8根二极管阴极连在一起
共阴极
工作原理
低电平信号点亮二极管 高电平信号熄灭二极管 8个二极管信号可用8位二进制来表示
数码管显示
开发板中0~9的表示: 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6