📄 main.c
字号:
//亦木明
#include "keyscan.h"
#include "pig.h"
int1 Timer0_Flag=FALSE;
//#define CMD 0
//#define DAT 1
#define PAGES 8
#define COLUMNS 131 //64*131
#define LCD_DATA *(0x07)
void SFR_Init()
{
set_tris_a(0xff);
set_tris_b(0x01);
set_tris_c(0x00);
port_b_pullups(0xff);
InitTimer0();
Key_Init();
}
void LCD_WriteCmd(int8 cmd)
{
disable_interrupts(INT_RTCC);
output_low(PIN_B5); //CS1=0;
output_low(PIN_B2); //A0=0
output_high(PIN_B4); //R=1
LCD_DATA=cmd;
output_low(PIN_B3); //WR=0
#asm
NOP
NOP
NOP
NOP
#endasm
output_high(PIN_B3); //WR=1
output_high(PIN_B5); //CS1=1
enable_interrupts(INT_RTCC);
}
void LCD_WriteDat(int8 dat)
{
disable_interrupts(INT_RTCC);
output_low(PIN_B5); //CS1=0;
output_high(PIN_B2); //A0=1
output_high(PIN_B4); //R=1
LCD_DATA=dat;
output_low(PIN_B3); //WR=0
#asm
NOP
NOP
NOP
NOP
#endasm
output_high(PIN_B3); //WR=1
output_high(PIN_B5); //CS1=1;
enable_interrupts(INT_RTCC);
//output_c(0xff);
}
int8 LCD_ReadStatus()
{
int8 dat;
set_tris_c(0xff);
output_low(PIN_B2); //A0=0
output_high(PIN_B3); //WR=1
output_low(PIN_B4); //R=0
#asm
NOP
NOP
NOP
NOP
#endasm
dat=input_c();
output_high(PIN_B4); //R=1
set_tris_c(0x00);
return dat;
}
//SetPage 0-7
void LCD_SelPage(int8 page)
{
page=page%PAGES;
LCD_WriteCmd(0xb0+page);
}
//SetColumn 0-131 (131*64)
void LCD_SelColumn(int8 column)
{
column=column%COLUMNS;
LCD_WriteCmd(column&0x0f); //列的低四位
column>>=4;
LCD_WriteCmd(0x10|(column&0x0f)); //列的高四位
}
void LCD_Clear()
{
int8 i,j;
for(i=0;i<8;i++)
{
LCD_SelPage(i);
LCD_SelColumn(0);
for(j=0;j<COLUMNS;j++)
{
LCD_WriteDat(0x00);
}
}
}
//从第page行,第column列开始,显示len个字母。Flag为反白显示。TRUE反白。
/***************************************************
// 函数原型: Display_En(int8,int8,int8,int1)
// 入口参数: page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数: void
// 功 能: 显示8*5字符。
// 最后修改: 2008.09.29
// 注 意: 本函数具有自动换行功能
Flag=0 正常显示
Flag=1 反白显示
***************************************************/
void Display_En(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
int8 i,j,count;
count=column; //对列进行计数,若大于本行的最大列,则转移到下一行。
page=page%PAGES; //防止输入的行超过0-7
column=column%COLUMNS; //防止输入的列超过0-131
LCD_SelPage(page);
LCD_SelColumn(column);
for(i=0;i<len;i++)
{
if(count+5>COLUMNS-1 && page<PAGES-1) //如果本行已经不够显示此字符,且行小于在0-6,则转移到下一行。
{
LCD_SelPage(++page); //
LCD_SelColumn(0);
count=0;
}
for(j=0;j<5;j++)
{
if(Flag)
LCD_WriteDat(~En[i*5+j]);//反白
else
LCD_WriteDat(En[i*5+j]);
}
count=count+5; //列数监视
}
}
/***************************************************
// 函数原型: Display_En_16X8(int8,int8,int8,int1)
// 入口参数: page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数: void
// 功 能: 显示16*8字符。
// 最后修改: 2008.09.29
// 注 意: 本函数具有自动换行功能
Flag=0 正常显示
Flag=1 反白显示
***************************************************/
void Display_En_16X8(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
int8 i,j,count;
// count=column; //对列进行计数,若大于本行的最大列,则转移到下一行。
page=page%PAGES; //防止输入的行超过0-7
column=column%COLUMNS; //防止输入的列超过0-131
for(i=0;i<len;i++)
{
if(column+8>COLUMNS-1 && page<PAGES-2) //如果本行已经不够显示此字符,且行小于在0-5,则转移到下一行。
{
page+=2;
LCD_SelPage(page); //
LCD_SelColumn(0);
column=0;
}
LCD_SelPage(page);
LCD_SelColumn(column);
for(j=0;j<8;j++) //上半个字符
{
if(Flag)
LCD_WriteDat(~En[i*16+j]);//反白
else
LCD_WriteDat(En[i*16+j]);
}
page++;
LCD_SelPage(page);
LCD_SelColumn(column);
for(j=8;j<16;j++) //下半个字符
{
if(Flag)
LCD_WriteDat(~En[i*16+j]);//反白
else
LCD_WriteDat(En[i*16+j]);
}
page--;
// count=count+8; //列数监视
column+=8;
}
}
/***************************************************
// 函数原型: Display_Chn_16X16(int8,int8,int8,int1)
// 入口参数: page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数: void
// 功 能: 显示16*16汉字。
// 最后修改: 2008.09.29
// 注 意: 本函数具有自动换行功能
Flag=0 正常显示
Flag=1 反白显示
***************************************************/
void Display_Chn_16X16(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
int8 i,j,count;
page=page%PAGES; //防止输入的行超过0-7
column=column%COLUMNS; //防止输入的列超过0-131
for(i=0;i<len;i++)
{
if(column+16>COLUMNS-1 && page<PAGES-2) //如果本行已经不够显示此字符,且行小于在0-5,则转移到下一行。
{
page+=2;
LCD_SelPage(page); //
LCD_SelColumn(0);
column=0;
}
LCD_SelPage(page);
LCD_SelColumn(column);
for(j=0;j<16;j++) //上半个字符
{
if(Flag)
LCD_WriteDat(~En[i*32+j]);//反白
else
LCD_WriteDat(En[i*32+j]);
}
page++;
LCD_SelPage(page);
LCD_SelColumn(column);
for(j=16;j<32;j++) //下半个字符
{
if(Flag)
LCD_WriteDat(~En[i*32+j]);//反白
else
LCD_WriteDat(En[i*32+j]);
}
page--;
// count=count+8; //列数监视
column+=16;
}
}
/***************************************************
// 函数原型: Display_Chn_16X16(int8,int8,int8,int1)
// 入口参数: page 起始行,column 起始列,len 字符个数,Flag 反白显示。
// 出口参数: void
// 功 能: 显示16*16汉字。
// 最后修改: 2008.09.29
// 注 意: 本函数具有自动换行功能
Flag=0 正常显示
Flag=1 反白显示
***************************************************/
void Display_Chn_32X32(int8 page,int8 column,int8 len,int8 *En,int1 Flag)
{
}
void Display_Bmp_126X64()
{
int8 i,j;
for(i=0;i<2;i++)
{
LCD_SelPage(i);
LCD_SelColumn(0);
for(j=0;j<128;j++)
{
LCD_WriteDat(nBitmapDot1[i*128+j]);
}
}
for(i=2;i<4;i++)
{
LCD_SelPage(i);
LCD_SelColumn(0);
for(j=0;j<128;j++)
{
LCD_WriteDat(nBitmapDot2[i*128+j]);
}
}
for(i=4;i<6;i++)
{
LCD_SelPage(i);
LCD_SelColumn(0);
for(j=0;j<128;j++)
{
LCD_WriteDat(nBitmapDot3[i*128+j]);
}
}
for(i=6;i<8;i++)
{
LCD_SelPage(i);
LCD_SelColumn(0);
for(j=0;j<128;j++)
{
LCD_WriteDat(nBitmapDot4[i*128+j]);
}
}
}
void LCD_Init()
{
output_low(PIN_B6); //8080
output_low(PIN_B5); //CS1=0;
//液晶复位
output_low(PIN_B1);
delay_ms(10);
output_high(PIN_B1);
delay_us(1);
//软复位
LCD_WriteCmd(0xe2);
delay_ms(10);
//设置ADC seg131-seg0
LCD_WriteCmd(0xa1);
//设置SHL com0-com64
LCD_WriteCmd(0xc8);
//设置Bias 1/9
LCD_WriteCmd(0xa2);
//Voltage Converter ON
LCD_WriteCmd(0x2c);
delay_ms(40);
//Voltage Regulator ON
LCD_WriteCmd(0x2e);
delay_ms(40);
//Voltage Follower ON
LCD_WriteCmd(0x2f);
delay_ms(40);
//电阻率选择
LCD_WriteCmd(0x27);
delay_ms(40);
//对比度设置
LCD_WriteCmd(0x81);
//对比度设置值 0-63
LCD_WriteCmd(0x05);
//初始化显示行。0-63
LCD_WriteCmd(0x40);
//打开显示
LCD_WriteCmd(0xaf);
enable_interrupts(GLOBAL);
}
/*int8 asc[]={0x7C,0x12,0x11,0x12,0x7C, // -A-
0x7F,0x49,0x49,0x49,0x36, // -B-
0x3E,0x41,0x41,0x41,0x22, // -C-
0x7F,0x41,0x41,0x41,0x3E, // -D-
0x7F,0x49,0x49,0x49,0x41, // -E-
0x7F,0x09,0x09,0x09,0x01, // -F-
0x3E,0x41,0x51,0x51,0x72, // -G-
0x7F,0x08,0x08,0x08,0x7F, // -H-
0x00,0x41,0x7F,0x41,0x00, // -I-
0x20,0x40,0x41,0x3F,0x01, // -J-
0x7F,0x08,0x14,0x22,0x41, // -K-
0x7F,0x40,0x40,0x40,0x40, // -L-
0x7F,0x02,0x0C,0x02,0x7F, // -M-
0x7F,0x04,0x08,0x10,0x7F};*/
/*int8 asc[]={
0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0x00, // -A-
0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,
0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0x00, // -B-
0x08,0x0F,0x0F,0x08,0x08,0x0F,0x07,0x00,
0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0x00, // -C-
0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00
};*/
/*int8 asc[]={
0x00,0x84,0x44,0x34,0x04,0xFC,0x05,0x86, //栾
0x04,0xFC,0x04,0x14,0x26,0xC4,0x00,0x00,
0x02,0x42,0x42,0x22,0x12,0x0A,0x06,0xFF,
0x06,0x0A,0x12,0x12,0x22,0x62,0x22,0x00,
0x00,0xFC,0x84,0x84,0x84,0xFE,0x04,0xFC,//"昕",
0x44,0x44,0x44,0xC2,0x43,0x62,0x40,0x00,
0x00,0x3F,0x10,0x10,0x10,0x9F,0x40,0x3F,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
};
*/
/*
int8 const asc[]={
0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xC0,0x40,0x44,0x58,
0x78,0x40,0x40,0xC0,0xC0,0x40,0x40,0x40,
0x40,0x40,0x40,0x60,0x60,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0xC0,0x60,0x38,0x1E,
0x0C,0x04,0x00,0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x00,0x02,0x04,
0x0C,0x18,0x38,0x70,0xE0,0x00,0x00,0x00,
0x00,0x00,0x10,0x11,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x90,0xF1,0x70,0x30,0xFF,
0xFF,0x12,0x30,0x51,0x90,0x10,0x10,0x10,
0x10,0x10,0x10,0x08,0x0C,0x08,0x00,0x00,
0x00,0x00,0x40,0x20,0x20,0x10,0x18,0x08,
0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x7F,
0x7F,0x00,0x00,0x00,0x01,0x03,0x06,0x06,
0x0C,0x1C,0x18,0x38,0x18,0x08,0x00,0x00
};
*/
void main()
{
int8 i;
// delay_ms(1000);
SFR_Init();
LCD_Init();
LCD_Clear();
i=LCD_ReadStatus();
putc(i);
/*
//Display_En(0,87,14,asc,TRUE);
Display_En_16X8(0,0,3,asc,TRUE);
Display_En_16X8(0,24,3,asc,TRUE);
Display_En_16X8(0,48,3,asc,TRUE);
Display_En_16X8(0,72,3,asc,TRUE);
Display_En_16X8(0,96,3,asc,TRUE);
Display_En_16X8(0,120,3,asc,TRUE);
// Display_En_16X8(0,0,3,asc,TRUE);*/
// Display_Chn_16X16(0,110,2,asc,TRUE);
Display_Bmp_126X64();
while(1)
{
Display_Bmp_126X64();
}
}
/*
#int_rtcc
void timer0_handle(void)
{
SET_TIMER0(217);
Timer0_Flag=TRUE;
} */
int8 contrast=0,add=0,dec=0;
#int_rtcc
void timer0_handle(void)
{
SET_TIMER0(SCANTIME);
// if(input(PIN_B2)) output_low(PIN_B2); else output_high(PIN_B2);
GetKey();
if((KeyPress&0x03)!=0x03)
{
if(KeyDown&0x01)
{
KeyDown&=0xfe;
if(contrast<63) contrast++;
}
if(!(KeyPress & 0x01))
{
add++;
if(add==10)
{
add=0;
if(contrast<63) contrast++;
}
}
if(KeyDown&0x02)
{
KeyDown&=0xfd;
if(contrast>0) contrast--;
}
if(!(KeyPress & 0x02))
{
dec++;
if(dec==10)
{
dec=0;
if(contrast>0) contrast--;
}
}
if(KeyUp&0x01)
{
KeyUp&=0xfe;
add=0;
}
if(KeyUp&0x02)
{
KeyUp&=0xfd;
dec=0;
}
//对比度设置
LCD_WriteCmd(0x81);
//对比度设置值 0-63
LCD_WriteCmd(contrast);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -