📄 lcd7920._c
字号:
//本程序测试通过 --2007.11.27
//本程序是7920的LM3037的液晶驱动程序
//汉字2x9
//可显示图形
//ATMEGA16, 内部晶振8M (也可用于外部7.3728MHz晶振)
//使用串行传输 (2线)
#include "Lcd7920.h"
#define LINEWIDTH 18 //行宽
#define LINES 2 //行数
/*
//LCD初始化
void LCD_Init(void)
{
Delay_nms(100);
//端口初始化
LCD_CONTROL_DDR=0xFF;
CLRBIT(LCD_CONTROL_PORT,E);
CLRBIT(LCD_CONTROL_PORT,RW);
Delay_nms(1);
LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
LCD_WriteCmd(0x0C); // display on
LCD_WriteCmd(0x06); // cursor right shift
LCD_Clear(); // cursor right shift
}
*/
//LCD清屏
void LCD_Clear(void)
{
LCD_WriteCmd(0x01);
Delay_nms(1); //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
}
//状态检查函数,判断是否处于忙状态 //--保留
void LCD_CheckState(void)
{
/* unsigned char dat;
CLRBIT(LCD_CONTROL_PORT,RS); //RS=0
//SETBIT(LCD_CONTROL_PORT,RW); //RW=1
LCD_DATA_DDR=0x00; // portA as input
do
{
SETBIT(LCD_CONTROL_PORT,E);
NOP();
CLRBIT(LCD_CONTROL_PORT,E);
}
while (LCD_DATA_PIN&0x80);
*/
}
//对LCD写入数据的时序协议处理
void LCD_Send(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata)&0x80)
{
//D_OUT=1 ;
SETBIT(LCD_CONTROL_PORT,RW);
}
else
{
//D_OUT=0;
CLRBIT(LCD_CONTROL_PORT,RW);
}
//SCK=1;
SETBIT(LCD_CONTROL_PORT,E);
NOP();
//SCK=0;
CLRBIT(LCD_CONTROL_PORT,E);
senddata<<=1;
}
}
//写一个命令到LCD
void LCD_WriteCmd(unsigned char scmd)
{
LCD_Send(0xf8);
LCD_Send(scmd&0xf0);
LCD_Send(scmd<<4);
Delay_nus(20);
}
////写一个数据到LCD
void LCD_WriteData(unsigned char DData)
{
LCD_Send(0xfa);
LCD_Send(DData&0xf0);
LCD_Send(DData<<4);
Delay_nus(20);
}
//设置光标位置,先Y坐标后X坐标
void LCD_Set_xy(unsigned char Y, unsigned char X)
{
unsigned char i=0x00;
switch(Y & 0x0f) //确定行号
{
case 0x00:
i=0x80;
break;
case 0x01:
i=0x90;
break;
case 0x02:
i=0x88;
break;
case 0x03:
i=0x98;
break;
default :
break;
}
i = (X & 0x0f)|i; //确定列号
LCD_WriteCmd(i);
}
//写一个字符到LCD
void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
{
//从显示屏指定的行(Y),列(X)的位置写入字符
LCD_WriteCmd(0x34); // 8bit I/F, basic command
LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
LCD_Set_xy(X,Y);
LCD_WriteData(c1);
Delay_nms(1); //2006.11.19
}
//指定光标位置,写字符串到LCD显示
void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
{
//从显示屏指定的行(Y),列(X)的位置写入字符串
unsigned char j;
unsigned char *pstr = pstr1;
LCD_WriteCmd(0x34); // 8bit I/F, basic command
LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
LCD_Set_xy(Y,X);
j=Y * LINEWIDTH + X;
while (*pstr && j< (LINEWIDTH * LINES))
{
if (j%LINEWIDTH==0) //判断是否换行
{
LCD_Set_xy(j/LINEWIDTH,0); //如换行, 则光标移动到行首
}
//避免最后一格写半个汉字, 把汉字写到下一行
if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
{
LCD_WriteData(' ');
j++;
}
else
{
LCD_WriteData(*pstr++);
j++;
}
}
Delay_nms(1); //2006.11.19
}
//从显示屏的初始位置写入字符串,自动换行
void LCD_WriteStrAuto(unsigned char *pstr1)
{
unsigned char i;
unsigned char j;
unsigned char *pstr = pstr1;
LCD_WriteCmd(0x34); // 8bit I/F, basic command
LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
for(i=0;i<36;i++) //清空屏幕
{
if (i%18==0) //判断是否换行
{
LCD_Set_xy(i/18,0); //如换行, 则光标移动到行首
}
LCD_WriteData(' '); //
}
j=0;
while (*pstr && j<36)
{
if (j%18==0) //判断是否换行
{
LCD_Set_xy(j/18,0); //如换行, 则光标移动到行首
}
//避免最后一格写半个汉字, 把汉字写到下一行
if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
{
LCD_WriteData(' '); //
j++;
}
else
{
LCD_WriteData(*pstr++);
j++;
}
}
Delay_nms(1); //11.19
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -