查看: 1350|回复: 0
打印 上一主题 下一主题

发一个诺基亚5110屏的检测程序,有图片和程序,mcu AT89S51/52

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-13 20:20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

(原文件名:截图03.jpg)
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//            COCOGUOJIA NOKIA 5110                     //
//                PHILIPS PCD8544 48*48 LCD                    //
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//头文件
#include <AT89X51.H>
#define u8  unsigned char
#define u16 unsigned int

u8 nop;
#define nop() nop++

u8 code character_table[]=
{
/*--  文字:  C  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x04,0x00,

/*--  文字:  O  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,

/*--  文字:  C  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x04,0x00,

/*--  文字:  O  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,

/*--  文字:  G  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x08,0x38,0x38,0x00,0x03,0x07,0x0C,0x08,0x09,0x0F,0x07,0x01,

/*--  文字:  U  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0x08,0xF8,0xF8,0x08,0x08,0xF8,0xF8,0x08,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,

/*--  文字:  O  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0xE0,0xF0,0x18,0x08,0x18,0xF0,0xE0,0x00,0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,

/*--  文字:  J  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0x00,0x08,0x08,0xF8,0xF8,0x08,0x08,0x00,0x30,0x30,0x20,0x3F,0x1F,0x00,0x00,0x00,

/*--  文字:  I  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0x00,0x08,0x08,0xF8,0xF8,0x08,0x08,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,

/*--  文字:  A  --*/
/*--  Trebuchet MS11;  此字体下对应的点阵为:宽x高=8x14   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=8x16  --*/
0x00,0x00,0xE0,0xF8,0xF8,0xE0,0x00,0x00,0x08,0x0E,0x0F,0x09,0x09,0x0F,0x0E,0x08,



};

u8 code Chinese_table[]=
{
/*--  文字:  欢  --*/
/*--  Trebuchet MS12;  此字体下对应的点阵为:宽x高=17x16   --*/
0x34,0x64,0xC4,0xE4,0x7C,0x3C,0x38,0x1F,0xEF,0xE8,0x08,0x28,0x38,0x18,0x08,
0x00,0x20,0x30,0x5C,0x4F,0x43,0x6F,0x2C,0x30,0x1C,0x0F,0x07,0x1E,0x38,0x70,0x60,
0x20

/*--  文字:  迎  --*/
/*--  Trebuchet MS12;  此字体下对应的点阵为:宽x高=17x16   --*/
,0x41,0xCF,0xCE,0x04,0xFC,0xFC,0x06,0x02,0xFE,0xFC,0x04,0x04,0xFC,0xFC,0x00,
0x00,0x40,0x60,0x3F,0x3F,0x60,0x47,0x47,0x43,0x41,0x5F,0x5F,0x42,0x46,0x47,0x43,
0x40

/*--  文字:  光  --*/
/*--  Trebuchet MS12;  此字体下对应的点阵为:宽x高=17x16   --*/
,0x40,0x42,0x46,0x5C,0xDC,0xC8,0x7F,0x7F,0xC0,0xD0,0x5E,0x4E,0x64,0x60,0x40,
0x00,0x00,0x80,0xC0,0x60,0x38,0x1F,0x07,0x00,0x00,0x3F,0x7F,0x40,0x40,0x40,0x78,
0x78

/*--  文字:  临  --*/
/*--  Trebuchet MS12;  此字体下对应的点阵为:宽x高=17x16   --*/
,0xF8,0xF8,0x00,0xFE,0xFE,0x70,0xBF,0x8F,0x0A,0x18,0x78,0x68,0x88,0x88,0x08,
0x00,0x00,0x1F,0x1F,0x00,0x7F,0x7F,0x00,0x7F,0x7F,0x21,0x3F,0x3F,0x21,0x7F,0x7F,
0x01
};

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//管脚定义(起个小名了~) lcd的内部驱动是PCD8544,一下的芯片即为PCD8544
sbit    RST = P0^1;  //芯片复位     0有效
sbit    SCE = P0^0;  //芯片使能                0有效
sbit    D_C = P3^4;  //模式选择            1写数据   0写指令
sbit    DIN = P3^5;  //串行数据线        数据类型---8位
sbit    SCK = P3^6;  //串行时钟线   上升沿有效

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//delay_1ms: 大约延时1ms
void delay_1ms(void)//1ms延时函数
{
        u16 i;
        for (i=0;i<500;i++)
        {
                ;
        }

}


/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_Write_Byte: 写数据或命令到LCD
//输入参数:u8 Data_or_Command:要写入的数据或命令;
//                        u8 D_or_C  :1 写数据/ 0 写命令

void LCD_Write_Byte(u8 Data_or_Command,u8 D_or_C)
{
        u8 i;
        SCE=0;//选择芯片        
        D_C=D_or_C;// 数据? 命令?        
        for(i=0;i<8;i++)//写
        {
                if(0x80==(Data_or_Command&0x80))
                {
                        DIN=1;
                }
                else
                {
                        DIN=0;
                }

        
                Data_or_Command<<=1;//移位
               
                //造个上升沿        
                SCK=0;
                nop();
                nop();
                nop();
                nop();
                SCK=1;
        }
        //回复到安全状态 保险        
        D_C=1;        
        SCE=1;        
        DIN=1;
}


/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_init: LCD初始化
void LCD_init(void)
{
        RST=0;         
          delay_1ms();
          RST=1;
        delay_1ms();  
        LCD_Write_Byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
        LCD_Write_Byte(0xd0,0);//设定液晶偏置电压
        LCD_Write_Byte(0x20,0);//使用基本指令 水平寻址

        //LCD_Write_Byte(0x0C,0);//设定显示模式,正常显示
        LCD_Write_Byte(0x0D,0);  //设定显示模式,反白显示
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_Set_XY: 设置LCD坐标函数 用于准备显示高度是‘8个点’的汉字或字母
//输入参数:X:0-83  Y:0-5
void LCD_Set_XY(u8 X, u8 Y)
{
        LCD_Write_Byte(0x40 | Y, 0);// 竖
        LCD_Write_Byte(0x80 | X, 0);// 横
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_Clear: LCD清屏函数
void LCD_Clear(void)
{
        u8 x;
        u8 y;
        LCD_Set_XY(0,0);

        for(y=0;y<=5;y++)
        {
                for(x=0;x<=83;x++)
                {
                        LCD_Write_Byte(0x00,1);                                
                }
        }
}



/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_Write_ABC: 显示8(宽)*16(高)点阵列数字字母符号等半角类
//输入参数: x:
//                        y:
//                        ABC:显示的字符的序号

void LCD_Write_ABC(u8 x, u8 y,u8 ABC) //x:横 y:竖 ABC:字符的序号
{
        u8 i;         
        
        LCD_Set_XY(x*8, y);//横 ,竖
        for(i=0; i<8;i++)
        {
                LCD_Write_Byte(character_table[ABC*16+i],1);
        }
        
    LCD_Set_XY(x*8, y+1);//横 ,竖
        for(i=8; i<16;i++)
        {
                LCD_Write_Byte(character_table[ABC*16+i],1);
        }                 
}


/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//LCD_Write_Chinese: 显示16(宽)*16(高)点阵列汉字等半角类
//输入参数:
//                        x:
//                        y:
//                        Chinese:显示的汉字的序号

void LCD_Write_Chinese(u8 x, u8 y,u8 Chinese)
{
        unsigned char i;         
        
        LCD_Set_XY(x*8, y);// 列,页
        for(i=0; i<16;i++)
        {
                LCD_Write_Byte(Chinese_table[Chinese*32+i],1);
        }
        
           LCD_Set_XY(x*8, y+1);// 列,页
        for(i=16; i<32;i++)
        {
                LCD_Write_Byte(Chinese_table[Chinese*32+i],1);
        }        
}

void main(void)
{
        unsigned char k;
        RST=0;
        for(k=0;k<250;k++);
        RST=1;                  

        LCD_init();
        LCD_Clear();

        LCD_Write_ABC(0,1,0);
        LCD_Write_ABC(1,1,1);        
        LCD_Write_ABC(2,1,2);
        LCD_Write_ABC(3,1,3);
        LCD_Write_ABC(4,1,4);
        LCD_Write_ABC(5,1,5);        
        LCD_Write_ABC(6,1,6);
        LCD_Write_ABC(7,1,7);
        LCD_Write_ABC(8,1,8);
        LCD_Write_ABC(9,1,9);

    LCD_Write_Chinese(1,3,0);
        LCD_Write_Chinese(3,3,1);
        LCD_Write_Chinese(5,3,2);
        LCD_Write_Chinese(7,3,3);

        while(1)
          {
            ;        
          }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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