|  | 
 
| Learn lumit Step 12 :  四位拨码开关实验 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 这一小节我们着重讲解四位拨码开关的驱动原理和方法。从硬件设计上,拨码开关
 类似与 led 的实现,它直接使用了 PIO 0, 1, 2, 3 ,通过设置 PIO 的方向为输入,
 从而从内部 IO 数据寄存器中得到当前的拨码状态。
 
 首先我们用图示说明硬件连接情况,同时 dip4_open 初始化代码也不难理解。
 
 /*
 ; hardware connection
 ; PIO0         PIO1         PIO2         PIO3        (gpio)
 ; 1          2           3           4         (dip4)
 ; so output value = 0x0000000f = (0b0000 0000  0000 0000  0000 0000  0000 1111)
 */
 
 /* set dip4 related gpio */
 int dip4_open( void )
 {
 // set gpio's direction: set IOPMOD register mode bit to 0 = input
 IOPMOD = IOPMOD & (~0x0000000F);
 
 return 0;
 }
 
 在驱动程序 dip4_driver 中,作为一个标准的输入设备,我们仅仅实现了它的读操作。
 
 /* get dip4 status */
 int dip4_read( char * buf, int count )
 {
 int i = 0;
 int dip4_value;
 
 // the count has exceeds the count of our board
 if( count > DIP4_NUM )
 return -1;
 
 // get low-4-bits of IOPDATA
 dip4_value = IOPDATA & 0x0F;
 
 for( i = 0; i < count; i++ )
 buf = (dip4_value & ( 1 << i ))? 1 : 0;
 
 return count;
 }
 
 在编程接口 dip4_api 中,我们模仿 led 的实现方法,给出了 dip4_get_value 接口实现:
 
 /* get 4 dip4s status to low-4-bits of hex value */
 int dip4_get_value( void )
 {
 char buf[DIP4_NUM];
 int value = 0;
 int i;
 
 // read the dip status from dip4 driver
 dip4_read( buf, DIP4_NUM );
 
 for( i = 0; i < DIP4_NUM; i++ )
 value = value | (buf << i);
 
 // return the dip4 status in low-bits of value
 return value;
 }
 
 一个简单的例子在 dip4_test 中,不过它仅仅是一个读接口的测试,没有输出设备来显示读出
 的状态值,不过我们可以通过 第九节中 使用 JTAG 调试 的方法来观察读出的 value 值。
 
 /* test dip4 api */
 int dip4_test( void )
 {
 int value;
 
 dip4_init();
 
 while(1)
 {
 value = dip4_get_value();
 }
 
 return 0;
 }
 
 在下面的综合实验一中,我们将 led / seg7 / dip4 这三个设备联系起来,用 dip4 作为输入,
 led 和 seg7 作为输出,这样就可以看出实际的效果了。
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册  |