#define __SRC<br />#include "iom128v.h"<br />#include "Init_cpu_Atmega128v.h"<br />#include "tongxun.h"<br />#include "macros.h"<br />#include "delay.h"<br />#include "i2c.h"<br />#include "ks0108a.h"<br />#include "ziku.h"<br />#undef __SRC<br /><br />#define LCD PORTC<br /><br />/********************引脚定义********************/<br />#define Lcd_rs_0 PORTA&=~(1<<PA0)<br />#define Lcd_rs_1 PORTA|=(1<<PA0) //数据指令<br /><br />#define Lcd_rw_0 PORTA&=~(1<<PA1)<br />#define Lcd_rw_1 PORTA|=(1<<PA1) //数据指令<br /><br />#define Lcd_e_0 PORTA&=~(1<<PA2)<br />#define Lcd_e_1 PORTA|=(1<<PA2) //数据指令<br /><br />#define Lcd_csL_0 PORTA&=~(1<<PA5)<br />#define Lcd_csL_1 PORTA|=(1<<PA5) //数据指令<br /><br />#define Lcd_csM_0 PORTA&=~(1<<PA4)<br />#define Lcd_csM_1 PORTA|=(1<<PA4) //数据指令<br /><br />#define Lcd_csR_0 PORTA&=~(1<<PA3)<br />#define Lcd_csR_1 PORTA|=(1<<PA3) //数据指令<br /><br />unsigned char a=0;<br /><br />void wtcom(void);<br />void BusyL(void);<br />void BusyM(void);<br />void BusyR(void);<br />void WriteCommandL(unsigned char CommandByte);<br />void WriteCommandM(unsigned char CommandByte);<br />void WriteCommandR(unsigned char CommandByte);<br />void WriteCommand( unsigned char CommandByte );<br /><br />/***************************/<br />/*检查Busy */<br />/***************************/<br />void BusyL(void)<br />{<br /> Lcd_csL_0;<br /> Lcd_csM_1;<br /> Lcd_csR_1;<br /> wtcom();<br />}<br /><br />void BusyM(void)<br />{<br /> Lcd_csL_1;<br /> Lcd_csM_0;<br /> Lcd_csR_1;<br /> wtcom();<br />}<br /><br />void BusyR(void)<br />{<br /> Lcd_csL_1;<br /> Lcd_csM_1;<br /> Lcd_csR_0;<br /> wtcom();<br />}<br /><br />void wtcom(void)<br />{<br /> unsigned char busy;<br /> DDRC=0x00;<br /> do<br /> {<br /> Lcd_rs_0; //指令<br /> Lcd_rw_1;<br /> Lcd_e_1;<br /> delay(2);<br /> a=PINC&0xa0;<br /> busy=PINC&0x80;<br /> Lcd_e_0;<br /> delay(2);<br /> }<br /> while(!(busy==0x00)); //Status Read Bit7 = BUSY<br /> DDRC=0xff;<br />}<br /><br />/***************************/<br />/*写指令 */<br />/***************************/<br />void WriteCommandL( unsigned char CommandByte )<br />{<br /> BusyL();<br /> WriteCommand(CommandByte);<br />}<br /><br />void WriteCommandM( unsigned char CommandByte )<br />{<br /> BusyM();<br /> WriteCommand(CommandByte);<br />}<br /><br />void WriteCommandR( unsigned char CommandByte )<br />{<br /> BusyR();<br /> WriteCommand(CommandByte);<br />}<br /><br />void WriteCommand( unsigned char CommandByte )<br />{<br /> Lcd_rs_0; //指令<br /> Lcd_rw_0;<br /> delay(2);<br /> LCD = CommandByte;<br /> Lcd_e_1;<br /> delay(2);<br /> Lcd_e_0;<br /> delay(2);<br />}<br /><br />unsigned char ReadData_Command(void)<br />{ <br /> unsigned char DataByte;<br /> DDRC=0x00;<br /> Lcd_rs_1; /*数据输出*/<br /> Lcd_rw_1; /*读入 */<br /> Lcd_e_1; /*读入到LCM*/<br /> delay(2);<br /> DataByte = PINC; /*数据读出到数据口P1 */<br /> Lcd_e_0;<br /> delay(2);<br /> DDRC=0xff;<br /> return DataByte;<br />}<br /><br />void WriteData_dot(unsigned char x,unsigned char y,unsigned char cls)<br />{<br /> unsigned char temp;<br /> switch(x/64)<br /> {<br /> case 0: BusyL();<br /> break;<br /> case 1: BusyM();<br /> break;<br /> case 2: BusyR();<br /> break;<br /> default: break;<br /> }<br /> WriteCommand((0xb8|((y/8)&0x07)));<br /> WriteCommand((0x40|(x&0x3f)));<br /> temp=ReadData_Command();<br /> WriteCommand((0xb8|((y/8)&0x07)));<br /> WriteCommand((0x40|(x&0x3f)));<br /> temp=ReadData_Command();<br /> WriteCommand((0xb8|((y/8)&0x07)));<br /> WriteCommand((0x40|(x&0x3f)));<br /> if((cls&0x01)==0) temp=temp&(~(01<<(y%8)));<br /> else temp=temp|(01<<(y%8));<br /> Lcd_rs_1; /*数据输出*/<br /> Lcd_rw_0; /*写输出 */<br /> delay(2);<br /> LCD = temp; /*数据输出到数据口 */<br /> Lcd_e_1; /*写入到LCM*/<br /> delay(2);<br /> Lcd_e_0;<br /> delay(2);<br />}<br /><br />void WriteData_H12(unsigned char x,unsigned char y,unsigned int dat,unsigned char cls)<br />{<br /> unsigned char i;<br /> for(i=0;i<12;i++)<br /> {<br /> if((dat&0x01)==1)<br /> {<br /> WriteData_dot(x,y,cls);<br /> }<br /> //else WriteData_dot(x,y,~cls);<br /> y++;<br /> dat>>=1;<br /> }<br />}<br /><br />/********************************************************/<br />/* 液晶清屏函数 */<br />/********************************************************/<br />void LcmClear(unsigned char xs,unsigned char ys,unsigned char xe,unsigned char ye,unsigned char cls)<br />{<br /> unsigned char i,j;<br /> for(j=ys;ye>=j;j++)<br /> {<br /> for(i=xs;xe>=i;i++)<br /> {<br /> WriteData_dot(i,j,cls);<br /> }<br /> }<br />}<br /><br />void LcdClear(void)<br />{<br /> unsigned char i,j;<br /> Lcd_csL_0;<br /> Lcd_csM_1;<br /> Lcd_csR_1;<br /> delay_us(1);<br /> delay_us(1);<br /> delay_us(1);<br /> for(j=0;j<8;j++)<br /> {<br /> WriteCommand(0xB8+j);<br /> WriteCommand(0x40); <br /> for(i=0;i<64;i++)<br /> {<br /> Lcd_rs_1; /*数据输出*/<br /> Lcd_rw_0; /*写输出 */<br /> delay(1);<br /> LCD = 0x00; /*数据输出到数据口 */<br /> Lcd_e_1; /*写入到LCM*/<br /> delay(1);<br /> Lcd_e_0;<br /> delay(2);<br /> }<br /> }<br />}<br /><br />/********************************************************/<br />/* 液晶初始化函数 */<br />/********************************************************/<br />void LcmInit(unsigned char cls)<br />{<br /> Lcd_csL_0;<br /> Lcd_csM_0;<br /> Lcd_csR_0;<br /> WriteCommand(0x3E); //开显示<br /><br /> WriteCommand(0xc0); //设置起始地址=0<br /> <br /> WriteCommand(0x40); //设置起始地址=0<br /><br /> WriteCommand(0x3f); //开显示<br /><br /> LcmClear(0,0,191,63,cls);<br /> //LcdClear();<br />}<br /><br />void HZ_xianshi12x12(unsigned char x,unsigned char y,unsigned char cls,unsigned char *ptr)<br />{<br /> unsigned char i,j,k,c1,c2,uLen;<br /> i=0;<br /> uLen=0;<br /> while (ptr[uLen]!=0)<br /> {<br /> uLen++;<br /> };<br /> while(i<uLen)<br /> {<br /> c1 = ptr;<br /> c2 = ptr[i+1];<br /> //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码<br /> if(c1 <=128) // ASCII<br /> {<br /> for(j=0;j<6;j++)<br /> {<br /> WriteData_H12(x+j,y,ASC_MSK[(c1-0x30)*6+j],cls);<br /> }<br /> x+=6;<br /> i++;<br /> }<br /> else // 中文<br /> {<br /> for(j=0;j<sizeof(GB_12)/sizeof(struct typFNT_GB12);j++) // 查找定位<br /> {<br /> if(c1 == GB_12[j].Index[0] && c2 == GB_12[j].Index[1])<br /> break;<br /> }<br /> if(j < sizeof(GB_12)/sizeof(GB_12[0]))<br /> {<br /> for(k=0;k<12;k++)<br /> {<br /> WriteData_H12(x+k,y,GB_12[j].Msk[k],cls);<br /> }<br /> }<br /> x+=12;<br /> i+=2;<br /> }<br /> }<br />}<br /><br />/************************************************/<br />/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */<br />/************************************************/<br />void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)<br />{<br /> register unsigned char t;<br /> int xerr=0,yerr=0,delta_x,delta_y,distance;<br /> int incx,incy,uRow,uCol;<br /><br /> delta_x = xt-x0; //计算坐标增量<br /> delta_y = yt-y0;<br /> uRow = x0;<br /> uCol = y0;<br /> if(delta_x>0) incx=1; //设置单步方向<br /> else if( delta_x==0 ) incx=0; //垂直线<br /> else {incx=-1;delta_x=-delta_x;}<br /><br /> if(delta_y>0) incy=1;<br /> else if( delta_y==0 ) incy=0; //水平线<br /> else {incy=-1;delta_y=-delta_y;}<br /><br /> if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴<br /> else distance=delta_y;<br /><br /> for( t=0;t <= distance+1; t++ )<br /> { //画线输出<br /> WriteData_dot(uRow,uCol,s); //画点<br /> xerr += delta_x ;<br /> yerr += delta_y ;<br /><br /> if( xerr > distance )<br /> {<br /> xerr-=distance;<br /> uRow+=incx;<br /> }<br /> if( yerr > distance )<br /> {<br /> yerr-=distance;<br /> uCol+=incy;<br /> }<br /> }<br />}<br /><br />void Display_num6X12(unsigned char x,unsigned char y,unsigned char dat,unsigned char cls)<br />{<br /> switch(dat&0x0f)<br /> {<br /> case 0: HZ_xianshi12x12(x,y,cls,"0");<br /> break;<br /> case 1: HZ_xianshi12x12(x,y,cls,"1");<br /> break;<br /> case 2: HZ_xianshi12x12(x,y,cls,"2");<br /> break;<br /> case 3: HZ_xianshi12x12(x,y,cls,"3");<br /> break;<br /> case 4: HZ_xianshi12x12(x,y,cls,"4");<br /> break;<br /> case 5: HZ_xianshi12x12(x,y,cls,"5");<br /> break;<br /> case 6: HZ_xianshi12x12(x,y,cls,"6");<br /> break;<br /> case 7: HZ_xianshi12x12(x,y,cls,"7");<br /> break;<br /> case 8: HZ_xianshi12x12(x,y,cls,"8");<br /> break;<br /> case 9: HZ_xianshi12x12(x,y,cls,"9");<br /> break;<br /> default: break;<br /> }<br />}<br /><br /><br /><br />/*<br />void Display_1data(unsigned char x,unsigned char y,unsigned char dat)<br />{<br /> Display_num8X16(x,y,((dat>>4)&0x0f));<br /> Display_num8X16(x+8,y,((dat)&0x0f));<br />}<br />*/<br /><br />void Display_2data(unsigned char x,unsigned char y,unsigned int dat,unsigned char cls)<br />{<br /> Display_num6X12(x,y,((dat%10000)/1000),cls);<br /> Display_num6X12(x+6,y,((dat%1000)/100),cls);<br /> Display_num6X12(x+12,y,((dat%100)/10),cls);<br /> Display_num6X12(x+18,y,((dat%10)),cls);<br />}<br /><br />void Display_4data(unsigned char x,unsigned char y,unsigned long dat,unsigned char cls)<br />{<br /> Display_num6X12(x,y,((dat%10000000)/1000000),cls);<br /> Display_num6X12(x+6,y,((dat%1000000)/100000),cls);<br /> Display_num6X12(x+12,y,((dat%100000)/10000),cls);<br /> Display_num6X12(x+18,y,((dat%10000)/1000),cls);<br /> Display_num6X12(x+24,y,((dat%1000)/100),cls);<br /> Display_num6X12(x+30,y,((dat%100)/10),cls);<br /> Display_num6X12(x+36,y,((dat%10)),cls);<br />}
|