📄 ocm4x8c.c
字号:
//ocm4x8c驱动
//孙新虎
//20050109
#include "includes.h"
void lcd_power_on(void) //打开LCD电源
{
PORTB &= ~(_BV(LCD_E) | _BV(LCD_RS) | _BV(LCD_RW));
DDRB |= _BV(LCD_E) | _BV(LCD_RS) | _BV(LCD_RW);
LCD_POWER_ON();
}
void lcd_power_off(void) //关闭LCD电源
{
DDRB &= ~(_BV(LCD_E) | _BV(LCD_RS) | _BV(LCD_RW));
PORTB &= ~(_BV(LCD_E) | _BV(LCD_RS) | _BV(LCD_RW));
DDRA &= 0x0F;
LCD_POWER_OFF();
time_out = 0;
}
void lcd_chk_busy(void) //测试忙
{
DDRA &= 0x0F;
PORTA |= 0xf0;
CLR_RS();
SET_RW();
SET_E();
for(INT16U i=0xffff;i;i--)
{
if(bit_is_clear(PINA,PA7))
break;
}
CLR_E();
asm volatile ("nop");
SET_E();
asm volatile ("nop");
CLR_E();
CLR_RS();
CLR_RW();
}
void write_byte(INT8U data)
{
DDRA &= 0x0f;
PORTA &= 0x0f;
PORTA |= data & 0xf0;
DDRA |= 0xf0;
SET_E();
asm volatile ("nop");
CLR_E();
asm volatile ("nop");
DDRA &= 0x0f;
PORTA &= 0x0f;
PORTA |= data << 4;
DDRA |= 0xf0;
SET_E();
asm volatile ("nop");
CLR_E();
CLR_RW();
CLR_RS();
}
void lcd_write_data(uint8_t data) //向LCD写入数据
{
lcd_chk_busy();
SET_RS();
CLR_RW();
write_byte(data);
}
void lcd_write_command(uint8_t command) //向LCD写入命令
{
lcd_chk_busy();
CLR_RS();
CLR_RW();
write_byte(command);
}
INT8U_FLASH mycursor[] =
{
0x00,0x00,0x01,0x00,0x02,0x80,0x04,0x80,0x09,0x00,0x73,0xFE,0x80,0x01,0x80,0xFE,
0x80,0x10,0x80,0xE0,0x80,0x20,0xC1,0xE0,0x30,0x40,0x0F,0x80,0x00,0x00,0x00,0x00
};
void lcd_init(void) //LCD初始化
{
lcd_write_command(0x20); //4位接口,基本指令集
lcd_write_command(0b110); //点设定,光标右移,DDRAM为读状态
lcd_write_command(0b1100); //整体显示,光标不显示,光标位置不反白闪烁
lcd_write_command(0x01); //DDRAM清零,DDRAM地址计数器到00H
lcd_write_command(0x40);
INT8U *p = (INT8U *)mycursor;
for(INT8U i=0;i<32;i++)
lcd_write_data(pgm_read_byte(p++));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -