?? avr192.c
字號:
/*寫漢字液晶子程 液晶屏分為4行*12列漢字,全部使用模擬接口方式。
/* CKW19264A接口程序(模擬方式)
液晶模塊供應(yīng)商:廣州市盛寶電子有限公司 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> /* 數(shù)學(xué)運算定義,沒有使用 */
#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 //數(shù)據(jù)口
/***********常用操作命令和參數(shù)定義***************/
#define DISPON 0x3f /*顯示on */
#define DISPOFF 0x3e /*顯示off */
#define DISPFIRST 0xc0 /*顯示起始行定義 */
#define SETX 0x40 /*X定位設(shè)定指令(頁) */
#define SETY 0xb8 /*Y定位設(shè)定指令(列) */
/**************顯示分區(qū)邊界位置*****************/
#define MODL 0x00 /*左區(qū) */
#define MODM 0x40 /*左區(qū)和中區(qū)分界 */
#define MODR 0x80 /*中區(qū)和右區(qū)分界 */
#define LCMLIMIT 0xC0 /*顯示區(qū)的右邊界 */
/****************全局變量定義*******************/
Uchar col,row,cbyte,timer1,timer2,statusm; /*列x,行(頁)y,輸出數(shù)據(jù) */
unsigned int speed=0x7fff;
/*****************函數(shù)列表**********************/
void Lcminit(void); /*液晶模塊初始化 */
void Delay(Uchar); /*延時,入口數(shù)為Ms */
void lcdbusyL(void); /*busy判斷、等待(左區(qū)) */
void lcdbusyM(void); /*busy判斷、等待(中區(qū)) */
void lcdbusyR(void); /*busy判斷、等待(右區(qū)) */
void Putedot(Uchar x,Uchar y,Uchar flash *Lib,Uchar Order,Uchar widthw);
void Wrdata(Uchar); /*數(shù)據(jù)輸出給LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void wtcom(void); /*公用busy等待 */
void Locatexy(void); /*光標(biāo)定位 */
void WrcmdL(Uchar); /*左區(qū)命令輸出 */
void WrcmdM(Uchar); /*中區(qū)命令輸出 */
void WrcmdR(Uchar); /*右區(qū)命令輸出 */
void Putstr(Uchar x,Uchar y,Uchar flash *puts,Uchar i);/*字符串輸出*/
void Rollscreen(Uchar x); /*屏幕向上滾動演示 */
void Rddata(void); /* 從液晶片上讀數(shù)據(jù) */
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);
/******************數(shù)組列表*********************/
Uchar flash Ezk[]; /*ASCII常規(guī)字符點陣碼表 */
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); /*延時,等待外設(shè)準(zhǔn)備好 */
Lcminit(); /*液晶模塊初始化,包括全屏幕清屏*/
Putstr(0,0,STR3,24); /*第一行字符輸出,24字節(jié) */
Putstr(0,2,STR1,12); /*第二行字符輸出,12字節(jié)(漢字)*/
// Putstr(0,4,STR3,24); /*第三行字符輸出,24字節(jié) */
// Putstr(0,6,STR4,24); /*第四行字符輸出,12字節(jié) */
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,預(yù)分頻比例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();}
}
/************************************************/
/*畫圓。數(shù)學(xué)方程(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();
}
}
/************************************************/
/*畫線。任意方向的斜線,直線數(shù)學(xué)方程 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; /*計算坐標(biāo)增量 */
delta_y=yt-y0;
col = x0;
row = y0;
if(delta_x>0) incx=1; /*設(shè)置單步方向 */
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; /*選取基本增量坐標(biāo)軸*/
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; /*字節(jié)內(nèi)位置計算 */
Wrdata(cbyte|1<<y); /*畫上屏幕 */
col=x1; /*恢復(fù)xy坐標(biāo) */
row=y1;
}
/****************************************/
/* 屏幕滾動定位 */
/****************************************/
void Rollscreen(Uchar x)
{
cbyte = DISPFIRST|x; /*定義顯示起始行為x
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -