搜索
bottom↓
回复: 64

ks0108 12864 液晶的C语言驱动(ICCAVR)

[复制链接]

出0入0汤圆

发表于 2005-4-16 16:32:52 | 显示全部楼层 |阅读模式
采用了小字体,可以显示5行汉字

参考网上的资料和ICCAVR的资料,编写的ks0108的驱动,在ICCAVR 6.31下编译,用AVR-51多功能试验板调试通过,请帮忙测试,多多指正。

点击此处下载armok0145742.txt

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2005-4-16 19:16:02 | 显示全部楼层
太好了,,收下了!

出0入0汤圆

发表于 2005-5-8 12:33:44 | 显示全部楼层
我想知道:第三脚V0输入电压是不是:“负电压调节”就是在第3脚V0上加上负电压啊,范围是多少?

出0入0汤圆

发表于 2005-5-8 18:42:11 | 显示全部楼层
怎么不见mian函数呢.可以给个完整的实例吗?

出0入0汤圆

 楼主| 发表于 2005-5-10 11:03:17 | 显示全部楼层
电路已经拆掉了,没有记录第三脚负电压是多少,你先调到整屏都显示黑块,再调到黑块刚好消失就差不多了.

关于示例:

先设端口,再初始化液晶,显示,以下供参考

void main()

{

init_port();//自己加,主要是控制线所在端口为输出

init_lcd();

SetRowCol(1,0,);//在第1行,0的位置(范围:0-127)

disp_str("12345");

SetRowCol(2,70,);//在第2行,70的位置

disp_ch('9');

SetRowCol(2,30,);//在第5行,30的位置

disp_str("公司");

while(1);

}

希望多实验,发现问题.

出0入0汤圆

发表于 2005-5-12 10:16:17 | 显示全部楼层
下面是WINAVR上的改动后程序,调试通过!

要注意的问题:在读ROM区字节时候:用pgm_read_byte(lib) 与pgm_read_byte(lib + i)的结果是不同的,虽然在语法上是一样的.



/*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。

         CKW19264A接口程序(模拟方式)

液晶模块供应商:上海市HENGFANG电子有限公司        HTTP://WWW.HENGFANG.COM.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*                        *

;注:Mega16的晶振频率为4MHz                                                *

;************************************************************************/

#include <avr\io.h>

#include <avr\pgmspace.h>

#include <avr\delay.h>

#include "worddot.h"        // 自定义字符点阵码文件,存于include目录下

//#include <math.h>            // 数学_运算定义,没有使用



#define CRYSTAL 4       //4M crystal

typedef unsigned char uchar;



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



#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, const prog_uchar *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, const prog_uchar *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);



/******************数组列表*********************/

//const prog_uchar Ezk[];                /*ASCII常规字符点阵码表        */

//const prog_uchar Hzk[];                /*自用汉字点阵码表        */

//const prog_uchar STR1[];                /*自定义字符串                */

//const prog_uchar STR2[];                //const prog_uchar        "=" code(keil c51)

//const prog_uchar STR3[];                //

//const prog_uchar STR4[];                //

/********************************/

//定义字符串数组                */

/********************************/



const prog_uchar STR1[]=

{

        0x80,0x81,0x82,0x83,0x84,0x85,

        0x86,0x87,0x88,0x89,0x8a,0x8B

};

                       

const prog_uchar STR2[] = "http://www.xiao-qi.com/ ";

const prog_uchar STR3[] = "Program by ICCAVR V6.23B";

const prog_uchar STR4[] = "Thank you __@ 1234567890";



/********************************/

/* 演示主程序                        */

/********************************/

int main(void)

{

        uchar x=0;

   

        DDRD   = 0xFF;                //|= LCD_CS3;        /*定义输出位

        DDRC   = 0xFF;                /*定义为输出口                        */

        statusm&=~(1<<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);



        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, 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?*/

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

}



/****************************************/

/*        一个字串的输出                        */

/****************************************/

void Putstr(uchar x, uchar y, const prog_uchar *puts, uchar i)

{

        uchar j, wordx;



        for (j = 0; j < i; j++)

        {

        //wordx =        puts[j];

        wordx = pgm_read_byte(puts + j); //从ROM中取数据

        Delay(2);

                if (wordx & 0x80)

                {

                        Putedot(x, y, Hzk, wordx & 0x7f, 16);        /*只保留低7位        */

                }

                else

        {

            Putedot(x, y, Ezk, wordx - 0x20, 8);        /*ascii码表从0x20开始*/

        }

                x = col;

                y = row;

        }

}



/****************************************/

/*   字符点阵码数据输出                        */

/****************************************/

void Putedot(uchar x, uchar y, const prog_uchar *Lib, uchar Order, uchar widthw)

{

        uchar i;

        unsigned int xi;                        /*偏移量,字符量少的可以定义为Uchar        */



        col = x;                /*暂存x,y坐标,已备下半个字符使用        */

        row = y;

        xi = Order * (widthw << 1);                        // 每个字符widthw列

/****************上半个字符输出**************/

        for (i = 0; i < widthw; i++)

        {

                //cbyte =        Lib[xi];                // 取点阵码,rom数组       

        cbyte = pgm_read_byte(Lib + xi);

                Wrdata(cbyte);                        // 写输出一字节

                xi++;

                col++;

                if (col == LCMLIMIT)

        {

            col = 0;

            row += 2;

        }        /*下一列,如果列越界换行*/

                if (row > 7)

        {

            row = 0;                /*如果行越界,返回首行        */

        }

        }                                        /*上半个字符输出结束        */



        col = x;                                        /*列对齐                */

        row = y + 1;                                        /*指向下半个字符行        */

/****************下半个字符输出****************/

        for (i = 0; i < widthw; i++)

        {

                //cbyte =        Lib[xi];                                /*取点阵码                */

        cbyte = pgm_read_byte(Lib + xi);

                Wrdata(cbyte);                                /*写输出一字节                */

                xi++;

                col++;

                if (col == LCMLIMIT)

        {

            col = 0;

            row += 2;

        };        /*下一列,如果列越界换行*/

                if (row > 7)

        {

            row = 1;                /*如果行越界,返回首行        */

        }

        }                                        /*下半个字符输出结束        */

        row = y;

}                                                /*整个字符输出结束        */



/****************************************/

/*        清屏,全屏幕清零                */

/****************************************/

void Lcmcls( void )

{

        for (row = 0; row < 8; row++)

        {

        for (col = 0; col < LCMLIMIT; col++)

        {

            Wrdata(0);

        }

    }

}



/****************************************/

/*  从液晶片上读数据,保留在全局变量中        */

/****************************************/



void Rddata(void)

{

        Locatexy();                /*坐标定位,返回时保留分区状态不变        */

        DDRA = 0;        /*改变PA口的状态,作为输入口                */

        Datalcm = 0xFF;

        lcd_set_di();        /*数据                */

        lcd_set_rw();        /*读数据        */

        lcd_set_e();

        asm("NOP");                /*读入到LCM        */

        cbyte =        PINA;        /*虚读一次        */

        lcd_clear_e();

        Locatexy();                /*坐标定位,返回时保留分区状态不变        */

        DDRA = 0;

        Datalcm = 0xFF;

        lcd_set_di();        /*数据                */

        lcd_set_rw();        /*读数据        */

        lcd_set_e();

        asm("NOP");                /*读入到LCM        */

        cbyte =        PINA;        /*从数据口读数据,真读 */

        lcd_clear_e();

    asm("NOP");

        DDRA = 0xFF;        /*改变PA口的状态,作为输出口                */

}



/****************************************/

/*        数据写输出                        */

/****************************************/



void Wrdata(uchar X)

{

        Locatexy();                /*坐标定位,保留分区状态不变        */

        wtcom();

        lcd_set_di();                /*数据输出*/

        lcd_clear_rw();

        asm("NOP");                        /*写输出  */

        Datalcm        = X;                /*数据输出到数据口 */

        lcd_set_e();                /*LCM读入*/

        asm("NOP");

        lcd_clear_e();

}



/********************************/

/* 命令输出到左区控制口                */

/********************************/



void WrcmdL(uchar X)

{

        lcdbusyL();                /*确定分区,返回时保留分区状态不变*/

        lcd_clear_di();                        /*命令操作        */

        lcd_clear_rw();

    asm("NOP");                /*写输出        */

        Datalcm        = X;                        /*数据写到数据口 */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*LCM读入*/

}



/********************************/

/* 命令输出到中区控制口                */

/********************************/



void WrcmdM(uchar X)

{

        lcdbusyM();                /*确定分区,保留分区状态不变*/

        lcd_clear_di();                        /*命令操作        */

        lcd_clear_rw();

    asm("NOP");                /*写输出        */

        Datalcm        = X;                        /*命令写到数据口*/

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*LCM读入*/

}



/********************************/

/* 命令输出到右区控制口                */

/********************************/



void WrcmdR(uchar X)

{

        lcdbusyR();                /*确定分区,保留分区状态不变        */

        lcd_clear_di();                        /*命令操作                */

        lcd_clear_rw();

    asm("NOP");                /*写输出                */

        Datalcm        = X;                        /*命令输出到数据口        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*读入到LCM        */

}



/********************************************************/

/* 分区操作允许等待,返回时保留分区选择状态                */

/********************************************************/

void lcdbusyL(void)

{

    lcd_clear_cs1();        /*CLR        CS1                */

        lcd_set_cs2();                /*SETB        CS2                */

        lcd_set_cs3();                /*SETB        CS3                */

        wtcom();                /* waitting for        enable        */

}



void lcdbusyM(void)

{

    lcd_set_cs1();                /*SETB        CS1                */

        lcd_clear_cs2();        /*CLR        CS2                */

        lcd_set_cs3();                /*SETB        CS3                */

        wtcom();                /* waitting for        enable        */

}



void lcdbusyR(void)

{

        lcd_set_cs1();                /*SETB        CS1                */

        lcd_set_cs2();                /*SETB        CS2                */

        lcd_clear_cs3();        /*CLR        CS3                */

        wtcom();                /* waitting for        enable        */

}



void wtcom(void)

{

        DDRA = 0;

        lcd_clear_di();                /*CLR        DI                */

        lcd_set_rw();                /*SETB        RW                */

        Datalcm        = 0xFF;                /*MOV        DATA_LCM,#0FFH        */

        lcd_set_e();

    asm("NOP");

        while(lcd_read_status());

        lcd_clear_e();

        DDRA = 0xFF;

}



/********************************************************/

/*根据设定的坐标数据,定位LCM上的下一个操作单元位置        */

/********************************************************/

void Locatexy(void)

{

        uchar  x,y;



        switch (col & 0xc0)                /*  col.and.0xC0        */

        {                        /*条件分支执行                */

        case 0:               

        lcdbusyL();

        break;        /*左区        */

        case 0x40:       

        lcdbusyM();

        break;        /*中区        */

        case 0x80:       

        lcdbusyR();

        break;        /*右区        */

    default:

        break;

        }

        x = (col & 0x3F) | SETX;                /*  col.and.0x3f.or.setx        */

        y = (row & 0x07) | SETY;                /*  row.and.0x07.or.sety        */

        wtcom();                /*  waitting for enable                */

        lcd_clear_di();                        /*CLR        DI        */

        lcd_clear_rw();                        /*CLR        RW        */

        asm("NOP");

        Datalcm        = y;                        /*MOV        P0,Y        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();

        wtcom();                        /*  waitting for enable        */

        lcd_clear_di();                        /*CLR        DI        */

        lcd_clear_rw();                        /*CLR        RW        */

        asm("NOP");

        Datalcm        = x;                        /*MOV        P0,X        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();

}



/********************************/

/*液晶屏初始化                        */

/********************************/



void Lcminit(void)

{

        cbyte =        DISPOFF;        /*关闭显示屏        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        cbyte =        DISPON;                /*打开显示屏        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        cbyte =        DISPFIRST;        /*定义显示起始行为零        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        Lcmcls();                /*清屏                */

}

/********************************/

/* 延时                                */

/********************************/

void Delay(uchar MS)

{

        uchar i;

   

        for (i = 0; i < MS; i++)

    {

        _delay_loop_2(CRYSTAL * 25);

    }

}

出0入0汤圆

发表于 2005-5-12 11:05:04 | 显示全部楼层
楼上的做的可真是全面啊,顶一下,我才简单的调出来了,不过原理都是一样的,除了滚动都是打点,只是画图要加入些误差允许。

    问题1:请教楼上,disp_str("公司"); 函数没看到,能贴出来不?我自己用调出来显示的字符串不对(如:disp_str("公司"); 可显示的不是公司,而是其他的两个字,是什么我忘了,肯定是固定的,应该是低层软件的事),想看看你的。

    问题2:原来我对3脚的疑问:其实是厂家把一个三极管省了,3跟18就短路了,不过我还有点疑问,5行是怎么显示的,12864应该是4行才对啊,自己做的字模?故意改小了?

出0入0汤圆

发表于 2005-5-12 17:45:35 | 显示全部楼层
我的问题是没注意这个吗?

要注意的问题:在读ROM区字节时候:用pgm_read_byte(lib) 与pgm_read_byte(lib + i)的结果是不同的,虽然在语法上是一样的.

出0入0汤圆

发表于 2005-5-12 23:48:07 | 显示全部楼层
Cornell University的网站上有关于KS0108的LCD的很详细的说明和例子可以参考。

"Design of a Graphical LCD Driver and Educational LCD Primer"

Design of a Graphical LCD Driver and Educational LCD Primer.pdf

其他的大家自己找吧...

出0入0汤圆

发表于 2005-5-13 12:26:36 | 显示全部楼层
修改版本:

编译器; GCCAVR 3.4.3

修改错误: 1)delay函数

          2)原画线函数有问题,判断为读LCD数据时延时不够,根据手册建议加延时1ms,后全部正常.

附加说明: 1)原程序为网上下载的,用ICCAVR 编译器,我修改为GCC版本,并且增加延时函数.使之工作正常.

          2)大家放心使用!



/*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。

         CKW19264A接口程序(模拟方式)

液晶模块供应商:上海市HENGFANG电子有限公司        HTTP://WWW.HENGFANG.COM.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*                        *

;注:Mega16的晶振频率为4MHz                                                *

;************************************************************************/

#include <avr\io.h>

#include <avr\pgmspace.h>

#include <avr\delay.h>

#include "worddot.h"        // 自定义字符点阵码文件,存于include目录下

//#include <math.h>            // 数学_运算定义,没有使用



#define CRYSTAL 4       //4M crystal

typedef unsigned char uchar;

typedef unsigned int uint;



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



#define        LCD_E       (1 << PC3)                                        // PC3----E

#define        LCD_DI      (1 << PC6)                                        // PC6----D/I

#define        LCD_RW      (1 << PC7)                                        // PC7----R/W

#define        LCD_CS1        (1 << PC4)                                // PC4----CS1

#define        LCD_CS2        (1 << PC5)                                // PC5----CS2

#define        LCD_CS3        (1 << PD2)                                // 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_Ms(uint MS);                //延时,入口数为Ms

void lcdbusyL(void);                //busy判断、等待(左区)

void lcdbusyM(void);                //busy判断、等待(中区)

void lcdbusyR(void);                //busy判断、等待(右区)       

void Putedot(uchar x, uchar y, const prog_uchar *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, const prog_uchar *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);



/********************************/

//定义字符串数组                */

/********************************/



const prog_uchar STR1[]=

{

        0x80,0x81,0x82,0x83,0x84,0x85,

        0x86,0x87,0x88,0x89,0x8a,0x8B

};

                       

const prog_uchar STR2[] = "web:www.sunsystem.com.cn";

const prog_uchar STR3[] = "Program by GCCAVR 3.4.3";

const prog_uchar STR4[] = "Learn AVR,grasp future!";



/********************************/

/* 演示主程序                        */

/********************************/

int main(void)

{

        uchar x=0;

   

        Lcminit();                /*液晶模块初始化,包括全屏幕清屏*/

   

        Putstr(0, 0, STR2, 24);        /*第一行字符输出,24字节        */

        Putstr(0, 2, STR1, 12);        /*第二行字符输出,12字节(汉字)*/

        Putstr(0, 4, STR3, sizeof(STR3) - 1);        /*第三行字符输出,24字节        */

        Putstr(0, 6, STR4, sizeof(STR4) - 1);        /*第四行字符输出,12字节        */

   

    Linexy(0, 20, 191, 20);

    circle(48, 48, 16);

        while(1)

    {

        Rollscreen(x);                /*定位新的显示起始行        */

                x++;

        Delay_Ms(1000);                /*延时,控制滚动速度        */

        };

}





/************************************************/

/*画圆。数学方程(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)

{

        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, y;



        x1 = col;

        y1 = row;

        row = y1 >> 3;                /*取Y方向分页地址        */

        Rddata();               // get cbyte on screen

        y = y1 & 0x07;                /*字节内位置计算        */

        Wrdata(cbyte | (1 << y));        /*画上屏幕                */

        col = x1;                        /*恢复xy坐标                */

        row = y1;

}



/****************************************/

/*        屏幕滚动定位                        */

/****************************************/

void Rollscreen(uchar x)

{

        cbyte =        DISPFIRST | x;        /*定义显示起始行为x?*/

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

}



/****************************************/

/*        一个字串的输出                        */

/****************************************/

void Putstr(uchar x, uchar y, const prog_uchar *puts, uchar i)

{

        uchar j, wordx;



        for (j = 0; j < i; j++)

        {

        wordx = pgm_read_byte(puts + j); //从ROM中取数据

        Delay_Ms(2);

                if (wordx & 0x80)

                {

                        Putedot(x, y, Hzk, wordx & 0x7f, 16);        /*只保留低7位        */

                }

                else

        {

            Putedot(x, y, Ezk, wordx - 0x20, 8);        /*ascii码表从0x20开始*/

        }

                x = col;

                y = row;

        }

}



/****************************************/

/*   字符点阵码数据输出                        */

/****************************************/

void Putedot(uchar x, uchar y, const prog_uchar *Lib, uchar Order, uchar widthw)

{

        uchar i;

        unsigned int xi;                        /*偏移量,字符量少的可以定义为Uchar        */



        col = x;                /*暂存x,y坐标,已备下半个字符使用        */

        row = y;

        xi = Order * (widthw << 1);                        // 每个字符widthw列

/****************上半个字符输出**************/

        for (i = 0; i < widthw; i++)

        {               

        cbyte = pgm_read_byte(Lib + xi);    // 取点阵码,rom数组       

                Wrdata(cbyte);                        // 写输出一字节

                xi++;

                col++;

                if (col == LCMLIMIT)

        {

            col = 0;

            row += 2;

        }        /*下一列,如果列越界换行*/

                if (row > 7)

        {

            row = 0;                /*如果行越界,返回首行        */

        }

        }                                        /*上半个字符输出结束        */



        col = x;                                        /*列对齐                */

        row = y + 1;                                        /*指向下半个字符行        */

/****************下半个字符输出****************/

        for (i = 0; i < widthw; i++)

        {                       

        cbyte = pgm_read_byte(Lib + xi);    // 取点阵码

                Wrdata(cbyte);                                /*写输出一字节                */

                xi++;

                col++;

                if (col == LCMLIMIT)

        {

            col = 0;

            row += 2;

        };        /*下一列,如果列越界换行*/

                if (row > 7)

        {

            row = 1;                /*如果行越界,返回首行        */

        }

        }                                        /*下半个字符输出结束        */

        row = y;

}                                                /*整个字符输出结束        */



/****************************************/

/*        清屏,全屏幕清零                */

/****************************************/

void Lcmcls( void )

{

        for (row = 0; row < 8; row++)

        {

        for (col = 0; col < LCMLIMIT; col++)

        {

            Wrdata(0);

        }

    }

}



/****************************************/

/*  从液晶片上读数据,保留在全局变量中        */

/****************************************/



void Rddata(void)

{

        Locatexy();                /*坐标定位,返回时保留分区状态不变        */

        DDRA = 0;        /*改变PA口的状态,作为输入口                */

        Datalcm = 0xFF;

        lcd_set_di();        /*数据                */

        lcd_set_rw();        /*读数据        */

        lcd_set_e();

        //asm("NOP"); asm("NOP"); asm("NOP");                /*读入到LCM        */

    Delay_Ms(1);

        cbyte =        PINA;        /*虚读一次        */

        lcd_clear_e();

        Locatexy();                /*坐标定位,返回时保留分区状态不变        */

        DDRA = 0;

        Datalcm = 0xFF;

        lcd_set_di();        /*数据                */

        lcd_set_rw();        /*读数据        */

        lcd_set_e();

        /*读入到LCM        */

    Delay_Ms(1);

        cbyte =        PINA;        /*从数据口读数据,真读 */

        lcd_clear_e();

        DDRA = 0xFF;        /*改变PA口的状态,作为输出口                */

}



/****************************************/

/*        数据写输出                        */

/****************************************/



void Wrdata(uchar X)

{

        Locatexy();                // 坐标定位,保留分区状态不变

        wtcom();            // wait for ideal

        lcd_set_di();                // 数据输出

        lcd_clear_rw();

        asm("NOP");                // 写输出

        Datalcm        = X;                // 数据输出到数据口

        lcd_set_e();                // LCM读入

        asm("NOP");

    asm("NOP");

        lcd_clear_e();      // restore E pin

}



/********************************/

/* 命令输出到左区控制口                */

/********************************/



void WrcmdL(uchar X)

{

        lcdbusyL();                /*确定分区,返回时保留分区状态不变*/

        lcd_clear_di();                        /*命令操作        */

        lcd_clear_rw();

    asm("NOP");                /*写输出        */

        Datalcm        = X;                        /*数据写到数据口 */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*LCM读入*/

}



/********************************/

/* 命令输出到中区控制口                */

/********************************/



void WrcmdM(uchar X)

{

        lcdbusyM();                /*确定分区,保留分区状态不变*/

        lcd_clear_di();                        /*命令操作        */

        lcd_clear_rw();

    asm("NOP");                /*写输出        */

        Datalcm        = X;                        /*命令写到数据口*/

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*LCM读入*/

}



/********************************/

/* 命令输出到右区控制口                */

/********************************/



void WrcmdR(uchar X)

{

        lcdbusyR();                /*确定分区,保留分区状态不变        */

        lcd_clear_di();                        /*命令操作                */

        lcd_clear_rw();

    asm("NOP");                /*写输出                */

        Datalcm        = X;                        /*命令输出到数据口        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();        /*读入到LCM        */

}



/********************************************************/

/* 分区操作允许等待,返回时保留分区选择状态                */

/********************************************************/

void lcdbusyL(void)

{

    lcd_clear_cs1();        /*CLR        CS1                */

        lcd_set_cs2();                /*SETB        CS2                */

        lcd_set_cs3();                /*SETB        CS3                */

        wtcom();                /* waitting for        enable        */

}



void lcdbusyM(void)

{

    lcd_set_cs1();                /*SETB        CS1                */

        lcd_clear_cs2();        /*CLR        CS2                */

        lcd_set_cs3();                /*SETB        CS3                */

        wtcom();                /* waitting for        enable        */

}



void lcdbusyR(void)

{

        lcd_set_cs1();                /*SETB        CS1                */

        lcd_set_cs2();                /*SETB        CS2                */

        lcd_clear_cs3();        /*CLR        CS3                */

        wtcom();                /* waitting for        enable        */

}



void wtcom(void)

{

        DDRA = 0;               // data port assigned for input

        lcd_clear_di();                    // CLR DI for instruction       

        lcd_set_rw();                    // SETB RW for read

        Datalcm        = 0xFF;                // MOV DATA_LCM,#0FFH, init data port

        lcd_set_e();

    asm("NOP");

        while(lcd_read_status());   // test MSB bit for busy flag

        lcd_clear_e();          // restore E pin

        DDRA = 0xFF;

}



/********************************************************/

/*根据设定的坐标数据,定位LCM上的下一个操作单元位置        */

/********************************************************/

void Locatexy(void)

{

        uchar  x,y;



        switch (col & 0xc0)                /*  col.and.0xC0        */

        {                        /*条件分支执行                */

        case 0:               

        lcdbusyL();

        break;        /*左区        */

        case 0x40:       

        lcdbusyM();

        break;        /*中区        */

        case 0x80:       

        lcdbusyR();

        break;        /*右区        */

    default:

        break;

        }

        x = (col & 0x3F) | SETX;                /*  col.and.0x3f.or.setx        */

        y = (row & 0x07) | SETY;                /*  row.and.0x07.or.sety        */

        wtcom();                /*  waitting for enable                */

        lcd_clear_di();                        /*CLR        DI        */

        lcd_clear_rw();                        /*CLR        RW        */

        asm("NOP");

        Datalcm        = y;                        /*MOV        P0,Y        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();

        wtcom();                        /*  waitting for enable        */

        lcd_clear_di();                        /*CLR        DI        */

        lcd_clear_rw();                        /*CLR        RW        */

        asm("NOP");

        Datalcm        = x;                        /*MOV        P0,X        */

        lcd_set_e();

    asm("NOP");

    lcd_clear_e();

}



/********************************/

/*液晶屏初始化                        */

/********************************/



void Lcminit(void)

{

    DDRD   = 0xFF;                //|= LCD_CS3;        /*定义输出位

        DDRC   = 0xFF;                /*定义为输出口                        */

        Delay_Ms(5);                /*延时,等待外设准备好                */

       

    cbyte =        DISPOFF;        /*关闭显示屏        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        cbyte =        DISPON;                /*打开显示屏        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        cbyte =        DISPFIRST;        /*定义显示起始行为零        */

        WrcmdL(cbyte);

        WrcmdM(cbyte);

        WrcmdR(cbyte);

        Lcmcls();                /*清屏                */

}

/********************************/

/* 延时                                */

/********************************/

void Delay_Ms(uint MS)

{

        uint i;

   

        for (i = 0; i < MS; i++)

    {

        _delay_loop_2(CRYSTAL * 250);

    }

}

出0入0汤圆

发表于 2005-5-15 21:58:05 | 显示全部楼层
stong :请教你的disp_str("12345"); disp_ch('9'); disp_str("公司");

求相关的子程序,是在AVR中实现的吗?我郁闷半天了,调不出来,也想不到用什么来代替指针。请指导一下,

出0入0汤圆

 楼主| 发表于 2005-5-26 16:41:48 | 显示全部楼层
回long98732123:

你好,好久没上来,抱歉.

disp_str("公司")如不正常,请把编译选项""Strings in FLASH  only"改变试试.

显示5行的问题:

128*64如果是16*16的字体是只能显示4行,为了显示显示5行,采用16*12的字体(高是12),实现的关键是显示RAM的改写.

出0入0汤圆

发表于 2005-6-7 08:34:32 | 显示全部楼层
楼主的程序我试了试,现在遇到点问题!定义的显示数据数组常量,仿真的时候发现常量数组元素变了!不知道哪里出了问题!请指点一下!

出0入0汤圆

 楼主| 发表于 2005-6-11 09:12:32 | 显示全部楼层
再贴一次完整的代码,包括了main().有字符显示和绘点的功能,其他功能自己添加.

lcd.prj文件在ICCAVR下打开即可,自己修改相应的引脚定义.



点击此处下载armok0152566.rar

出0入0汤圆

发表于 2005-6-11 11:58:45 | 显示全部楼层
好啊

出0入0汤圆

发表于 2005-7-21 20:44:54 | 显示全部楼层
太好!我现在有一个,可以试试了!

出0入0汤圆

发表于 2006-1-22 21:43:15 | 显示全部楼层
不错,学习了。

出0入0汤圆

发表于 2006-2-27 21:06:09 | 显示全部楼层
不错 小弟谢啦!

出0入0汤圆

发表于 2006-3-24 19:02:47 | 显示全部楼层
我用mega16+KS0108,有时候个别显示错位,请各位大虾支个招

出0入0汤圆

发表于 2006-4-21 11:02:46 | 显示全部楼层
有谁帮忙给个电路连接图?我第一次接触啊!

出0入0汤圆

发表于 2006-4-21 23:15:31 | 显示全部楼层
我用ISIS仿真看看,不过先谢了

出0入0汤圆

发表于 2006-6-16 10:50:40 | 显示全部楼层
好人啊

出0入0汤圆

发表于 2007-3-30 16:29:23 | 显示全部楼层
to 楼主:



想在12864上做个反显示的程序,反显示的字数可以不限,



总做不出,楼主能不能给个程序??



或者给个思路也行



万分感谢!!

出0入0汤圆

发表于 2007-5-18 08:20:03 | 显示全部楼层
谁能解释一些9楼的下面程序中为什么要用Rddata();

有没字库worddot.h





/****************************************/

/*   画点            */

/****************************************/



void point(void)

{

   uchar   x1, y1, y;



   x1 = col;

   y1 = row;

   row = y1 >> 3;      /*取Y方向分页地址   */

   Rddata();               // get cbyte on screen

   y = y1 & 0x07;      /*字节内位置计算   */

   Wrdata(cbyte | (1 << y));   /*画上屏幕      */

   col = x1;         /*恢复xy坐标      */

   row = y1;

}

出0入0汤圆

发表于 2007-5-23 10:37:17 | 显示全部楼层
谢谢 stong兄,咱们是老乡哈!

出0入0汤圆

发表于 2007-5-23 11:11:07 | 显示全部楼层
老乡你的字模提取软件可以发给我吗?谢谢了!

出0入0汤圆

发表于 2007-5-24 09:30:35 | 显示全部楼层
void LCD_BUSY(unsigned char lr) 写的有问题吧?里边定义了一个unsigned char status好像没用啊?搂主在吗?可以解释下吗?

谢谢了!
-----此内容被wagina于2007-05-24,09:33:39编辑过

出0入0汤圆

发表于 2007-5-30 00:06:07 | 显示全部楼层
怎么复位脚不用啊

出0入0汤圆

发表于 2007-8-24 11:43:41 | 显示全部楼层
我想问一下,你的屏幕滚动程序左右滚动写过吗?怎么写?

Rollscreen(x); /*定位新的显示起始行 */

x++;

Delay(20); /*延时,控制滚动速度 */

出0入0汤圆

发表于 2007-8-24 11:45:19 | 显示全部楼层
请firstelec 指教.谢谢!

出0入0汤圆

发表于 2007-11-28 22:41:46 | 显示全部楼层
如何加入新的字符或者和汉字,,我用PCTOLCD2002字模软件但显示出来的是乱码???????????

出0入0汤圆

发表于 2008-3-8 17:53:35 | 显示全部楼层
请问ks0108 12864 液晶的C语言驱动(ICCAVR)楼主STONG是用什么取字字模软件,取模方式,我用你的程序可以正确显示,而用我的字模取的字就不能正确显示,请帮忙指教一下,谢谢!

出100入0汤圆

发表于 2008-4-27 10:17:53 | 显示全部楼层
又学到了不少!感谢楼主

出0入0汤圆

发表于 2008-4-29 17:07:37 | 显示全部楼层
本人菜鸟,刚刚学习AVR,现在按照楼主的程序,可是驱动不了,什么都没显示,现有如下问题请教:1、3---VLCD如何接?2、在看楼主的文章之前,我自己编了一个代码,但是还是没显示。无论是楼主的代码还是我的代码都在AVR Stdio上面仿真,结果数据口没有任何变化,这是什么问题?3、 听同学说,AVR驱动液晶显示的时序,跟AVR的时钟很有关系,是不是呢???谢谢,我的邮箱是beijixingsx@126.com!

出0入93汤圆

发表于 2008-4-29 17:15:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-6 21:32:14 | 显示全部楼层
.

出0入0汤圆

发表于 2009-4-11 12:20:05 | 显示全部楼层
可以显示5行汉字

出0入0汤圆

发表于 2009-6-14 19:03:01 | 显示全部楼层
学习,这个程序的思路很清晰,适合初学者

出0入0汤圆

发表于 2009-6-19 10:24:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-2 09:45:44 | 显示全部楼层
dddddddddddddddd

出0入0汤圆

发表于 2009-7-3 17:33:29 | 显示全部楼层
试试!

出0入0汤圆

发表于 2009-7-8 17:31:27 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2009-7-28 19:54:14 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-8-19 16:03:52 | 显示全部楼层
好贴!!顶起!学习了!

出0入0汤圆

发表于 2009-9-25 19:51:52 | 显示全部楼层
正好用得上 谢谢楼主

出0入0汤圆

发表于 2009-11-2 13:35:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-6 19:20:38 | 显示全部楼层
to 楼主:
ASC_16码用什么软件生成的啊?我想用到字母怎么生产啊??谢谢了。。。

出0入0汤圆

发表于 2009-11-6 22:11:39 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-11-23 03:47:29 | 显示全部楼层
C:\iccv7avr\bin\imakew -f 123.mak
    iccavr -c -IC:\iccv7avr\include -e -D__ICC_VERSION=722 -DATMega16  -l -g -Wa-IC:\iccv7avr\include -MLongJump -MHasMul -MEnhanced  1.c
    iccavr -o 123 -LC:\iccv7avr\lib -g -e:0x4000 -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:30 -beeprom:0.512 -fihx_coff -S2 @123.lk   -lstudio -lcatmega
!ERROR file 'crtatmega.o': undefined symbol '_main'
C:\iccv7avr\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1. Mon Nov 23 03:45:50 2009
我的ICC编译和出现这样的错误时什么回事 啊?

出0入0汤圆

发表于 2010-1-6 14:14:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-1-14 08:53:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-21 16:27:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-9 11:00:35 | 显示全部楼层
学习学习,收了,谢谢!

出0入0汤圆

发表于 2010-3-12 11:44:06 | 显示全部楼层
thanks

出0入0汤圆

发表于 2010-9-8 16:58:19 | 显示全部楼层
回复【楼主位】stong
-----------------------------------------------------------------------

if(CurOffset==1) //下半部是写半个字节
                {
                        for(j=0;j<width;j++)
                        {
                                SetPageCol(uPage,uCol+j);
                                ch_w=ASC_16[k].Msk[j];
                                if(uCol+j<64)        write_LCD(LEFT,DATA,ch_w);
                                else write_LCD(RIGHT,DATA,ch_w);
                        }
                        SetPageCol(uPage+1,uCol);
                       
                        for(j=0;j<width;j++)
                        {
                                SetPageCol(uPage+1,uCol+j);
                                if(uCol+j<64) ch_r=read_LCD(LEFT);
                                else ch_r=read_LCD(RIGHT);
                                ch_r&=0xf0;
                                ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f;
                                ch_w|=ch_r;
                                SetPageCol(uPage+1,uCol+j);
                                if(uCol+j<64)        write_LCD(LEFT,DATA,ch_w);
                                else write_LCD(RIGHT,DATA,ch_w);
                        }
                }
楼主,能否给点说明和解释啊 看的不太明白啊,希望高手能给点注释 这样我们就可以学习啦

出0入0汤圆

发表于 2010-9-14 11:47:35 | 显示全部楼层
頂一下!!!

出0入0汤圆

发表于 2010-9-30 22:08:49 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2010-10-1 22:36:06 | 显示全部楼层
学习了

出0入0汤圆

发表于 2011-4-15 00:20:47 | 显示全部楼层
借用了lz的画圆和画任意直线的算法,谢了。。

出0入0汤圆

发表于 2011-4-18 20:14:25 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-4-27 23:52:10 | 显示全部楼层
谢谢楼主!!学习ing!

出0入0汤圆

发表于 2011-4-29 21:34:05 | 显示全部楼层
仍有参考价值!

出0入0汤圆

发表于 2012-1-17 08:47:21 | 显示全部楼层
回复【48楼】zhq448
c:\iccv7avr\bin\imakew -f 123.mak
    iccavr -c -ic:\iccv7avr\include -e -d__icc_version=722 -datmega16  -l -g -wa-ic:\iccv7avr\include -mlongjump -mhasmul -menhanced  1.c
    iccavr -o 123 -lc:\iccv7avr\lib -g -e:0x4000 -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:30 -beeprom:0.512 -fihx_coff -s2 @123.lk   -lstudio -lcatmega
!error file 'crtatmega.o': und......
-----------------------------------------------------------------------

没有主函数main?

出0入0汤圆

发表于 2012-1-17 10:21:58 | 显示全部楼层
谢楼主分享,留名备用。

出0入0汤圆

发表于 2012-4-9 20:22:20 | 显示全部楼层
GOOD!!!
不错
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 07:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表