📄 12232.c
字号:
#include <iom32v.h>
#include <macros.h>
#include "1011.h"
#define SS 0//LCD片选(串行) 0:禁止 1:允许
#define MOSI 5//LCD输入串行数据(串行)
#define SCK 7//LCD输入串行脉冲(串行)
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
;
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void port_init(void)
{
DDRB = 0;//设置B口全为输入
DDRC = 0xff;//设置C口全为输入
DDRD = 0;//设置D口全为输入
PORTB = 0xff;//设置B口全部上拉
PORTC = 0xff;//设置C口全部上拉
PORTD = 0xff;//设置D口全部上拉
}
void spi_send(unsigned char data)
{
SPDR = data; // 启动spi
while(!(SPSR & (1 << SPIF))); // 等待传输结束
}
//---------------------------------------------------
// 发送8位LCD控制命令
//--------------------------------------------------
void lcd_send_com(unsigned char com)
{
PORTC |= (1 << SS); //SS=1,启动SPI
spi_send(0xf8); //发送LCD控制命令
spi_send(com & 0xf0); //发送高4位LCD控制命令
spi_send(com << 4); //发送低4位LCD控制命令
PORTC &= ~(1 << SS); //SS=0,关闭SPI
if (com == 0x01) delay_nms(80); //1.6mS
else delay_nus(200); //st7920要求等待72uS
}
//--------------------------------------------------------
// 发送8位LCD显示数据
//-------------------------------------------------------
void lcd_send_data(unsigned char data)
{
PORTC |= (1 << SS); //SS=1,启动SPI
spi_send(0xfa); //发送LCD显示数据
spi_send(data & 0xf0); //发送高4位LCD显示数据
spi_send(data << 4); //发送低4位LCD显示数据
PORTC &= ~(1 << SS); //SS=0,关闭SPI
delay_nus(200); //st7920要求等待72uS
}
//---------------------------------------------------
// LCD初始化设置
//---------------------------------------------------
void lcd_init(void)
{
delay_nms(10); //上电等待延时1000Ms
spi_init(); //SPI初始化
lcd_send_com(0b00100000); //发送4位控制命令
lcd_send_com(0b00000100); //发送进入点命令
lcd_send_com(0b00001100); //发送开显示关光标命令
lcd_send_com(0b00000001); //发送清除显示命令
lcd_send_com(0b10000000); //发送设定DDRAM地址0x00命令
}
//------------------------------------------
//定位
//----------------------------------------
unsigned char set_lcd_position(unsigned char row, unsigned char col)
{
if ((row < 2) && (col < 8)) //汉字字符为2行7.5列(汉字必须偶数对齐)
{
lcd_send_com(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令
return 1;//成功返回
}
else
return 0;//失败返回
}
//---------------------------------------------------
//显示字符串
//---------------------------------------------------
void lcd_display_string(unsigned char * string)
{
while(*string) lcd_send_data(*string ++);
}
//------------------------------------------------------------------------------------
//在指定位置显示
//------------------------------------------------------------------------------------
void lcd_display(unsigned char row, unsigned char col, unsigned char * string)
{
if (set_lcd_position(row, col))
{
lcd_display_string(string);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -