
关于橘宴GPIO输出的赋值可以使用两种方法,
方法A:逐个配置法,优点是不会影响到其它的GPIO口,缺点是 *** 作比较繁琐。
方法B:ODR设置法,优点是 *** 作轻松,缺点是需要硬件电路作配合。
下面我们详细描述这两种方法:
方法A:所谓逐个配置法, 就是对需禅闭要输出数据的IO口线逐个配置,
需要圆袭银输出为1的IO口使用GPIOx->BSS = 1 <<N(N表示第N根线,如PA9, N值为9)
需要输出为0的IO口使用GPIOx->BRSS = 1 <<N
使用如下语句可以完成
//to do 先将输出口配置为输出功能
for( i = starti <endi++ )
{
if( value &0x01 )
{ GPIOx->BSS = 1 <<i}
else
{ GPIOx->BRSS = 1 <<i}
}
方法B: ODR配置法,可以直接使用 GPIO->ODR = value <<N给对应的IO口进行输出 *** 作。
但是此时在硬件上要保证:
1. 该功能口(如GPIOA)上的其余的IO口不作为普通的IO输出口使用(因为是键盘扫描,当列输出的时候,行应当是输入;同理,当列输入时,行应当是输出)
2. 行列之外的GPIO口,要么是普通的IO输入口,要么是功能口。功能口就是UART、USB、PWM、ADC等,对GPIO的ODR进行 *** 作时,不会对功能口产生影响。
以上第2条是对第1条的详细解释。
总结:如果在硬件上可以满足方法B的应用条件,建议优先采用方法B。
在其它一些需要使用并行输出,如并口液晶、NandFlash等应该的时候,也可以考虑使用方法B。
如果是8位并口,你可以把8位数据线安排在某口的低8位,4个哗拦扰控制线安排在同一个口的高8位上即可,方便编程:void LCD12684_Wdat(u8 dat)
{
while(LCD12864_busy())//忙检测
LCD_RS(1)
LCD_RW(0)
LCD_EN(0)
delay_ms(2)
GPIOF->ODR=((GPIOF->ODR &0xfff3)|((dat &0x03) <<2))
//将数据的最后两位左移2位后赋给GPIOF的三四位
GPIOD->ODR=((GPIOD->ODR &0xff03)|((dat &0xfc) <乱旦<8))
//将数据的前6位左移8位后赋衡渣给GPIOD的11到16位
delay_ms(2)
LCD_EN(1)
delay_ms(2)
LCD_EN(0)
}
input clkinput rst
input [7:0] data_in
output [7:0] data_out
reg [7:0] data
wire data_out
always @ (posedge clk or negedge rst)
if (~rst)
data <= data_in
else
data <= data<<1// 此处先移空塌高位核空,后低位; 如果先低后高改为:data <= data>>1
assign data_out = data[7]// 此处先移高位,后低位;改亏瞎 如果先低后高改为:data[0]
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)