打印
[STM32]

Spi1_Txd(0x401<<5); // 开振荡器,为什么需要左移5位?求大神赐教。。

[复制链接]
1621|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
骑乌龟上课|  楼主 | 2014-5-19 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SPI 发送子程序如下:
// SPI发送
// 入口参数:data-发送数据
void Spi1_Txd(int data)
{
GPIOA_BRR = 0x0010; // PA4 = 0
while(!(SPI1_SR & 0x02)); // 发送数据寄存器不空等待
SPI1_DR = data; // 发送数据
while(SPI1_SR & 0x80); // 忙等待
GPIOA_BSRR = 0x0010; // PA4 = 1
}


利用SPI进行LCD初始化的子程序如下:
// LCD初始化
void Lcd_Init(void)
{
Spi1_Init(); // SPI1初始化
Spi1_Txd(0x42a<<5); // 模块初始化
Spi1_Txd(0x418<<5); // 内部振荡器
Spi1_Txd(0x401<<5); // 开振荡器
Spi1_Txd(0x403<<5); // 开显示器
}

相关帖子

沙发
骑乌龟上课|  楼主 | 2014-5-19 21:53 | 只看该作者
补齐:
(1)写模块初始化命令 100 0010 1001
(2)定义内部RC振荡器工作 100 0001 1000
(3)开振荡器 100 0000 0001
(4)开显示器 100 0000 0011

为什么在SPI发送数据的时候传入的数据要向左移了5位呢???请大神赐教。。



使用特权

评论回复
板凳
airwill| | 2014-5-20 14:22 | 只看该作者
为什么要?

问题不在 STM32 上, 应该看你的 LCD 的手册, 通过 spi 控制协议来判断.

使用特权

评论回复
地板
骑乌龟上课|  楼主 | 2014-5-20 21:05 | 只看该作者
1、液晶显示模块简介
开发板上使用的LCM046 液晶显示模块是4 位多功能通用型8 段(8.8.8.8)液晶显示模块,
内含看门狗(WDT)定时器,2 种频率的蜂鸣驱动电路,内置显示RAM,可显示任意字段笔划,
3-4 线串行接口,工作电压2.4~5.2V,如图2.1 所示。
图2.1 LCM046 液晶显示模块
显示模块的引脚说明如表2.1 所示。
表2.1 显示模块引脚说明
引脚 功能 方向 说 明 引脚 功能 方向 说 明
1 /CS 输入 片选,内部上拉 2 /RD 输入 读,内部上拉
3 /WR 输入 写,内部上拉 4 DA 双向 数据,内部上拉
5 GND - 地 6 VLCD 输入 对比度调整
7 VDD 输入 电源 8 IRQ 输出 定时器
9 BZ 输出 蜂鸣器正极 10 /BZ 输入 蜂鸣器负极
显示模块的写操作时序如图2.2 所示。
图2.2 显示模块写操作时序
DA 1 0 C/D 命令代码/地址数据
/CS
/WR
·8·
写命令格式为:100 命令代码(C7-C0:8 位)0,共12 位
写数据格式为:101 地址(A5-A0:6 位)数据(D0-D3:4 位),共13 位
101 地址(A5-A0:6 位)数据(n*4 位)(n=1-8),共13-41 位
常用命令代码如表2.2 所示,地址数据如表2.3 所示。
表2.2 显示模块常用命令代码
命令代码 功 能 命令代码 功 能
0000 0000 关振荡器 0000 0001 开振荡器
0000 0010 关显示器 0000 0011 开显示器
0001 0100 定义外部晶体振荡器工作 0001 1000 定义内部RC 振荡器工作
0010 1001 模块初始化
表2.3 显示模块地址数据
地 址 数 据 数 据
A5-A0 D3 D2 D1 D0
地 址
A5-A0 D3 D2 D1 D0
000000 COL 1E 1F 1A 000001 1D 1C 1G 1B
000010 DP1 2E 2F 2A 000011 2D 2C 2G 2B
000100 DP2 3E 3F 3A 000101 3D 3C 3G 3B
000110 DP3 4E 4F 4A 000111 4D 4C 4G 4B
模块上电后软件应延时200ms以上再初始化模块,初始化模块的步骤是:
(1)写模块初始化命令 100 0010 1001
(2)定义内部RC振荡器工作 100 0001 1000
(3)开振荡器 100 0000 0001
(4)开显示器 100 0000 0011
为了实现低功耗工作,每次读写操作后应将/CS、/RD、/WR 和DA 置高电平。
2、液晶显示模块程序设计
液晶显示模块程序设计的基础是写子程序:
// LCD写子程序
// 入口参数:data-写数据,bit-数据位数
void Lcd_Write(int data, int bit)
{
int m, n;
GPIOC_BRR = 0x1000; // LCD_CS = 0
for(m=bit-1; m>=0; m--)
{
for(n=0; n<10; n++); // 延时
GPIOC_BRR = 0x0800; // LCD_WR = 0
for(n=0; n<10; n++);
if(data & (1<<m))
GPIOC_BSRR = 0x0400; // LCD_DA = 1
else
GPIOC_BRR = 0x0400; // LCD_DA = 0
·9·
for(n=0; n<10; n++);
GPIOC_BSRR = 0x0800; // LCD_WR = 1
}
GPIOC_BSRR = 0x1400; // LCD_CS = 1, LCD_DA = 1
}
LCD初始化子程序如下:
// LCD初始化
void Lcd_Init(void)
{
RCC_APB2ENA |= 0x10; // 允许GPIOC时钟
GPIOC_CRH |= 0x00055500; // PC12-10通用开漏输出
GPIOC_ODR |= 0x1C00; // PC12-10输出高电平
Lcd_Write(0x42a<<1, 12); // 模块初始化
Lcd_Write(0x418<<1, 12); // 内部振荡器
Lcd_Write(0x401<<1, 12); // 开振荡器
Lcd_Write(0x403<<1, 12); // 开显示器
}
LCD显示处理子程序如下:
// LCD显示处理
// 入口参数:*data-数据指针
void Lcd_Proc(char *data)
{
char lcd_code[16]= // 显示编码
{ // AFE.BGCD
0xeb, // 11101011 0
0x0a, // 00001010 1
0xad, // 10101101 2
0x8f, // 10001111 3
0x4e, // 01001110 4
0xc7, // 11000111 5
0xe7, // 11100111 6
0x8a, // 10001010 7
0xef, // 11101111 8
0xcf, // 11001111 9
0xee, // 11101110 A
0x67, // 01100111 B
0xe1, // 11100001 C
0x2f, // 00101111 D
0xe5, // 11100101 E
0xe4 // 11100100 F
};
·10·
Lcd_Write((5<<10)+(0<<4)+(lcd_code[data[0]]>>4)+data[1], 13);
Lcd_Write((5<<10)+(1<<4)+(lcd_code[data[0]]&0xf), 13);
Lcd_Write((5<<10)+(2<<4)+(lcd_code[data[2]]>>4)+data[3], 13);
Lcd_Write((5<<10)+(3<<4)+(lcd_code[data[2]]&0xf), 13);
Lcd_Write((5<<10)+(4<<4)+(lcd_code[data[4]]>>4)+data[5], 13);
Lcd_Write((5<<10)+(5<<4)+(lcd_code[data[4]]&0xf), 13);
Lcd_Write((5<<10)+(6<<4)+(lcd_code[data[6]]>>4)+data[7], 13);
Lcd_Write((5<<10)+(7<<4)+(lcd_code[data[6]]&0xf), 13);
}
LCD显示处理子程序的调用方法如下:
// 定义显示数据数组 COL DP1 DP2 DP3
char lcd_data[8] = {1, 0, 2, 0, 3, 0, 4, 0};
Lcd_Proc(lcd_data); // LCD显示处理
计时程序段如下:
if((++sec & 0xf) == 0xa) // 2-10进制调整
sec += 6;
if(sec == 0x60) // 1分钟时间到
{
sec = 0;
if((++min & 0xf) == 0xa) // 2-10进制调整
min += 6;
if(min == 0x60) // 1小时时间到
min = 0;
}

使用特权

评论回复
5
骑乌龟上课|  楼主 | 2014-5-20 21:06 | 只看该作者
不会看呀  求赐教。。。以上是液晶屏显示部分

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

52

帖子

1

粉丝