📄 yej.c
字号:
/***************************************************************************/
/* 12864LCD测试程序 */
/* 目标器件:ATmega128 */
/* 晶振:RC 1MHZ */
/* 编译环境:ICCAVR V6.31A */
/***************************************************************************/
/*********************************包含头文件********************************/
#include <iom128v.h>
#include <macros.h>
#include "zf.h"
#define uchar unsigned char
uchar gunping_bzw=0;//滚屏标志位
/*********************************端口定义*****************************/
#define cs1on PORTB |=BIT(3); //选屏1
#define cs1off PORTB &=~BIT(3);
#define cs2on PORTD |=BIT(7); //选屏2
#define cs2off PORTD &=~BIT(7);
#define Eon PORTB |=BIT(2); //读写使能
#define Eoff PORTB &=~BIT(2);
#define DIon PORTB |=BIT(0); //数据/命令
#define DIoff PORTB &=~BIT(0);
#define Rwon PORTB |=BIT(1); //R/W
#define Rwoff PORTB &=~BIT(1);
/**********************************字模表***********************************/
unsigned char bz1=1; //写数据时 DI=bz1
unsigned char bz0=0; //写命令时 DI=bz0
//_______________________________________________
void xie(unsigned char bz,char dat) //写数据★★//写指令★★ok
{
Rwoff;
Eon;
if(bz==0)
DIoff;
if(bz==1)
DIon;
PORTA=dat; //Pa口
Eoff;
}
void fasong_x(uchar dat) //发送行地址
{
dat=dat&0x07; //0~7行
dat=dat|0xb8; //1011 1xxx
xie(bz0,dat);
}
void fasong_y(uchar dat) //发送列地址
{
dat=dat&0x3f; //0~63列
dat=dat+0x40; //01xx xxxx
xie(bz0,dat);
}
//====================选择液晶屏=============================
xuan_ping(uchar cs)//选择液晶屏 0全屏 1左屏 2中屏 3右屏
{ switch(cs)
{case 0: //全屏
cs1on;
cs2on;
delay(10);break;
case 1: //左屏
cs1on;
cs2off;
delay(10);break;
case 2: //中屏
cs1off;
cs2on;
delay(10);break;
}
}
//====================显示函数==================================
//8*8??
/*void LED_xie_char1(uchar x,uchar y,uchar *p)
{ uchar i;
if(y<8) xuan_ping(1);
else {if(y<16) xuan_ping(2);
else xuan_ping(3);}
fasong_y(y<<3);
fasong_x(x);
for(i=0;i<8;i++,p++) xie(bz1,*p);
}
//8*16?? ?>>?
void LED_xie_char2(uchar x,uchar y,uchar *p)
{ uchar i;
if(y<8) xuan_ping(1);
else {if(y<16) xuan_ping(2);
else xuan_ping(3);}
fasong_y(y<<3);
fasong_x(x);
for(i=0;i<8;i++,p++) xie(bz1,*p);
fasong_x(x+1);
fasong_y(y<<3);
for(i=0;i<8;i++,p++) xie(bz1,*p);
}*/
//16*16?? ??>>??>>??>>??
void LED_xie_char3(uchar x,uchar y,uchar *p)
{ uchar i;
if(y<8) xuan_ping(1);
else {if(y<16) xuan_ping(2);
else xuan_ping(3);}
fasong_y(y<<3);//要左移3位,如不移会覆盖前一字
fasong_x(x);
for(i=0;i<16;i++,p++) xie(bz1,*p);//16*16汉字的上半部
fasong_y(y<<3);
fasong_x(x+1);
for(i=0;i<16;i++,p++) xie(bz1,*p);//16*16汉字的下半部
}
//-----------------------------------------------------------------
void LED_qingping() //清全屏
{ uchar i,j;
xuan_ping(0); //选中(左 右)三屏 也可只清其中一屏
for(i=0;i<8;i++)
{ fasong_x(i);fasong_y(0);
for(j=0;j<64;j++) xie(bz1,0);
}
}
//___________________________________________________________________
void LED_on_off(uchar D)//1:开显示 0:关显示
{ xuan_ping(0); //3个屏全部选中(一起开关) 也可分别开/关
D=D&0x01;
D=D|0x3e;
xie(bz0,D);
}
void LED_sta_x(uchar x) //设置起始行
{ xuan_ping(0); //3个屏全部选中(一起设置起始行)也可分开设置
x=x&0x3f;
x=x|0xc0;
xie(bz0,x);
}
void qing_hang(uchar x)//清行
{ uchar i;
xuan_ping(0);
fasong_y(0);
fasong_x(x);
for(i=0;i<64;i++) xie(bz1,0);
fasong_y(0);
fasong_x(x+1);
for(i=0;i<64;i++) xie(bz1,0);
}
//+++++++++++++++++++++++++++++++++++++++
void xianshixy_chuli( )//显示处理
{
static uchar dat_i,qishihang,i,j;//滚屏时,数字计数器
LED_xie_char3(i,dat_i,wengzi[j]);//写16*16汉字
dat_i=dat_i+2; //一个字的间距
j++;
if(j>16) j=0; //汉字个数
if(gunping_bzw==0)
{
if(dat_i>15)//一行8个汉字写满时
{
dat_i=0;
i=i+2; //在下一行开始
}
if(i==8)//共4行 4*2
{
gunping_bzw=1;
qishihang=qishihang+16;//移动一行
qing_hang(i);//清行
}
}
else
{
if(dat_i>15)
{
dat_i=0;
i=i+2; //在下一行开始
qishihang=qishihang+1;//滚屏时,数字计数器
qing_hang(i); //清行
if(i==8) i=0; //一屏写满时共四行
}
}
LED_sta_x(qishihang);//设置起始行
delay(6500);//每移动一个字的速度
delay(6500);delay(6500);delay(6500);
}
void main()
{ DDRB=0xff;
//PORTB=0xff;
DDRD=0xff;
//PORTD=0xff;
DDRA=0xff;
//PORTA=0xff;
LED_on_off(1);//1:开显示 0:关显示
LED_qingping(); //清屏 //3屏
LED_sta_x(0); //设置起始行
while(1)
{
xianshixy_chuli( );
//LED_xie_char3(0,0,wengzi[0]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -