📄 lcd.c
字号:
void bmp_tran(unsigned char x,unsigned char y,unsigned char high,unsigned char width,const unsigned char *bmp_p)
{
unsigned char i,j;
x+=4;
for(j=0;j<high;j++)
{
for(i=0;i<width;i++)
{
ocmj_write(0xf3);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*bmp_p);
bmp_p++;
x++;
}
x-=width;
y++;
}
}
/* 传送LCD内部汉字数据到LCD */
/* x:0x00~0x07 y:0x00~0x03 */
void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
{
x+=2;
while((*hz_p)!=0)
{
ocmj_write(0xf0);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*hz_p-0xa0);
hz_p++;
ocmj_write(*hz_p-0xa0);
hz_p++;
if(x<0x09)
x++;
else
{
x=0x02;
y++;
}
}
}
/* 传送ASCII字母到LCD */
/* x:0x00~0x0f y:0~64 */
void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
{
x+=4;
while((*asc_p)!=0)
{
ocmj_write(0xf1);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*asc_p);
asc_p++;
if (x<0x13)
x++;
else
{
x=0x04;
y+=8;
}
}
}
/* 画点函数 */
void pset(unsigned char x,unsigned char y)
{
ocmj_write(0xf2);
ocmj_write(x+32);
ocmj_write(y);
}
/* 画线函数 */
void line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
{
unsigned char t;
signed int xerr=0,yerr=0;
signed int delta_x,delta_y,distance;
signed char incx,incy;
/* 计算两个方向的长度 */
delta_x=x2-x1;
delta_y=y2-y1;
/* 计算增量的方向,增量为"0"表示为垂直或水平线 */
if(delta_x>0)
incx=1;
else
{
if( delta_x==0 )
incx=0;
else
{
incx=-1;
delta_x =-delta_x;
}
}
if(delta_y>0)
incy=1;
else
{
if( delta_y==0 )
incy=0;
else
{
incy=-1;
delta_y =-delta_y;
}
}
/* 确定画线的范围 */
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
/* 画线 */
for(t=0;t<= distance+1;t++)
{
ocmj_write(0xf2);
ocmj_write(x1+32);
ocmj_write(y1);
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
x1+=incx;
}
if( yerr > distance )
{
yerr-=distance;
y1+=incy;
}
}
}
/* 画圆函数 */
void circle(unsigned char x0,unsigned char y0,unsigned char r)
{
unsigned char x,y;
unsigned int xx,rr,xt,yt,rs;
yt=r;
rr=r*r+1; //补偿 1 修正方形
rs=yt*3/4; //画8分之一圆弧
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))
yt--;
x=x0+xt; //第一象限
y=y0-yt;
pset(x,y);
x=x0-xt; //第二象限
pset(x,y);
y=y0+yt; //第三象限
pset(x,y);
x=x0+xt; //第四象限
pset(x,y);
/******45度镜象画另外8分之一圆弧******/
x=x0+yt; //第一象限
y=y0-xt;
pset(x,y);
x=x0-yt; //第二象限
pset(x,y);
y=y0+xt; //第三象限
pset(x,y);
x=x0+yt; //第四象限
pset(x,y);
}
}
void putchar(unsigned char newx,unsigned char newy,unsigned char data)
{
static unsigned char x,y;
if(newx<16)
x=newx+4;
if(newy<64)
y=newy;
ocmj_write(0xf1);
ocmj_write(x);
ocmj_write(y);
ocmj_write(data);
if (x<0x13)
x++;
else
{
x=0x04;
if(y<56)
y+=8;
else
{
ocmj_write(0xf4);
y=0;
}
}
}
/* MAIN入口 */
void main(void)
{
unsigned char i;
CLI();
XDIV = 0x00;
MCUCR = 0x00;
EICRB = 0x00; //external interrupts sources
EIMSK = 0x00;
ocmj_init();//初始化
timer0_init();
timer2_init();
init_kb();
TIMSK = 0x01; //timer interrupt sources
EIMSK=0x10;
DDRF=0x00;
PORTF=0xfc;
adc1=0;
adc2=0;
ADMUX=0;
ADCSRA=0xdf;
timecal();
SEI();
DDRB=0x80;
while(1)
{
ocmj_write(0xf4);//清屏
/*debug
hz_tran(1,0,"测试扫描码");
while(1)
{
cls(0,1,3,8);
asc_tran(0,16,kb_buffer);
delay_ms(100);
}
debug*/
ico_tran(0,0,sl_ico);//传送图标,也可用bmp_tran()传送
hz_tran(3,0,"广州大华");//传送内部汉字
hz_tran(2,1,"电子有限公司");
asc_tran(5,39,"HTTP://");//传送ASCII字符
asc_tran(2,50,"WWW.SL.COM.CN");
delay_ms(2000);//延时
ocmj_write(0xf4);//清屏
bmp_tran(4,2,60,8,hz1);//传送汉字"和"
delay_ms(3000);
ocmj_write(0xf4);
bmp_tran(1,3,49,13,atmel_bmp);//传送ATMEL标志图形
asc_tran(2,54,"WWW.ATMEL.COM");
delay_ms(3000);
ocmj_write(0xf4);
bmp_tran(2,15,33,4,hz2);//传送汉字"欢"
bmp_tran(6,15,33,4,hz3);//传送汉字"迎"
bmp_tran(10,15,33,4,hz4);//传送汉字"您"
hz_tran(0,0,"恭");
hz_tran(0,1,"祝");
hz_tran(0,2,"各");
hz_tran(0,3,"位");
hz_tran(7,0,"万");
hz_tran(7,1,"事");
hz_tran(7,2,"如");
hz_tran(7,3,"意");
delay_ms(3000);
for(i=0;i<32;i++)
{
ocmj_write(0xf4);
line(i*2,32,64,i);
line(64,i,(127-i*2),32);
line((127-i*2),32,64,(63-i));
line(64,(63-i),i*2,32);
delay_ms(100);
}
for(i=0;i<32;i++)
{
ocmj_write(0xf4);
circle(63,31,i);
delay_ms(100);
}
ocmj_write(0xf4);
hz_tran(2,0,"测量电压");
hz_tran(1,1,"第一路");
hz_tran(1,2,"第二路");
for(i=0;i<100;i++)
{
cls(4,1,2,3);
asc_tran(8,22,adctoasc(adc1));
asc_tran(8,38,adctoasc(adc2));
timetoasc();
delay_ms(200);
}
ocmj_write(0xf4);
asc_tran(2,5,"PC");
hz_tran(2,0,"机键盘输入");
hz_tran(0,1,"按");
asc_tran(2,21,"DEL");
hz_tran(3,1,"键重新启动");
cls(0,2,2,8);
putchar(0,32,':');
putchar(99,99,'>');
keytime=0;
do{
i=getchar();
if(i!=0)
putchar(99,99,i);
}
while(keytime<20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -