📄 lcm.c
字号:
#define LCD_READ 1
#define LCD_WRITE 0
#define DATA 1
#define INS 0
#define SEL 0
#define NO_SEL 1
#define KONGBAI 0x20
#include<ADuC834.h>
extern unsigned char code hz1212[];
extern unsigned char code hz[];
extern unsigned char code asc6_12[];
extern unsigned char code asc6_8[];
extern unsigned char code asc11_16[];
extern unsigned char code asc12_16[];
extern unsigned char code asc16_32[];
extern unsigned char code asc24_32[];
extern unsigned char xdata dis_buf1[128],dis_buf2[128]; // 使用12*12字库时,用于缓冲拼装行
sbit p_csa = P2^4;
sbit p_csb = P2^3;
sbit p_di = P2^0;
sbit p_rw = P2^1;
sbit p_e = P2^2;
//sbit p_rs = P2^0;
/*
管脚号 管脚 电平 说 明
1 CSA H/L 片选择信号,低电平时选择前64列。
2 CSB H 片选择信号,低电平时选择后64列。
3 GND 0V 逻辑电源地。
4 VCC 5V 逻辑电源。
5 V0 -10V LCD驱动电源。
6 D/I H/L 数据\指令选择,高电平:数据D0-D7将送入显示RAM;
低电平:数据D0-D7将送入指令寄存器执行。
7 R/W H/L 读\写选择,高电平:读数据;低电平:写数据。
8 E H.H/L 读写使能,高电平有效,下降沿锁定数据。
9 DB0 H/L 数据输入输出引脚。
10 DB1 H/L 数据输入输出引脚。
11 DB2 H/L 数据输入输出引脚。
12 DB3 H/L 数据输入输出引脚。
13 DB4 H/L 数据输入输出引脚。
14 DB5 H/L 数据输入输出引脚。
15 DB6 H/L 数据输入输出引脚。
16 DB7 H/L 数据输入输出引脚。
17 RET L 复位信号,低电平有效。
18 VEE -10V LCD驱动电源。
19 BLA AC 背光电源,LED+。
20 BLK AC 背光电源,LED-。
*/
// 屏幕显示与DD RAM地址映射关系
// Y1 Y2 Y3 Y4 ………… Y62 Y63 Y64
// X=0 | Line 0 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB0
// | Line 1 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB1
// | Line 2 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB2
// | Line 3 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB3
// | Line 4 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB4
// | Line 5 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB5
// | Line 6 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB6
// | Line 7 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB7
//------------------------------------------------------------------------------------------
// …………
// …………
// …………
//------------------------------------------------------------------------------------------
// X=7 | Line60 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB4
// | Line61 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB5
// | Line62 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB6
// | Line63 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB7
// 屏幕坐标(每个坐标单元为(8*8像素))
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 (X)
// 1
// |
// 7
/*忙判别*/
void lcd_busy(void)
{
p_di = INS;
p_rw = LCD_READ;
p_e = 1;
P0 = 0xff;
while (1)
{
p_e = 1;
if (P0 < 0x80) break;
p_e = 0;
}
p_e = 0;
}
void lcd_on_off(unsigned char onoff)
{
lcd_busy();
p_di = INS;
p_rw = LCD_WRITE;
p_e = 1;
if(!onoff)
P0 = 0x3e; //off display
else
P0 = 0x3f; //on display
p_e = 0;
}
// 设置显示起始行
// 功能:执行该命令后,所设置的行将显示在屏幕的第一行。
// 显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,
// 起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,
// 当扫描完一行后自动加一
void set_start_column(unsigned char col)
{
lcd_busy();
p_di = INS;
p_rw = LCD_WRITE;
p_e = 1;
P0 = col|0xc0;
p_e = 0;
}
// 设置页地址
//CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// L L H L H H H 页地址(0~7)
//功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,
// 页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,
// 复位信号(RST)可把页地址计数器内容清零。
// DD RAM地址映像表
// Y 地址
// 0 1 2 ……………………… 61 62 63
// -------------------------------------
// |DB0 |
// | ∫ PAGE0 | X=0
// |DB7 |
// ------------------------------------
// |DB0 |
// | ∫ PAGE1 | X=1
// |DB7 |
// -------------------------------------
// | ∷ |
// | ∷ |
// | ∷ |
// | ∷ |
// -------------------------------------
// |DB0 |
// | ∫ PAGE6 | X=7
// |DB7 |
// -------------------------------------
// |DB0 |
// | ∫ PAGE7 | X=8
// |DB7 |
// -------------------------------------
void set_page(unsigned char page)
{
lcd_busy();
p_di = INS;
p_rw = LCD_WRITE;
p_e = 1;
P0 = page|0xb8;
p_e = 0;
}
// 设置列地址
// DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。
void set_row(unsigned char col)
{
lcd_busy();
p_di = INS;
p_rw = LCD_WRITE;
p_e = 1;
P0 = col|0x40;
p_e = 0;
}
// 状态检测
//CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// H L BF L ON/OFF RST L L L L
//功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。
// BF=H:内部正在执行操作; BF=L:空闲状态。
// RST=H:正处于复位初始化状态; RST=L:正常状态。
// ON/OFF=H:表示显示关闭; ON/OFF=L:表示显示开。
/*
unsigned char read_status(void)
{
unsigned char status;
p_di = INS;
p_rw = LCD_READ;
p_e = 1;
status = P0;
p_e = 0;
return status;
}
*/
// 写显示数据
//CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// L H D7 D6 D5 D4 D3 D2 D1 D0
//功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。
// D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行"设置页地址"及"设置列地址"命令。
void write_data(unsigned char da)
{
lcd_busy();
p_di = DATA;
p_rw = LCD_WRITE;
p_e = 1;
P0 = da;
p_e = 0;
}
// 读显示数据
//CODE: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// H H D7 D6 D5 D4 D3 D2 D1 D0
//功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行"设置页地址" 及"设置列地址"命令。
/*
unsigned char read_data(void)
{
unsigned char da;
lcd_busy();
P0 = 0xff;
p_di = DATA;
p_rw = LCD_READ;
p_e = 1;
p_rw = LCD_READ;
da = P0;
P0 = 0xff;
p_e = 0;
return da;
}
*/
/*设置xy*/
void set_xy(unsigned char x,unsigned char y)
{
if (x>=64)
{
p_csa = 0;
p_csb = 1;
}
else
{
p_csb = 0;
p_csa = 1;
}
set_row(x);
set_page(y);
P0=0xff;
}
/*显示初始化*/
void lcd_init(void)
{
unsigned char x,y;
/*开显示*/
p_csa = 1;
p_csb = 0;
lcd_on_off(1);
p_csa = 0;
p_csb = 1;
lcd_on_off(1);
/*0行开始显示*/
p_csa = 1;
p_csb = 0;
set_start_column(0);
p_csa = 0;
p_csb = 1;
set_start_column(0);
for (y=0;y<8;y++)
{
for (x=0;x<128;x++)
{
set_xy(x,y);
write_data(0xff);
}
}
}
//显示汉字,fb==1:反白显示
//汉字字库(16*16)
// byte0 (DB0) ~ byte 15
// (DB1)
// |
// (DB7)
// byte16 (DB0) ~ byte 31
// (DB1)
// |
// (DB7)
/*
void diplay_chinese(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)
{
unsigned char i,dd;
for (i=0;i<16;i++)
{
dd=hz[i+n*32];
if (fb) dd=255-dd;
set_xy(x*8+i,y);
write_data(dd);
dd=hz[i+n*32+16];
if (fb) dd=255-dd;
set_xy(x*8+i,y+1);
write_data(dd);
}
}
*/
void diplay_chinese(unsigned char x,unsigned char y,unsigned char n,unsigned char fb)
{
unsigned char i,dd,ch,ch2,yy;
switch(y)
{
case 0:
yy = 0;
break;
case 1:
yy = 1;
break;
case 2:
yy = 3;
break;
case 3:
yy = 4;
break;
case 4:
yy = 6;
break;
}
for (i=0;i<12;i++)
{
dd=hz1212[i+n*24]; // 汉字的上半部分
if (fb) dd=255-dd;
set_xy(x*12+i,yy);
switch(yy)
{
case 1:
// ch = read_data(); // 上半字节拼装
ch = dis_buf1[x*12+i];
ch = ch & 0x0f;
ch2 = dd;
dd = dd<<4;
dd = dd & 0xf0;
dd = ch | dd; // 先显示高4位
dis_buf1[x*12+i] = dd;
break;
case 4:
// ch = read_data(); // 上半字节拼装
ch = dis_buf2[x*12+i];
ch = ch & 0x0f;
ch2 = dd;
dd = dd<<4;
dd = dd & 0xf0;
dd = ch | dd; // 先显示高4位
dis_buf2[x*12+i] = dd;
break;
}
// set_xy(x*12+i,yy);
write_data(dd);
dd=hz1212[i+n*24+12]; // 汉字的下半部分
if (fb) dd=255-dd;
set_xy(x*12+i,yy+1);
switch(yy)
{
case 0:
// ch = read_data(); // 下半字节拼装
ch = dis_buf1[x*12+i];
ch = ch & 0xf0;
dd = dd & 0x0f;
dd = ch | dd;
dis_buf1[x*12+i] = dd;
break;
case 3:
//case 6:
// ch = read_data(); // 下半字节拼装
ch = dis_buf2[x*12+i];
ch = ch & 0xf0;
dd = dd & 0x0f;
dd = ch | dd;
dis_buf2[x*12+i] = dd;
break;
case 1: case 4:
ch2 = ch2>>4;
ch2 = ch2 & 0x0f;
dd = dd << 4;
dd = dd & 0xf0;
dd = dd | ch2;
break;
}
// set_xy(x*12+i,yy+1);
write_data(dd);
}
}
void diplay_menu_chinese(unsigned char x,unsigned char frame,unsigned char n,unsigned char act)
{
unsigned char i,dd,ch,xx;
if(frame > 1)
{
xx = 0;
switch(frame)
{
case 4:
xx = 64;
case 2:
set_xy(xx,6);
write_data(0x07);
set_xy(xx,7);
write_data(0xc0);
set_xy(1+xx,6);
write_data(0xfb);
set_xy(1+xx,7);
write_data(0xbf);
for(i=0;i<6;i++)
{
set_xy(2+i+xx,6);
write_data(0xfd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -