📄 lcd12864.c
字号:
#include "lcd12864.h"
#include "Board.h"
char L_lcd=0,R_lcd=0;
const int LCD_MASK_DATA_SZ[8]= {LCD_DB0,LCD_DB1,LCD_DB2,LCD_DB3,LCD_DB4,LCD_DB5,LCD_DB6,LCD_DB7};
///////////////////////////////////////////////////////////////////////
//软件延时1
//////////////////////////////////////////////////////////////////////
void wait( void )//1ms
{
unsigned int i;
for(i= 0; i<MCKKHz/100;i++) {;}//大约1ms
}
///////////////////////////////////////////////////////////////////////
//字节高低变换(预留)
//////////////////////////////////////////////////////////////////////
unsigned int char_change(unsigned char a)
{
unsigned int i, b=0x00,c=0x01,d=0x80;
for(i=8;i>0;i--)
{
if((a&c)!=0)
{
b=(b|d);
}
c=c<<1;
d=d>>1;
}
return b;
}
///////////////////////////////////////////////////////////////////////
//LCD初始化
//////////////////////////////////////////////////////////////////////
void lcd_init(void)
{
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB );//使能外设时钟
//AT91F_PIO_MultiDriverEnable(AT91C_BASE_PIOB,LCD_MASK);
AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOB,LCD_MASK); //将于LCD相联的I/O口配置为开路输出
AT91F_PIO_CfgPullup(AT91C_BASE_PIOB,LCD_MASK); //禁止上拉,LCD工作在5V状态!!!
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, LCD_MASK); //配置输出
//AT91F_PIO_CfgDirectDrive(AT91C_BASE_PIOB, LCD_MASK_DATA);//配置并行输出
//AT91F_PIO_CfgPullup(AT91C_BASE_PIOB, LCD_MASK_COM);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_MASK);//清除I/O
//LCD复位,利用I/0口控制
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RET);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_RET);
wait();
}
///////////////////////////////////////////////////////////////////////
//判断LCD是否空闲或复位
//////////////////////////////////////////////////////////////////////
void check_busy(void)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS1|LCD_CS2);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_RW);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DI);
AT91F_PIO_CfgPullup(AT91C_BASE_PIOB, LCD_MASK_DATA);
AT91F_PIO_CfgInput( AT91C_BASE_PIOB, LCD_MASK_DATA);
do{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);
wait();
}
while((AT91F_PIO_GetInput(AT91C_BASE_PIOB)&(LCD_DB7|LCD_DB4))!= 0);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_CS1|LCD_CS2);
if(L_lcd!=0)AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS1);
if(R_lcd!=0)AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_CS2);
AT91F_PIO_CfgOutput( AT91C_BASE_PIOB, LCD_MASK_DATA);
}
///////////////////////////////////////////////////////////////////////
//LCD显示开关
//////////////////////////////////////////////////////////////////////
void LCD_on_off(unsigned char key)
{
L_lcd=1;
R_lcd=1;
check_busy();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW|LCD_DI);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);
wait();
if( key==1)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DB5|LCD_DB4|LCD_DB3|LCD_DB2|LCD_DB1|LCD_DB0);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DB7|LCD_DB6);
}//on
else {
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DB5|LCD_DB4|LCD_DB3|LCD_DB2|LCD_DB1);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_DB7|LCD_DB6|LCD_DB0);
}//off
L_lcd=0;
R_lcd=0;
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
}
///////////////////////////////////////////////////////////////////////
//LCD参数设置
//////////////////////////////////////////////////////////////////////
void LCD_Write_Com(unsigned char key)
{
unsigned char i,b=0x1;
check_busy();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW|LCD_DI);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);
wait();
for(i=0;i<8;i++)
{
if((key&b)!=0)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
}
else
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
b=b<<1;
}
wait();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
}
///////////////////////////////////////////////////////////////////////
//写数据到LCD内存
//////////////////////////////////////////////////////////////////////
void LCD_Write_Dat(unsigned char key)
{
unsigned char i,b=0x1;
check_busy();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_DI);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_RW);
wait();
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LCD_E);
wait();
for(i=0;i<8;i++)
{
if((key&b)!=0)
{
AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
}
else
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LCD_MASK_DATA_SZ[i]);
b=b<<1;
}
wait();
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LCD_E);
wait();
}
///////////////////////////////////////////////////////////////////
//清LCD屏函数
///////////////////////////////////////////////////////////////////
void LCD_Clr(void)
{
unsigned char i,j;
L_lcd=1;
R_lcd=1;
LCD_Write_Com(0xc0);
LCD_Write_Com(0x3e);
for(j=8;j>0;j--){
LCD_Write_Com(0xb8|j);
LCD_Write_Com(0x40);
for(i=64;i>0;i--){
LCD_Write_Dat(0x00);
}
}
LCD_Write_Com(0x3f);
}
/////////////////////////////////////////////////////////////////////////
//显示8x8小写数字
//////////////////////////////////////////////////////////////////////////
void display8x8(unsigned char x,unsigned char y,const char *p){
unsigned i;
y<<=3;
L_lcd=1;
R_lcd=0;
if(y&0x40){
L_lcd=0;
R_lcd=1;
}
y&=0x3f;
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|y);
for(i=8;i>0;i--){
LCD_Write_Dat(*p++);
}
}
//////////////////////////////////////////////////////////////////////////
//显示8x16英文字母和数字
//////////////////////////////////////////////////////////////////////////
void display8x16(unsigned char x,unsigned char y,const char *p)
{
unsigned char i;
x<<=1;
y<<=3;
L_lcd=1;
R_lcd=0;
if(y&0x40){
L_lcd=0;
R_lcd=1;
}
y&=0x3f;
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|y);
for(i=8;i>0;i--){
LCD_Write_Dat(*p++);
}
LCD_Write_Com(0xb9|x);
LCD_Write_Com(0x40|y);
for(i=8;i>0;i--){
LCD_Write_Dat(*p++);
}
}
/////////////////////////////////////////////////////////////////////////
//显示汉字(16*16点阵字符汉字)
/////////////////////////////////////////////////////////////////////////
void display16x16(unsigned char x,unsigned char y,const char *p){
unsigned char i;
x<<=1;
y<<=4;
L_lcd=1;
R_lcd=0;
if(y&0x40){
L_lcd=0;
R_lcd=1;
}
y&=0x3f;
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|y);
for(i=16;i>0;i--){
LCD_Write_Dat(*p++);
}
LCD_Write_Com(0xb9|x);
LCD_Write_Com(0x40|y);
for(i=16;i>0;i--){
LCD_Write_Dat(*p++);
}
}
/////////////////////////////////////////////////////////////////////////
//显示图片---显示整屏
/////////////////////////////////////////////////////////////////////////
void displaypicture( const char *p)
{
unsigned char x,y,a;
for(x=0;x<8;)
{
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|0);
for(y=0;y<64;y++)
{ L_lcd=1;
R_lcd=0;
a=*p++;
LCD_Write_Dat(a);
// PrintkFoueByte(a);
}
x++;//????????????//这点很重要!!不能放在FOR循环里面!!
LCD_Write_Com(0xb8|x);
LCD_Write_Com(0x40|0);
for(y=64;y<128;y++)
{
L_lcd=0;
R_lcd=1;
a=*p++;
LCD_Write_Dat(a);
// PrintkFoueByte(a);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -