📄 lcd_cn.c
字号:
/*电子拼图
建立时间: 2007 3 9
最后修改时间: 2007 3 11
广东工业大学自动化学院自动化04级3班吴子洲 */
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define dat 1
#define com 0
#include <avr/io.h>
#include <avr/delay.h>
#include <math.h>
#define rs_s PORTD|=0x80 //set rs
#define rs_c PORTD&=~0x80 //clr rs
#define e_s PORTC|=0x01 //set e
#define e_c PORTC&=~0x01 //clr e
#define rw_s PORTC|=0x02 //set rw
#define rw_c PORTC&=~0x02 //clr rw
#define CPU_CRYSTAL (7.3728) //CPU Ck
#define dy(us)\
_delay_loop_2((uint)((us)*CPU_CRYSTAL/4))
volatile uchar disbuf[1024]; //display buffer
volatile uchar ss[16]; //顺序
volatile uchar sor; //光标位志
volatile uchar sorf; //光标志记
void delay(uint t)
{
while(t--)
dy(1000);
}
void w_lcd(uchar dat_com,uchar cont) //向LCD写命令或数据,由dat_com决定
{
if(dat_com)
rs_s;
else
rs_c;
PORTA=cont;
e_s;
e_c;
if(dat_com==0&&cont==0x01)
dy(1600);
else
dy(60); //data
}
void set(uchar sway) //seting display way
{
if(sway==0x00)
w_lcd(com,0x32), w_lcd(com,0x08); //not display
else if(sway==0x01)
w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x06); //cursor not flash, not move
else if(sway==0x02)
w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x06); //cursor flash, not move
else if(sway==0x03)
w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x07); //cursor not flash, move left when writing
else if(sway==0x04)
w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x07); //cursor flash, move ledt wehn writing
// else if(sway==0x40) w_lcd(com,0x34), w_lcd(com,0x34); //not display pitures
// else if(sway==0x41) w_lcd(com,0x36), w_lcd(com,0x36); //display pitures
}
/*-----------------------------------------------*/
//当type=3,在x0,y0处反白显示16*xl*16.
//当type=2,在x0,y0处前半反白显示8*xl*16.
//当type=1时,在x0,y0处后半反白显示8*xl*16.
//当type=时,不反白显示
//xl为反白显示的长度
void rv(uchar type,uchar xx0,uchar yy0,uchar xl)
{ uchar i,j;
uchar data1,data2,x0,y0;
if(type==0)
data1=0,data2=0;
else if(type==1)
data1=0,data2=0xff;
else if(type==2)
data1=0xff,data2=0;
else if(type==3)
data1=0xff,data2=0xff;
if(yy0>1)
y0=(yy0-2)*16+0x80,x0=xx0+0x88;
else
y0=yy0*16+0x80,x0=xx0+0x80;
for(j=0;j<16;j++)
{
for(i=0;i<xl;i++)
{
w_lcd (com,0x34);
w_lcd (com,y0+j);
w_lcd (com,x0+i);
w_lcd (com,0x30);
w_lcd (dat,data1);
w_lcd (dat,data2);
}
}
w_lcd (com,0x36);
}
void rvn(void)
{
rv(0,0,0,8);
rv(0,0,1,8);
rv(0,0,2,8);
rv(0,0,3,8);
}
void clr(uchar ty)
{
uint i,j;
if(ty==1||ty==3) //clean charter
w_lcd(com,0x32), w_lcd(com,0x01);
if(ty==2||ty==3) //clean piture
{
w_lcd(com,0x34);
for(j=0;j<32;j++) //draw the down half piture
{
w_lcd(com,0x80+j); //Y address
w_lcd(com,0x80); //X address
for(i=0;i<32;i++)
w_lcd(dat,0);
}
}
if(ty==8) //clr dis buffer
{
for(i=0;i<1024;i++)
disbuf[i]=0;
}
}
void lcd_ini(void)
{
set(1);
clr(3);
clr(8);
}
/*光标定位*/
void go(uchar xxx, uchar yyy)
{ w_lcd(com,0x32);
if(yyy==0) w_lcd(com,0x80+xxx);
else if(yyy==1) w_lcd(com,0x90+xxx);
else if(yyy==2) w_lcd(com,0x88+xxx);
else if(yyy==3) w_lcd(com,0x98+xxx);
}
void wn(uchar num1,uchar num2) //wtite nunbers or letters
{if(num1<10)
w_lcd(dat,num1+0x30);
else if(num1<16)
w_lcd(dat,num1+0x37);
else
w_lcd(dat,num1);
if(num2<10)
w_lcd(dat,num2+0x30);
else if(num2<16)
w_lcd(dat,num2+0x37);
else
w_lcd(dat,num2);
} //*/
void wc(uchar *chan) //writer charter
{
uchar i;
for(i=0;chan[i]!='\0';i++)
w_lcd(dat,chan[i]);
}
void wh(uchar const *chan) //write charter by look up table
{
uchar i;
uchar ttp;
ttp=pgm_read_byte(chan);
for(i=1;ttp!='\0';i++)
{
w_lcd(dat,ttp);
ttp=pgm_read_byte(chan+i);
}
}
void wu (uchar const *ch0, uchar const *ch1, uchar const *ch2, uchar const *ch3)
{
clr(1);
set(1);
go(0,0);
wh(ch0); //write line 0
go(0,1);
wh(ch1); //write line 1
go(0,2);
wh(ch2);
go(0,3);
wh(ch3);
}
void wp(void) //write piturn to lcd
{
uchar i,j;
w_lcd (com,0x34); //切换到扩展指令
for(j=0;j<32;j++)
{
w_lcd (com,0x80+j); //写Y地址
w_lcd (com,0x88); //写X地址
for(i=0;i<16;i++)
w_lcd(dat,disbuf[512+j*16+i]);// (dat,imge[j*16+i*2]); //写数据
}
for(j=0;j<32;j++)
{
w_lcd(com,0x80+j); //Y address
w_lcd(com,0x80); //X address
for(i=0;i<16;i++)
w_lcd(dat,disbuf[j*16+i]); //
}
w_lcd(com,0x36); //开显示
}
void piture(uchar const *imge) //write a piture
{
uint i;
for(i=0;i<1024;i++)
disbuf[i]=pgm_read_byte(imge+i);
wp();
}
void w16(void)
{
uchar i,j,k,t1;
uint t2;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<16;k++)
{
t1=ss[4*i+j];
t2=16*k+2*j+256*i;
if(t1!=0xff)
{
disbuf[t2] =pgm_read_byte(C1+32*t1+2*k);
disbuf[t2+1]=pgm_read_byte(C1+32*t1+2*k+1);
}
else
{
disbuf[t2]=0x00;
disbuf[t2+1]=0x00;
}
}
}
} //*/
}
void wsor(void) //write the cursor
{
uchar x,y,k;
uint t2;
x=sor%4;
y=sor/4;
if(sorf) //已选定
{
w16();
for(k=0;k<16;k++)
{
t2=16*k+2*x+256*y;
disbuf[t2]^=0xff; //反白
disbuf[t2+1]^=0xff;
}
set(1);
wp();
}
else //未选定, 显示光标
{
w16();
wp();
go(x,y);
set(2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -