⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr192.c

📁 用iccavr编写的at90s8515驱动19264液晶片的源程序avr192
💻 C
字号:
/*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。
/*		 CKW19264A接口程序(模拟方式)
液晶模块供应商:广州市盛宝电子有限公司	Tel:020-87592491 Fax:87541571
	Email:	tinsharp@public.guangzhou.gd.cn
;************************************************************************
;连线图:
;*LCM----S8515*	  *LCM----S8515*   *LCM-----S8515*     *LCM-----S8515*	*
;*DB0-----PA0*	  *DB4-----PA4*	   *D/I------PC6*      *CS1------PC4*	*
;*DB1-----PA1*	  *DB5-----PA5*	   *R/W------PC7*      *CS2------PC5*	*
;*DB2-----PA2*	  *DB6-----PA6*	   *RST------VCC*      *CS3------PD2*	* 
;*DB3-----PA3*	  *DB7-----PA7*	   *E--------PC3*			*
;注:S8515的晶振频率为4MHz						*
;************************************************************************/
#pragma	interrupt_handler timer:7	/*TC1溢出中断		*/
#include <io8515.h>
#include <macros.h>
#include <worddot.h>	/*   自定义字符点阵码文件,存于include目录下	*/
//#include <math.h>	/*   数学运算定义,没有使用	*/
#define	Uchar unsigned char

/***********液晶显示器接口引脚定义***************/

#define	LCD_E  (1 << 3)					// PC3----E
#define	LCD_DI (1 << 6)					// PC6----D/I
#define	LCD_RW (1 << 7)					// PC7----R/W
#define	LCD_CS1	(1 << 4)				// PC4----CS1
#define	LCD_CS2	(1 << 5)				// PC5----CS2
#define	LCD_CS3	(1 << 2)				// PD2----CS3
#define	lcd_set_e()  (PORTC |= LCD_E)			// 位置位,输出1
#define	lcd_set_di() (PORTC |= LCD_DI)
#define	lcd_set_rw() (PORTC |= LCD_RW)
#define	lcd_clear_e()  (PORTC &= ~LCD_E)		// 位清零,输出0
#define	lcd_clear_di() (PORTC &= ~LCD_DI)
#define	lcd_clear_rw() (PORTC &= ~LCD_RW)
#define	lcd_set_cs1() (PORTC |=	LCD_CS1)		// 片选
#define	lcd_set_cs2() (PORTC |=	LCD_CS2)
#define	lcd_set_cs3() (PORTD |=	LCD_CS3)
#define	lcd_clear_cs1()	(PORTC &= ~LCD_CS1)
#define	lcd_clear_cs2()	(PORTC &= ~LCD_CS2)
#define	lcd_clear_cs3()	(PORTD &= ~LCD_CS3)
#define	 LCD_BUSY	0x80				//LCM忙判断位
#define	lcd_read_status() (PINA	&= LCD_BUSY)		//LCM忙判断
#define	Datalcm	PORTA					//数据口

/***********常用操作命令和参数定义***************/
#define	 DISPON		0x3f	/*显示on		*/
#define	 DISPOFF	0x3e	/*显示off		*/
#define	 DISPFIRST	0xc0	/*显示起始行定义	*/
#define	 SETX		0x40	/*X定位设定指令(页)	*/
#define	 SETY		0xb8	/*Y定位设定指令(列)	*/

/**************显示分区边界位置*****************/
#define	 MODL		0x00	/*左区			*/
#define	 MODM		0x40	/*左区和中区分界	*/
#define	 MODR		0x80	/*中区和右区分界	*/
#define	 LCMLIMIT	0xC0	/*显示区的右边界	*/

/****************全局变量定义*******************/
Uchar col,row,cbyte,timer1,timer2,statusm;		/*列x,行(页)y,输出数据	*/
unsigned int speed=0x7fff;

/*****************函数列表**********************/
void Lcminit(void);		/*液晶模块初始化	*/
void Delay(Uchar);		/*延时,入口数为Ms	*/
void lcdbusyL(void);		/*busy判断、等待(左区)	*/
void lcdbusyM(void);		/*busy判断、等待(中区)	*/
void lcdbusyR(void);		/*busy判断、等待(右区)	*/
void Putedot(Uchar x,Uchar y,Uchar flash *Lib,Uchar Order,Uchar	widthw);
void Wrdata(Uchar);		/*数据输出给LCM		*/
void Lcmcls( void );		/*LCM全屏幕清零(填充0)	*/
void wtcom(void);		/*公用busy等待		*/
void Locatexy(void);		/*光标定位		*/
void WrcmdL(Uchar);		/*左区命令输出		*/
void WrcmdM(Uchar);		/*中区命令输出		*/
void WrcmdR(Uchar);		/*右区命令输出		*/
void Putstr(Uchar x,Uchar y,Uchar flash	*puts,Uchar i);/*字符串输出*/
void Rollscreen(Uchar x);	/*屏幕向上滚动演示	*/
void Rddata(void);		/*  从液晶片上读数据	*/
void point(void);		/*打点			*/
void Linexy(Uchar x0,Uchar y0,Uchar xt,Uchar yt);
void main_init(void);
void timer(void);
void circle(Uchar Ox,Uchar Oy,Uchar Rx);
/******************数组列表*********************/
Uchar flash Ezk[];		/*ASCII常规字符点阵码表	*/
Uchar flash Hzk[];		/*自用汉字点阵码表	*/
Uchar flash STR1[];		/*自定义字符串		*/
Uchar flash STR2[];		//flash	"=" code(keil c51)
Uchar flash STR3[];		//
Uchar flash STR4[];		//


/********************************/
/* 演示主程序			*/
/********************************/
void main(void)

{
	Uchar x=0;
	DDRD   = 0xFF;		/*|= LCD_CS3;	/*定义输出位			*/
	DDRC   = 0xFF;		/*定义为输出口			*/
	statusm&=0<<7;
	main_init();
	Delay(5);		/*延时,等待外设准备好		*/
	Lcminit();		/*液晶模块初始化,包括全屏幕清屏*/
	Putstr(0,0,STR3,24);	/*第一行字符输出,24字节	*/
	Putstr(0,2,STR1,12);	/*第二行字符输出,12字节(汉字)*/
//	Putstr(0,4,STR3,24);	/*第三行字符输出,24字节	*/
//	Putstr(0,6,STR4,24);	/*第四行字符输出,12字节	*/

	Linexy(0,0,191,0);		/*line (0,0)-(191,0)	*/
	Linexy(191,0,191,32);		/*line (191,0)-(191,32)	*/
	Linexy(191,32,0,32);		/*line (191,32)-(0,32)	*/
	Linexy(0,32,0,0);		/*line (0,32)-(0,0)	*/
	Linexy(1,15,191,15);		/*line (1,15)-(191,15)	*/
	Linexy(0,63,44,33);		/*line (0,63)-(44,33)	*/
	Linexy(44,33,191,63);		/*line (44,33)-(191,63)	*/
	circle(46,49,12);	//画一个圆
	circle(46,49,11);

//	statusm|=1<<7;

	while(1){
//		Rollscreen(x);		/*定位新的显示起始行	*/
		x++;
		Delay(20);		/*延时,控制滚动速度	*/
		};
}

/***************************
   初始化8515定时寄存器
***************************/
void main_init(void)
{
	TCCR1A = 0x00;
	TCCR1B = 0x00;		/* 停止定时器1			*/
	TCNT1H = 0x00;		/* 清除定时器1			*/
	TCNT1L = 0x00;
	TIMSK  = 0x80;		/* 开放定时器1溢出中断		*/
	SREG  |= 0x80;
	TCCR1B = 0x01;		/* 启动定时器1,预分频比例1	*/
}
/*************************************
   在定时器中断中做多个分级定时
*************************************/
void timer()
{
	timer1--;
	if (timer2<0x80) speed+=0x100;
	else speed-=0x200;
	if (statusm&0x80){	
	timer2++;
	col = (speed>>8)|timer1;
	row = (timer2&0x1f)+32;
	point();}
}


/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2		*/
/************************************************/

void circle(Uchar Ox,Uchar Oy,Uchar Rx)
{
	unsigned int xx,rr,xt,yt,rs;
	yt=Rx;
	rr=Rx*Rx+1;			//补偿 1 修正方形
	rs=(yt+(yt>>1))>>1;		//(*0.75)分开1/8圆弧来画
	for (xt=0;xt<=rs;xt++)
	{
		xx=xt*xt;
		while ((yt*yt)>(rr-xx))yt--;
		col=Ox+xt;		//第一象限
		row=Oy-yt;
		point();
		col=Ox-xt;		//第二象限
		point();
		row=Oy+yt;		//第三象限
		point();
		col=Ox+xt;		//第四象限
		point();

/***************45度镜象画另一半***************/

		col=Ox+yt;		//第一象限
		row=Oy-xt;
		point();
		col=Ox-yt;		//第二象限
		point();
		row=Oy+xt;		//第三象限
		point();
		col=Ox+yt;		//第四象限
		point();
	}
}

				
/************************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1	*/
/************************************************/
void Linexy(Uchar x0,Uchar y0,Uchar xt,Uchar yt)
{
	register Uchar t;
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int incx,incy;

	delta_x=xt-x0;				/*计算坐标增量	*/
	delta_y=yt-y0;
	col = x0;
	row = y0;
	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++ )	{	/*画线输出	*/
		point();			/*画点		*/
		xerr +=	delta_x	;
		yerr +=	delta_y	;
		
		if( xerr > distance ) {
			xerr-=distance;
			col+=incx;
		}
		if( yerr > distance ) {
			yerr-=distance;
			row+=incy;
		}
	}
}

/****************************************/
/*	画点				*/
/****************************************/

void point(void)
	{
		Uchar	x1,y1,x,y;
		x1=col;
		y1=row;
		row=y1>>3;		/*取Y方向分页地址	*/
		Rddata();
		y=y1&0x07;		/*字节内位置计算	*/
		Wrdata(cbyte|1<<y);	/*画上屏幕		*/
		col=x1;			/*恢复xy坐标		*/
		row=y1;
	}

/****************************************/
/*	屏幕滚动定位			*/
/****************************************/
void Rollscreen(Uchar x)
	{
		cbyte =	DISPFIRST|x;	/*定义显示起始行为x

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -