📄 lcd.c
字号:
#include <Mega64.h>
#include "hat500_zk12.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BIT0 0X01
#define BIT1 0X02
#define BIT2 0X04
#define BIT3 0X08
#define BIT4 0X10
#define BIT5 0X20
#define BIT6 0X40
#define BIT7 0X80
#define LCD_DATA DDRC
#define LCD_DATA_IN PINC
#define LCD_DATA_OUT PORTC
#define LCD_CS2 PORTA.0
#define LCD_CS1 PORTD.1
#define LCD_EN PORTD.2
#define LCD_RS PORTD.3
#define LCD_RW PORTD.4
/***********常用操作命令和参数定义***************/
#define DISPON 0x3f /*显示on */
#define DISPOFF 0x3e /*显示off */
#define DISPFIRST 0xc0 /*显示起始行定义 */
#define SETX 0xB8 /*X定位设定指令(页) */
#define SETY 0x40 /*Y定位设定指令(列) */
extern uchar TotelStrCount; //84个字符计数
extern uchar row; //行0,2,4,6
extern uchar col; //0-127
extern uchar digit; //为反相的位数
extern uchar DisplayBuffer[]; //84个字符
extern uchar ucDisplayStatus; //=0不反相,=1时反相
void LcdPutScreen();
void LcdPutLine(uchar ucRevReg);
void Putedot(uchar flash *p, uchar ucRevReg);
void Putcdot(uchar flash *p, uchar ucRevReg);
void Lcmcls(void);
void Wrdata(uchar X);
void Wrcmd(uchar X);
void Wtcom(void);
void Lcminit(void);
void LcdPutPara();
#pragma optsize-
//显示参数调整行 digit为反相的位数
void LcdPutPara( void )
{
uchar i;
uchar flash *p;
//写上半个字符
LCD_CS1 = 1;
LCD_CS2 = 0;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
for (i = 0; i < 21; i++)
{
if (DisplayBuffer[TotelStrCount] == 0x80)
{
i++;
TotelStrCount++;
p = Tab_HZ12;
p += (uint)DisplayBuffer[TotelStrCount] * 24; /*每个字符24字节 */
Putcdot(p,0);
}
else if(i == digit)
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */
Putedot(p,1);
}
else
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */
Putedot(p,0);
}
TotelStrCount++;
}
TotelStrCount -= 21;
//写下半个字符
LCD_CS1 = 1;
LCD_CS2 = 0;
row++;
col = 1;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
for (i = 0; i < 21; i++)
{
if (DisplayBuffer[TotelStrCount] == 0x80)
{
i++;
TotelStrCount++;
p = Tab_HZ12;
p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12; /*每个字符24字节 */
Putcdot(p,0);
}
else if(i == digit)
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符24字节 */
Putedot(p,1);
}
else
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符24字节 */
Putedot(p,0);
}
TotelStrCount++;
}
}
/*显示四行
当ucDisplayStatus=1时第1行反相
当ucDisplayStatus=2时第2行反相
当ucDisplayStatus=3时第3行反相
第4行:
当ucDisplayStatus=4时反相
当ucDisplayStatus !=4 同时digit = 0xff 时不反相
当ucDisplayStatus !=4 同时digit = (0-21)时对应位反相
*/
void LcdPutScreen()
{
col = 1;
row = 0;
TotelStrCount = 0;
if(ucDisplayStatus == 1)
{
LcdPutLine(1);
}
else
{
LcdPutLine(0);
}
col = 1;
row = 2;
if(ucDisplayStatus == 2)
{
LcdPutLine(1);
}
else
{
LcdPutLine(0);
}
col = 1;
row = 4;
if(ucDisplayStatus == 3)
{
LcdPutLine(1);
}
else
{
LcdPutLine(0);
}
col = 1;
row = 6;
if(ucDisplayStatus == 4)
{
LcdPutLine(1);
}
else if(digit == 0xff)
{
LcdPutLine(0);
}
else
{
LcdPutPara();
}
/*
清除第一列及最后一列
*/
LCD_CS1 = 1;
LCD_CS2 = 0;
for(row = 0; row < 8; row++)
{
col = 0;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
Wrdata(0);
}
LCD_CS1 = 0;
LCD_CS2 = 1;
for(row = 0; row < 8; row++)
{
col = 63;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
Wrdata(0);
}
}
void LcdPutLine(uchar ucRevReg)
{
uchar i;
uchar flash *p;
//写上半个字符
LCD_CS1 = 1;
LCD_CS2 = 0;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
for (i = 0; i < 21; i++)
{
if (DisplayBuffer[TotelStrCount] == 0x80)
{
i++;
TotelStrCount++;
p = Tab_HZ12;
p += (uint)DisplayBuffer[TotelStrCount] * 24; /*每个字符24字节 */
Putcdot(p,ucRevReg);
}
else
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12; /*每个字符24字节 */
Putedot(p,ucRevReg);
}
TotelStrCount++;
}
TotelStrCount -= 21;
//写下半个字符
LCD_CS1 = 1;
LCD_CS2 = 0;
row++;
col = 1;
Wrcmd(row|SETX);
Wrcmd(col|SETY);
for (i = 0; i < 21; i++)
{
if (DisplayBuffer[TotelStrCount] == 0x80)
{
i++;
TotelStrCount++;
p = Tab_HZ12;
p += (uint)DisplayBuffer[TotelStrCount] * 24 + 12; /*每个字符24字节 */
Putcdot(p,ucRevReg);
}
else
{
p = TAB_ASC616;
p += (uint)DisplayBuffer[TotelStrCount] * 12 + 6; /*每个字符12字节 */
Putedot(p,ucRevReg);
}
TotelStrCount++;
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(uchar flash *p, uchar ucRevReg)
{
uchar i;
uchar cbyte;
if(ucRevReg == 0)
{
for(i = 0; i < 6; i++)
{
cbyte = *p++; /*半个字符输出,6列 */
if((col++) == 64)
{ //若COL>64则换右半屏,同时置列为0
LCD_CS1 = 0;
LCD_CS2 = 1;
Wrcmd(row|SETX);
Wrcmd(SETY);
}
Wrdata(cbyte); /*写输出一字节 */
}
}
else
{
for(i = 0; i < 6; i++)
{
cbyte = ~(*p++); /*半个字符输出,6列 */
if((col++) == 64)
{ //若COL>64则换右半屏,同时置列为0
LCD_CS1 = 0;
LCD_CS2 = 1;
Wrcmd(row|SETX);
Wrcmd(SETY);
}
Wrdata(cbyte); /*写输出一字节 */
}
}
}
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(uchar flash *p, uchar ucRevReg)
{
uchar i;
uchar cbyte;
if(ucRevReg == 0)
{
for(i = 0; i < 12; i++)
{
cbyte = *p++; /*半个字符输出,12列 */
if((col++) == 64)
{ //若COL>64则换右半屏,同时置列为0
LCD_CS1 = 0;
LCD_CS2 = 1;
Wrcmd(row|SETX);
Wrcmd(SETY);
}
Wrdata(cbyte); /*写输出一字节 */
}
}
else
{
for(i = 0; i < 12; i++)
{
cbyte = ~(*p++); /*半个字符输出,12列 */
if((col++) == 64)
{ //若COL>64则换右半屏,同时置列为0
LCD_CS1 = 0;
LCD_CS2 = 1;
Wrcmd(row|SETX);
Wrcmd(SETY);
}
Wrdata(cbyte); /*写输出一字节 */
}
}
}
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls(void)
{
LCD_CS1 = 1;
LCD_CS2 = 1;
for(row = 0; row < 8; row++)
{
Wrcmd(row|SETX);
Wrcmd(col|SETY);
for(col = 0; col < 64; col++)
{
Wrdata(0); //清屏
}
}
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(uchar X)
{
Wtcom();
LCD_DATA_OUT = X; /*数据输出到数据口 */
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
}
/********************************/
/* 命令输出 */
/********************************/
void Wrcmd(uchar X)
{
Wtcom();
LCD_DATA_OUT = X; /*数据输出到数据口 */
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
delay_us(1); //delay
LCD_EN = 0;
}
void Wtcom(void)
{
LCD_DATA = 0; //置口为输入
LCD_DATA_OUT = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delay_us(1); //delay
while(PINC.7);
LCD_EN = 0;
LCD_DATA = 0xff; //置口为输出
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
LCD_DATA = 0xff; //LCD数据口置为输出
LCD_DATA_OUT = 0xff; //LCD数据口置为1
DDRA |= (1<<0); //LCD_CS2置为输出
DDRD |= (1<<1); //LCD_CS1置为输出
DDRD |= (1<<2); //LCD_EN置为输出
DDRD |= (1<<3); //LCD_RS置为输出
DDRD |= (1<<4); //LCD_RW置为输出
LCD_CS1 = 1;
LCD_CS2 = 1;
LCD_EN = 0;
Wrcmd(DISPFIRST); /*定义显示起始行为零 */
Wrcmd(DISPON); /*打开显示屏 */
Wrcmd(DISPFIRST);
Wrcmd(DISPON);
Lcmcls(); //LCD清屏
LCD_CS1 = 0;
LCD_CS2 = 0;
}
#pragma optsize+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -