lcd12864.c
来自「我写的针对lpc2141的ucos源码」· C语言 代码 · 共 226 行
C
226 行
#include <LPC214X.h>
#include <string.h>
#include "LCD12864.h"
#include "delay.h"
#include "type.h"
#define DI 0x01<<11
#define RW 0x01<<12
#define EN 0x01<<13
#define PSB 0X01
#define BF 0x80
#define FUNCTION_SET 0X30
#define FUNCTION_EXT 0X34
#define DISPLAY_ON 0X0C
#define DISPLAY_OFF 0X08
/* P1.16~P1.23*/
#define FIO1DIR2 (*((volatile unsigned char *) 0x3FFFC022))
#define FIO1MASK2 (*((volatile unsigned char *) 0x3FFFC032))
#define FIO1PIN2 (*((volatile unsigned char *) 0x3FFFC036))
#define FIO1SET2 (*((volatile unsigned char *) 0x3FFFC03A))
#define FIO1CLR2 (*((volatile unsigned char *) 0x3FFFC03E))
/* P1.24~P1.32*/
#define FIO1DIR3 (*((volatile unsigned char *) 0x3FFFC023))
#define FIO1MASK3 (*((volatile unsigned char *) 0x3FFFC033))
#define FIO1PIN3 (*((volatile unsigned char *) 0x3FFFC037))
#define FIO1SET3 (*((volatile unsigned char *) 0x3FFFC03B))
#define FIO1CLR3 (*((volatile unsigned char *) 0x3FFFC03F))
static uint16 gbuffer[512];
static void draw_point(uint16 position,uint8 i);
void lcd_check_busy()
{
while((lcd_read_status()&BF)==BF) {;}
}
void lcd_send_command(uint8 command)
{
FIO1PIN2=command;
IO0CLR=DI;//DI=L,RW=L
IO0CLR=RW;
//delay(10);
IO0SET=EN;
//delay(10);
IO0CLR=EN;
//delay(10);
}
void lcd_write_data(uint8 data)
{
FIO1PIN2=data;
IO0SET=DI;
IO0CLR=RW;
//delay(10);
IO0SET=EN;
delay(1); //don't remove this delay
IO0CLR=EN;
//delay(10);
}
uint8 lcd_read_status()
{
uint8 status;
FIO1DIR2=0X00;//数据口设为输入
IO0CLR=DI;
IO0SET=RW;//DI=L,RW=H;
//delay(1);
IO0SET=EN;
//delay(1);
status=FIO1PIN2;
IO0CLR=EN;
FIO1DIR2=0XFF;//数据口重新设为输出
//delay(10);
return status;
}
void lcd_init()
{
SCS=0x02;//P1使用增强IO模式
//液晶所用端口功能选择
//方向选择
IO0DIR|=DI|RW|EN; //控制线端口初始化为输出
IO0CLR=DI|RW|EN;
FIO1DIR2|=0XFF; //数据接口初始化为输出
delay(100*1000);
FIO1DIR3|=PSB; //片选端口初始化为输出
FIO1SET3|=PSB; //并行方式
lcd_send_command(FUNCTION_SET);
delay(80*1000);
//lcd_check_busy();
lcd_send_command(FUNCTION_SET);
delay(80*1000);
lcd_send_command(FUNCTION_SET);
delay(80*1000);
lcd_send_command(FUNCTION_SET);
lcd_check_busy();
lcd_send_command(DISPLAY_ON);
lcd_check_busy();
lcd_send_command(0x01);//清屏
lcd_check_busy();
lcd_send_command(0x06);//输入模式
lcd_check_busy();
lcd_send_command(0x02);//set home
lcd_check_busy();
/**/
}
void fill_screen()
{
uint8 v,h;
SC(0x34);
for(v=0X80;v<0xA0;v++) {
SC(v);//垂直坐标
SC(0x80);//水平坐标
for(h=0;h<16;h++) {
WD(0xFF);
WD(0xFF);
}
}
SC(0x36);
}
void clean_screen()
{
uint8 v,h;
SC(0x34);
for(v=0X80;v<0xA0;v++) {
SC(v);//垂直坐标
SC(0x80);//水平坐标
for(h=0;h<16;h++) {
WD(0x00);
WD(0x00);
}
}
SC(0x36);
}
void lcd_update_screen()
{
uint8 v,h;
SC(0X34);
for(v=0;v<32;v++) {
SC(v+0x80);
SC(0X80);
for(h=0;h<16;h++) {
WD(gbuffer[16*v+h]>>8);
WD(gbuffer[16*v+h]);
}
}
SC(0X36);
}
void update_gbuffer(uint16 *result)
{
uint8 i,j,n;
memset(gbuffer,0,sizeof(gbuffer));
for(i=0;i<127;i++) {
draw_point(result[i],i);
if( (result[i]>result[i+1]) && (n=(result[i]-result[i+1]))>1 ) {
for(j=1;j<=n/2;j++) {
draw_point(result[i]-j,i);
draw_point(result[i+1]+j,i+1);
}
}
else if ( (result[i]<result[i+1]) && (n=(result[i+1]-result[i]))>1 ) {
for(j=1;j<=n/2;j++) {
draw_point(result[i]+j,i);
draw_point(result[i+1]-j,i+1);
}
}
/* offset=15-i%16;
if(result[i]>=32) {
y=63-result[i];
x=i/16;
} else {
y=31-result[i];
x=i/16+8;
}
gbuffer[16*y+x]|=(uint16)0x0001<<offset;
*/
}
draw_point(result[127],127);
}
static void draw_point(uint16 position,uint8 i)
{
uint8 offset,x,y;
offset=15-i%16;
if(position>=32) {
y=63-position;
x=i/16;
} else {
y=31-position;
x=i/16+8;
}
gbuffer[16*y+x]|=(uint16)0x0001<<offset;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?