📄 main.c
字号:
/******************************************************************************************
Copyright (c) 2007 ESL of CCNU
--------------File Info-------------------------------------------------------------------------------
File name: lcd_display_driver.c
Last modified Date: 2007-07-16
Last Version: 1.1
Descriptions: 1.KM12232F的C51驱动程序 同时适用于KM12232H01/KM12864-12等
2.工作于串行方式
3.使用的是KM12864-12 V4.0显示板
------------------------------------------------------------------------------------------------------
Modified by: lzz(炜烨兴电子有限公司)
Modified date: 1899-12-30
Version: 1.0
Descriptions: 原始版本
------------------------------------------------------------------------------------------------------
Modified by: ILOVEMAGGIE
Modified date: 2007-07-16
Version: 1.1
Descriptions: 针对飞利浦LPC2131的特点进行了相应的修改
------------------------------------------------------------------------------------------------------
Modified by: ILOVEMAGGIE
Modified date: 2008-09-4
Version: 1.2
Descriptions: 需要实现的功能包括:
1.在指定位置描点(实点,虚点,取反)
2.指定坐标到指点坐标之间画线(实线,虚线)
********************************************************************************************************/
#include "config.h"
/********************************************************************************************************/
#define LCD_HALF_CLOCK_CYCLE 5 //lcd显示时钟周期的一半大小 通过改变它用来控制 LCD_CLK 的周期大小
#define LCD_INIT_TIME 100 //lcd长延时,调整以保证lcd初始化完成40ms
#define LCD_READY_TIME 30 //lcd送完一帧数据后,留给lcd接收后一帧数据的需要的准备时间,调整以满足
//使用串行方式,直接将LCD_PS引脚接GND
#define LCD_CS (1<<20) //p0.20,可以直接接高电平
#define LCD_CLK (1<<18) //p0.18
#define LCD_SID (1<<19) //p0.19
#define LCD_RST (1<<30) //p1.30
//uint16 display_ram[16][32] = {};//用于保存lcd显示内容的数组
/********************************************************************************************************
函数名称:void lcd_delay(uint32 n);
函数功能:lcd延时程序,通过参数n来控制,n越大延时越长
入口参数:无
出口参数:无
********************************************************************************************************/
void lcd_delay(uint32 n)
{
uint32 i;
for ( ; n>0; n--)
for (i=0; i<50; i++);
}
/********************************************************************************************************
函数名称:void lcd_write_cmd (uint8 mode,uint8 dat);
函数功能:写操作
入口参数: 1.
mode 写命令 或 写数据 或 读状态 或 读数据
对应参数 1 2 3 4
2.dat
具体的命令或数据
出口参数:无
********************************************************************************************************/
void lcd_write(uint8 mode, uint8 dat)
{
uint8 i,tmpMode;
unsigned int tmpInt = 0;
if(mode==1)//针对不同的模式选定不同的首字节输入
{
tmpMode=0xf8;
}
else if(mode==2)
{
tmpMode=0xfa;
}
else if(mode==3)
{
tmpMode=0xfc;
}
else if(mode==4)
{
tmpMode=0xfe;
}
//将送过来的dat转化为temInt
//36位数据,最高8位无效,低24位按照时序要求进行组合
tmpInt = tmpMode;
tmpInt <<= 8;
tmpInt |= (dat & 0xf0);
tmpInt <<= 8;
dat <<= 4;
tmpInt |= (dat & 0xf0);
PINSEL1=(PINSEL1&(~0x3f0))|0x00000000; //选中CLK,SID,CS为GPIO
IO0DIR=(IO0DIR | LCD_CLK | LCD_SID | LCD_CS );//设定CLK,SID,CS为OUT口
IO0SET= LCD_CS ; //拉高CS
for (i=0;i<24;i++)
{
if ((tmpInt & 0x800000)!=0) //检查第24位是否为1
{
IO0SET |= LCD_SID;
}
else
{
IO0CLR |= LCD_SID ;
}
IO0CLR |= LCD_CLK;
lcd_delay(LCD_HALF_CLOCK_CYCLE);
IO0SET |= LCD_CLK;
lcd_delay(LCD_HALF_CLOCK_CYCLE);
tmpInt = tmpInt << 1;
}
IO0CLR= LCD_CS ; //拉低CS
IO0CLR=( IO0CLR | LCD_SID | LCD_CLK ); //同时拉低SID和CLK
lcd_delay(LCD_READY_TIME); //延时操作
}
/********************************************************************************************************
函数名称:void lcd_reset(void);
函数功能:lcd复位程序 通过给LCD_RST发出低电平来实现复位操作
入口参数:无
出口参数:无
********************************************************************************************************/
/*void lcd_reset(void)
{
PINSEL1=(PINSEL1&(~0x30000000)|0x00000000);
IO0DIR=LCD_RST;
IO0SET=LCD_RST;
lcd_delay();
lcd_init();
}*/
/********************************************************************************************************
函数名称:void lcd_sleep_mode(uint8 mode)
函数功能:lcd睡眠程序
入口参数:
1.mode
0x01 进入睡眠状态
0x02 醒过来(脱离睡眠状态)
2.需要在扩展指令模式下,才可发挥作用
出口参数:无
********************************************************************************************************/
/*void lcd_sleep_mode(uint8 mode)
{
if(mode==0x01)
{
lcd_write(1,0x08);
}
else
lcd_write(1,0x0c);
}*/
/********************************************************************************************************
函数名称:void lcd_draw_switch(uint8 mode);
函数功能:lcd绘图功能切换开关
入口参数:mode 0---绘图功能关 1---绘图功能开
出口参数:无
********************************************************************************************************/
void lcd_draw_switch(uint8 mode)
{
if(mode == 0)
{
lcd_write(1,0x34);
}
else
{
lcd_write(1,0x36);
}
}
/********************************************************************************************************
函数名称:void lcd_init(void);
函数功能:LCD初始化程序
入口参数:无
出口参数:无
********************************************************************************************************/
void lcd_init(void)
{
/*LCD_PS = 0;*/ /* Serial Mode 此处直接接GND*/
lcd_delay(LCD_INIT_TIME);//长延时>40ms
/* lcd_write(1,0x01); //1.清除显示设置: 清除显示屏幕
lcd_write(1,0x30); //6.功能设定设置:8位数据输入,使用基本指令集
lcd_write(1,0x02); //2.地址归位设置:将DDRAM地址计数器调整为"00h",游标返回原点
lcd_write(1,0x04); //3.点设定设置:显示画面整体不移动,光标向右移动,DDRAM地址+1
lcd_write(1,0x0c); //4.显示状态设置 :LCD显示开,光标显示关,光标位置字符不反白
lcd_write(1,0x01); //1.清除显示设置: 清除显示屏幕
*/
lcd_write(1,0x30);
lcd_write(1,0x30);
lcd_write(1,0x3c);
lcd_write(1,0x38);
lcd_write(1,0x01);
lcd_write(1,0x34);//使用扩展指令集
}
/********************************************************************************************************
函数名称: void lcd_display_str(uint8 hang,uint8 lie,uint8 *str)
函数功能: LCD显示字符串程序
入口参数: 1.hang
字符串想要显示的首地址的行
2.lie
字符串想要显示的首地址的列
3.str
要显示的字符串的地址
注意:
1.本程序不检查字符串的长度是否过长,在输入的时候需人工控制字符串的长度
单排最长只能显示16个字符
2.行总共4行,标号依次为1,2,3,4
列总共8列,标号依次为1,2,3,4,5,6,7,8
3.所以总计可以显示(16-2*lie)个字符
出口参数:无
*******************************************************************************************************/
void lcd_display_str(uint8 hang,uint8 lie,uint8 str[])
{
uint8 add_DDRAM;
int i;
switch(hang) //确定行的首地址
{
case 1 :add_DDRAM=0x80;break;
case 2 :add_DDRAM=0x90;break;
case 3 :add_DDRAM=0x88;break;
case 4 :add_DDRAM=0x98;break;
default :add_DDRAM=0x99;
}
add_DDRAM|=(lie-0x01); //计算出开始写入的地址
lcd_write(1,add_DDRAM);
for(i=0;str[i]!='\0';i++)
{
lcd_write(2,str[i]); //显示单个字符
}
}
//用于缓存显示数据的数组
uint16 display_ram[16][32] = {0};
//用于记录是否需要刷新显示单元数组的标示符,1表示需要刷新,0表示不需要
uint32 display_ram_update[16] = {0};
//按照这个显示缓存来显示这个图像来,准确的说是点阵
void display_all(void)
{
int i,j;
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -