Nokia5110液晶屏 C51库文件

合集下载

(完整word版)Nokia5110液晶屏

(完整word版)Nokia5110液晶屏

一、硬件链接:首先,看一下硬件(仅供参考,读者已对自己的硬件很熟悉,可以直接跳过。

):说明:图1: 排针从左至右1到8位.图2:5110接口在板子中的区域。

图3: 8位排针对应连接5110液晶屏相应的引脚。

图4:5110液晶显示屏对应8位排针JP19的插入方向。

再看一下我的板子的原理图:图5中,显示了8位排针JP19(即5110液晶屏的引脚)其中的5根与51单片机(本人的为STC89C516RD+)的PB I/O口的连接方式:5110_RST <——-〉PB2(P1.2)5110_SCE <—--〉PB3(P1。

3)MOSI(sdin) <———〉PB5(P1.5)MISO(dc)〈--—〉PB6(P1.6)SCK 〈——-> PB7(P1.7)这样,我们知道了用51单片机中的I/O口和5110引脚的链接方式。

二、引脚接线图请根据程序里的定义连接,51的程序默认接线为:sbit sce = P1^3; //片选sbit res = P1^2; //复位,0复位sbit dc = P1^6; //1写数据,0写指令sbit sdin = P1^5;//数据sbit sclk = P1^7;//时钟看了这些默认接线,可能有个疑问:“这些位变量(引脚)究竟有什么用呢?”,带着这个疑问,请看5110芯片手册中的引脚说明(重点看红色区域):从这个引脚说明中,我们知道了不同的引脚,对应的功能。

那么,如何使用这些引脚来控制5110工作呢?三、指令5110液晶显示屏(PCD8544芯片),是通过发送指令和写入数据RAM来控制和显示数据的。

指令格式分为两种模式:1、如果D/C(模式选择)置为低(为0),即位变量dc = 0,为发送指令模式,那么接下来发送的8位字节解释为命令字节。

2、如果D/C置为高,即dc = 1; 为写入数据RAM模式,接下来的字节将存储到显示数据RAM。

注意:1、每一个数据字节存入之后,地址计数自动递增。

诺基亚5110学习(含字库,免财富)

诺基亚5110学习(含字库,免财富)

0x3C, 0x4A, 0x49, 0x49, 0x30, 0x01, 0x71, 0x09, 0x05, 0x03, 0x36, 0x49, 0x49, 0x49, 0x36, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x51, 0x09, 0x06, 0x32, 0x49, 0x59, 0x51, 0x3E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x49, 0x49, 0x7A, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x46, 0x49, 0x49, 0x49, 0x31, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x07, 0x08, 0x70, 0x08, 0x07, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, 0x00, 0x41, 0x41, 0x7F, 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x01, 0x02, 0x04, 0x00, 0x20, 0x54, 0x54, 0x54, 0x78,

XS128单片机实验诺基亚5110液晶显示

XS128单片机实验诺基亚5110液晶显示

XS128单片机实验:诺基亚5110液晶显示/*********包含的头文件*****************************/#include ;/* common defines and macros */#include &quot;derivative.h&quot;/* derivative-specific definitions */#include &quot;WQ.h&quot;#include &quot;Font6_8.h&quot;#include &quot;Bitmap.h&quot;#include &quot;Font16_16.h&quot;#include &quot;Font8_16.h&quot;/****************宏定义*****************************/#define SCLKPTM_PTM4#define SDINPTM_PTM3#define LCD_DC PTM_PTM5#define LCD_CE PTM_PTM2#define LCD_RES PTM_PTM1#define LEDPTM_PTM0/****************函数申明***************************/void LCD_int(void);void LCD_write_byte(uchar dt,uchar command); void LCD_write_char(uchar *font);void LCD_set_XY(uchar x,uchar y);void LCD_clear(void);/*1.********************************************* *****/// LCD_write_byte: 使用spi接口写数据到LCD// 输入参数:dt 写入的数据// 使用I/o口模拟SPI总线通讯发送一个字节数据到LCD显示// Command : 写数据/命令选择// Data: 2013、4、26/************************************************ ***/void LCD_write_byte(uchar dt,uchar command) { uchar i;LCD_CE=0;//使能LCDdelay_us(40);//延时30us;if(command==0)//判断发送数据还是发送命令LCD_DC=0;elseLCD_DC=1;delay_us(40);//延时30us;for(i=0;i<8;i++){if(dt&0x80)SDIN=1;// 发送高位elseSDIN=0;delay_us(40);//延时30us;SCLK=0;dt=dt<<1;SCLK=1;}LCD_CE=1;//关闭LCD}/*2.********************************************* ****/// 函数 :LCD_set_xy// 功能 :设置LCD坐标函数// 说明:x:横坐标 Y纵坐标// Date:2013/4/26/************************************************ */void LCD_set_XY(uchar x,uchar y){LCD_write_byte(0x40|y,0);//列按位或设置y坐标LCD_write_byte(0x80|x,0);//行按位或设置x坐标}/*3.********************************************/ // LCD_write_char() ;显示英文字符// 输入参数:C:显示的字符// Date:2013/4/26/********************************************/void LCD_write_char (uchar *font) {uint i;for(i=0;i<6;i++)LCD_write_byte(font[i],1);}/*4.********************************************* /// 函数:LCD_clear// 功能:清屏// 参数:无// Date:2013/4/26/************************************************ /void LCD_clear(void) {uint i;LCD_write_byte(0x0c,0);LCD_write_byte(0x80,0);for(i=0;i<504;i++) {LCD_write_byte(0,1);}}/************************************************ */// LCD_init: LCD初始化// 输入参数无// Date :2013、4、26/************************************************ /void LCD_int(void) {LCD_RES=0;delay_ms(2);LCD_RES=1;LCD_write_byte(0x21,0);//初始化LCD,功能设定使用扩充指令LCD_write_byte(0xd0,0);//设定液晶偏置电压; LCD_write_byte(0x20,0);//使用基本指令LCD_write_byte(0x0c,0);//设定显示模式,正常显示}/************************************************ ****/// 主函数:void mian// 功能:在诺基亚5110液晶屏上显示字符// 作者:wangqi// 时间;2013、4、26/************************************************ ****/void main(){unsigned charA[6]={0x00,0x7c,0x12,0x11,0x12,0x7c};unsigned charB[6]={0x00,0x7f,0x49,0x49,0x49,0x36};DDRM = 0xFF;LCD_int();LCD_clear();LED=1;delay_s(5);LED=0;while(1){LCD_set_XY(0,1); LCD_write_char(A); delay_ms(100);LCD_set_XY(10,1);LCD_write_char(A);delay_ms(100);LCD_set_XY(0,3); LCD_write_char(B); delay_ms(100);LCD_set_XY(10,4) ; LCD_write_char(B);}}。

Nokia5110程序

Nokia5110程序

#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */#define uchar unsigned char#define uint unsigned int#define lcd12864_date PORTB //数据口#define lcd12864_rs PTT_PTT5// PTT_PTT5; //寄存器选择输入#define lcd12864_rw PTT_PTT3 //液晶读/写控制#define lcd12864_e PTT_PTT2 //液晶使能控制#define DQ PORTA_PA0 // 定义DQ引脚为P3.3 #define DQ_HIGH() DDRA=0 //设置数据口为输入#define DQ_LOW() DDRA=1;DQ=0; //设置数据口为输出//uint temp; //温度值variable of temperature uchar A1,A2,A3;void delay2(uint i);void Init_Ds18b20(void);uchar Read_One_Byte();void Write_One_Byte(uchar dat);uint Get_Tmp();void DisplayTemp(uint temp) ;void delay(unsigned int t){uint i,j;for(i=t;i>0;i--)for(j=1000;j>0;j--);}void lcd12864_write_cmd(unsigned char command) //写指令{lcd12864_rs=0;lcd12864_rw=0;lcd12864_e=0;lcd12864_date=command;delay(5);lcd12864_e=1;lcd12864_e=0;delay(5);}void lcd12864_write_data(unsigned char data) // 写数据写入一个字符{lcd12864_rs=1;lcd12864_rw=0;lcd12864_e=0;lcd12864_date=data;delay(5);lcd12864_e=1;lcd12864_e=0;delay(5);}void lcd12864_pos(unsigned char x,unsigned char y) //确定位置{unsigned char pos;if (x==1){x=0x80;}else if (x==2){x=0x90;}else if (x==3){x=0x88;}else{x=0x98;}pos=x+y-1;lcd12864_write_cmd(pos); //显示地址}void io_init(){lcd12864_write_cmd(0x30); //基本指令操作lcd12864_write_cmd(0x0C); //显示开,关光标lcd12864_write_cmd(0x01); //清除LCD的显示内容位置计数器调整为0x00 }void lcd12864_wrtie_string( char *str) //写字符串{while(*str!='\0') //未结束{lcd12864_write_data(*str++);}}void init_LCD(){delay(20);lcd12864_write_cmd(0x30);delay(20);lcd12864_write_cmd(0x30);delay(20);lcd12864_write_cmd(0x0c);//开显示,不显示光标,且不闪烁delay(20);lcd12864_write_cmd(0x01); //清屏delay(20);lcd12864_write_cmd(0x06); //每次写入数据后地址指针加1delay(20);}/**/void Display1(){lcd12864_pos(1,2);lcd12864_wrtie_string("温度调节系统");lcd12864_pos(2,1);lcd12864_wrtie_string("菜单1:当前温度");lcd12864_pos(3,1);lcd12864_wrtie_string("菜单2:目标温度");lcd12864_pos(4,1);lcd12864_wrtie_string("菜单3:温度曲线");}void Display2(){lcd12864_pos(1,2);lcd12864_wrtie_string("温度调节系统");lcd12864_pos(2,1);lcd12864_wrtie_string("当前温度:**度");lcd12864_pos(3,1);lcd12864_wrtie_string("目标温度:**度");lcd12864_pos(4,2);lcd12864_wrtie_string(" Welcome ! ");}void main(void){delay(5);DDRB=0xff;DDRT=0xff;// io_init();init_LCD();lcd12864_pos(2,2);lcd12864_wrtie_string(" Welcome To ! ");lcd12864_pos(3,2);lcd12864_wrtie_string("温度调节系统");delay(2000);lcd12864_write_cmd(0x01); //清屏delay(20);while(1){DisplayTemp(Get_Tmp());lcd12864_pos(2,3);lcd12864_write_data(0x30+A1);lcd12864_pos(2,4);lcd12864_write_data(0x30+A2);lcd12864_pos(2,5);lcd12864_write_data(0x2e);lcd12864_pos(2,6);lcd12864_write_data(0x30+A3);/*Display1() ; */}}/*************精确延时函数*****************/ void delay2(unsigned int i){i=10*i;while(--i);}/****************************************** 此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45-40=5delay(100):延时205us 误差:205-200=5delay(200):延时405us 误差:405-400=5*******************************************//*****************DS18B20******************/void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command{char presence=1;while(presence){//DQ = 1; //DQ复位,不要也可行。

诺基亚5110显示屏51单片机驱动程序2

诺基亚5110显示屏51单片机驱动程序2

诺基亚5110显示屏51单片机驱动程序#include <stc.h>#include "intrins.h" //_nop_();延时函数用#include <dmb.h> //字符代码表#define uchar unsigned char#define uint unsigned intsbit sce = P3^4; //片选sbit res = P0^0; //复位,0复位sbit dc = P3^5; //1写数据,0写指令sbit sdin = P3^7; //数据sbit sclk = P3^6; //时钟uint data temp_data[2]={0x00,0x00}; //读出温度暂放//================18b20数据口定义===============sbit DQ=P0^0; //温度输入口uint h;uint temp;unsigned char presence,flash=0;/*****************延时函数*************************/void delay(uint t){for (;t>0;t--);}//================延时函数=====================void delay_1ms(void)//1ms延时函数{unsigned int i;for (i=0;i<500;i++);}/*---------------lcd显示函数开始----------------LCD_write_byte: 使用SPI接口写数据到LCD输入参数:dt:写入的数据;command :写数据/命令选择;编写日期:20080918----------------------------------------------*/void LCD_write_byte(unsigned char dt, unsigned char command){unsigned char i;sce=0;dc=command;for(i=0;i<8;i++){if(dt&0x80)sdin=1;elsesdin=0;dt=dt<<1;sclk=0;sclk=1;}dc=1;sce=1;sdin=1;}/*---------------------------------------LCD_init: 5110LCD初始化编写日期:20080918----------------------------------------- */void LCD_init(void){res=0;delay_1ms();res=1;LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令LCD_write_byte(0xd0,0);//设定液晶偏置电压LCD_write_byte(0x20,0);//使用基本指令LCD_write_byte(0x0C,0);//设定显示模式,正常显示}/*-------------------------------------------LCD_set_XY: 设置LCD坐标函数输入参数:X:0-83 Y:0-5编写日期:20080918---------------------------------------------*/void LCD_set_XY(unsigned char X, unsigned char Y){LCD_write_byte(0x40 | Y, 0);// columnLCD_write_byte(0x80 | X, 0);// row}/*------------------------------------------LCD_clear: LCD清屏函数编写日期:20080918--------------------------------------------*/void LCD_c lear(void){unsigned char t;unsigned char k;LCD_set_XY(0,0);for(t=0;t<6;t++){for(k=0;k<84;k++){LCD_write_byte(0x00,1);}}}/*---------------------------------------------LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类输入参数:c:显示的字符;编写日期:20080918-----------------------------------------------*/void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符{unsigned char i;LCD_set_XY(row*8, page);// 列,页for(i=0; i<8;i++){LCD_write_byte(shuzi[c*16+i],1);}LCD_set_XY(row*8, page+1);// 列,页for(i=8; i<16;i++){LCD_write_byte(shuzi[c*16+i],1);}}/*---------------------------------------------LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类输入参数:c:显示的字符;编写日期:20080918-----------------------------------------------*/void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列page:页dd:字符{unsigned char i;LCD_set_XY(row*8, page);// 列,页for(i=0; i<16;i++){LCD_write_byte(hanzi[c*32+i],1);}LCD_set_XY(row*8, page+1);// 列,页for(i=16; i<32;i++){LCD_write_byte(hanzi[c*32+i],1);}}//=================lcd显示函数结束================//=================18b20相关函数开始==============/****************DS18B20复位函数************************/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平}/////****************DS18B20写命令函数************************/ void write_byte(uchar val) //向1-WIRE 总线上写1个字节{uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1位}DQ=1;delay(1);}/****************DS18B20读1字节函数************************/ uchar read_byte(void) //从总线上取1个字节{uchar i;uchar value=0;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}///****************读出温度函数************************/read_temp(){ow_reset(); //总线复位if(presence==1){flash=1;} //DS18B20不正常,蜂鸣器报警delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的第字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp<<=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。

c51单片机程序-nokia5110液晶显示

c51单片机程序-nokia5110液晶显示

高电平表示数据输入 ,低电平表示命令输入 #define LCD_CLK P15 上升沿写入 #define LCD_DIN P23 #define LCD_BL P17 高电平点亮,低电平关闭 code unsigned char { ascii_dot[] = // ASCII 表
0x00,0x00,0x00,0x00,0x00, // - 0x00,0x00,0x5F,0x00,0x00, // -!0x00,0x07,0x00,0x07,0x00, // -"0x14,0x7F,0x14,0x7F,0x14, // -#0x24,0x2E,0x7B,0x2A,0x12, // -$0x23,0x13,0x08,0x64,0x62, // -%0x36,0x49,0x56,0x20,0x50, // -&0x00,0x04,0x03,0x01,0x00, // -'0x00,0x1C,0x22,0x41,0x00, // -(0x00,0x41,0x22,0x1C,0x00, // -)0x22,0x14,0x7F,0x14,0x22, // -*0x08,0x08,0x7F,0x08,0x08, // -+0x40,0x30,0x10,0x00,0x00, // -,0x08,0x08,0x08,0x08,0x08, // --0x00,0x60,0x60,0x00,0x00, // -.0x20,0x10,0x08,0x04,0x02, // -/0x3E,0x51,0x49,0x45,0x3E, // -00x00,0x42,0x7F,0x40,0x00, // -10x62,0x51,0x49,0x49,0x46, // -20x21,0x41,0x49,0x4D,0x33, // -30x18,0x14,0x12,0x7F,0x10, // -40x27,0x45,0x45,0x45,0x39, // -50x3C,0x4A,0x49,0x49,0x31, // -60x01,0x71,0x09,0x05,0x03, // -70x36,0x49,0x49,0x49,0x36, // -80x46,0x49,0x49,0x29,0x1E, // -90x00,0x36,0x36,0x00,0x00, // -:-

LCD5110_Basic库使用教程

LCD5110_Basic库使用教程
LCD5110_Basic 库的使用语句教程 注解: 语句: LCD5110(SCK,MOSI,DC,RST,CS);//设置引脚 LCD5110 myGLCD(8,9,10,11,12); InitLCD([contrast]);//初始化 myGLCD.initLCD(); setContrast(contrast);//设置对比度(0-127) myGLCD.setContrast(70); enableSleep();//设置睡眠状态 myGLCD.enableSleep(); disableSleep();//关闭睡眠状态 myGLCD.disableSleep(); clrScr();//清屏 myGLCD.clrScr(); clrRow(row[,start_x[,end_x]]);//清除行的一部分或者整行 myGLCD.clrRow(5,42); invert(mode);//正常显示 myGLCD.invert(false); invert(mode);//倒置 myGLCD.invert(true); print(st,x,y);//显示字符串 myGLCD.print("Hello Wrold",h[,filler]]);//显示整数 myGLCD.printNumI(num, CENTER, 0); printNumF(num,dec,x,y[,divider[,length[,filler]]]);//显示小数 myGLCD.printNumF(num, 3,CENTER, 0); setFont(fontname);//设置字体大小;字符串 myGLCD.setFont(SmallFont); setFont(fontname);//设置数字小 myGLCD.setFont(MediumNumbers); setFont(fontname);//设置数字大 myGLCD.setFont(BigNumbers); drawBitmap(x,y,data,sx,sy);//用于显示自定义字符 myGLCD.drawBitmap(0,0,bitmap,32,32); 打开5110的反相绘制功能 myGLCD.invertText(true); 关闭5110的反相绘制功能 myGLCD.invertText(false);

C51_温湿度传感器DHT11驱动_LCD1602显示程序

C51_温湿度传感器DHT11驱动_LCD1602显示程序

DHT11.c 文件#include<reg52.h>#include<Time_Delay.h>//the main only needs to call getDHT11(),then the temperature and huminity was geted in//F16T,F16RH as floatsbit bit11=P2^0;unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//用于最终读取的温湿度数据// read 8 bits onicechar COM(void){char i,U8temp,U8comdata;for(i=0;i<8;i++) {while(!bit11); //表示读取的高电位延时大于20多us则读取的是1否则读取的是//通过U8FLAG可判断Delay_us(35);U8temp=0;if(bit11)U8temp=1;while(bit11);U8comdata<<=1;U8comdata|=U8temp; //0 }//rofreturn U8comdata;}//--------------------------------//-----温湿度读取子程序------------ //-------------------------------- //----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验8位== U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM();//--------------------------------void getDHT11(void) {//主机拉低18msGO1:bit11=0;Delay_ms(20);bit11=1;//总线由上拉电阻拉高主机延时20usDelay_us(60);//主机设为输入判断从机响应信号 //bit11=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!bit11) {while(!bit11);while(bit11); //数据接收状态//T !//wait DHT goto highU8RH_data_H=COM();U8RH_data_L=COM();U8T_data_H=COM();U8T_data_L=COM();U8checkdata=COM();bit11=1; //数据校验if((U8T_data_H+U8T_data_L+U8RH_data_H+U8RH_data_L)!=U8checkdata) //If check wrong,read againgoto GO1; }//fiF16T=U8T_data_H+(float)U8T_data_L/256; //change integer to floatF16RH=U8RH_data_H+(float)U8RH_data_L/256;}LCD1602 文件#include<reg52.h>#include <stdio.h>#include <INTRINS.H>#include <Lcd_1602.h>#include <Time_Delay.h>#define LCD_DATA P0#define uint unsigned int#define uchar unsigned char/*只由主函数调用的有 Init_Lcd()LCD_write_str(uchar X,uchar Y,uchar *s) //LCD1602 data transfer defineLCD_value(unsigned char x,unsigned char y,float f)*/sbit LCD_RS = P2^5;sbit RW = P2^6;sbit LCD_E = P2^7;//1602 control define/***************************************************************************//显示开//显示关#define LCD_CURSOR_ON 0x0A //显示光标//无光标 //有光标,光标闪动 //有光标,光标不闪动//进入模式设置指令//新数据后光标右移//新数据后光标左移 //画面可平移 //画面不可平移//设定显示屏或光标移动方向指令//光标左移1格,且AC值减1 //光标右移1格,且AC值加1//显示器上字符全部左移一格,但光标不动 //显示器上字符全部右移一格,但光标不动***************************************************************************/ //注有主函数调用的函数都已作说明其他函数一般不由主函数调用/*****************************************************************************名*功称:Init_Lcd()主函数调用能:Lcd初始化 *入口参数:无 *出口参数:无 *范例:在主函数中直接调用****************************************************************************///LCD初始化{LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x38,0); Delay_ms(1);LCD_write_char(0x0c,0); Delay_ms(1);LCD_write_char(0x06,0); Delay_ms(1);LCD_write_char(0x0c,0); Delay_ms(1); //}/************************名*功称:LCD_write_str(uchar X,uchar Y,uchar *s)主函数调用能:在指定地址写一个字符串eg:Y=0,1,2,3,4,5,6,7,8,9,10...15。

诺基亚5110LCD驱动程序

诺基亚5110LCD驱动程序

/******************************************************************** NOKIA5110(3310)液晶屏驱动程序** 晶振频率:11.0592M** 线路->单片机实验开发板A******************************************************************/#include/*-- -------定义Nokia5110 引角---- -----*/sbit sclk = P3^3;sbit sdin = P3^4;sbit dc = P3^5;sbit sce = P3^7;sbit res = P3^6;void initNokia5110(void); /* NOkia 5110 初始化*/void clearNokia5110(void); /* 清除屏幕整屏清空*/void Display_char(unsigned char x,unsigned char y,char *s); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y 位置*s 显示字符的首地址*/void Display_num(unsigned char x,unsigned char y,char s); /* 写数字x 设置显示字符的X位置; y 设置显示字符的Y 位置s 显示数字*/void write_byte(unsigned char data1); /* 发送1字节到NOkia 5110 */void setxy(unsigned char x,unsigned char y); /* 设置显示坐标x 行坐标(0-83) unsigned char y 列坐标(0-5) */void delay(unsigned int time);void main(void){initNokia5110(); /* NOkia 5110 初始化*/clearNokia5110(); /* 清除屏幕整屏清空*/Display_char(1,2,""); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址*/Display_char(10,4,"NOKIA5510"); /* 写字符x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址*///Display_num(0,0,9); // 写数字while(1);}/****************************5110 0-9字模**************************//*函数原型:无/*函数功能:0-9字模/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ unsigned char code asc2tab[][6] ={{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },// sp{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },// !{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },// "{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },// #{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },// ${ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },// %{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },// &{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },// '{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },// ({ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },// ){ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },// *{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },// +{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },// ,{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },// -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },// .{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },// /{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },// 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },// 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },// 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },// 3 { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },// 4 { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },// 5 { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },// 6 { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },// 7 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },// 8 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },// 9 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },// : { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },// ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },// < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },// = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },// > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },// ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },// @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },// A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },// B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },// C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },// D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },// E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },// F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },// G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },// H{ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },// I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },// J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },// K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },// L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },// M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },// N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },// O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },// P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },// Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },// R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },// S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },// T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },// U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },// V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },// W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },// X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },// Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },// Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },// [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },// 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },// ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },// ^{ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },// _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },// ' { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },// a { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },// b { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },// c { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },// d { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },// e { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },// f { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },// g { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },// h { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },// i { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },// j { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },// k { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },// l { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },// m { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },// n { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },// o { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },// p { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },// q { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },// r { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },// s { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },// t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },// u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },// v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },// w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },// x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },// y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },// z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }};/****************************Nokia5110初始化函数**************************//*函数原型:initNokia5110(void)/*函数功能:Nokia5110初始化/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/void initNokia5110(void){delay(10); //系统复位res = 0;delay(2);res = 1;dc = 0;write_byte(0x21); //;芯片是活动的(PD=0) 使用扩展指令集write_byte(0xd5);write_byte(0x20); //;芯片是活动的(PD=0) 使用水平寻址(V=0) 使用基本指令集(H=0) write_byte(0x0c); //;设置显示配置(D=1 E=0)}/****************************Nokia5110清屏函数*********************//*函数原型:void clearNokia5110(void)/*函数功能:Nokia5110清屏/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/void clearNokia5110(void){unsigned int i,j;for(i=0;i<6;i++){setxy(j,i);dc = 1;while (j<84){write_byte(0x00);j++;}j = 0;}}/*--------------------------------------;模块名称:Display_char(unsigned char x,unsigned char y,char *s);;功能:写字符;占用资源:;参数说明:x 设置显示字符的X位置; y 设置显示字符的Y位置*s 显示字符的首地址;创建日期:2001.01.19;版本:VER 2.0 ★STALI☆;-------------------------------------*/void Display_char(unsigned char x,unsigned char y,char *s){unsigned char line;setxy(x,y);while(*s){for(line=0;line<6;line++){dc = 1;write_byte(asc2tab[*s - 32][line]);}}sce = 1;}/****************************Nokia5110写数字函数*********************/ /*函数原型:void Display_num(unsigned char x,unsigned char y,char s)/*函数功能:Nokia5110写数字/*输入参数:x 设置显示字符的X位置; y 设置显示字符的Y位置s 显示数字/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void Display_num(unsigned char x,unsigned char y,char s){unsigned char line;setxy(x,y);dc = 1;for(line=0;line<6;line++){write_byte(asc2tab[s+16][line]);}sce = 1;}/*************************Nokia5110发送1字节函数*********************/ /*函数原型:void Display_num(unsigned char x,unsigned char y,char s)/*函数功能:发送1字节到NOkia 5110/*输入参数:x 设置显示字符的X位置; y 设置显示字符的Y位置s 显示数字/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void write_byte(unsigned char data1){unsigned char i;res = 1;sce = 0;for(i=0;i<8;i++){sdin = (bit) (data1&0x80);;sclk = 1;data1 <<=1;}}/*************************Nokia5110设置显示坐标函数*********************/ /*函数原型:void setxy(unsigned char x,unsigned char y)/*函数功能:设置显示坐标/*输入参数:unsigned char x 行坐标(0-83) unsigned char y 列坐标(0-5)/*输出参数:无/*调用模块:/*建立时间:2006/10/1/*作者:站长/**********************************************************************/ void setxy(unsigned char x,unsigned char y){dc = 0;write_byte(y|0x40); //设置y轴。

C51模块化的各家说法

C51模块化的各家说法

C51模块化的各家说法***************************嘿嘿,就是要这样搞,免得被别人用了,那才麻烦。

#ifndef __LCD_H__ //如果未定义__LCD_H__#define __LCD_H__ //则定义__LCD_H__..... //声明其它部分#endif从这个命名可以推知,该文件叫做lcd.h,如果有一个main.h,它里面使用了include<"lcd.h">,另外还有一个hardware.h,里面也用了include<"lcd.h">,而在main.c里面,又有include<"main.h">,include<"hardware.h">,那么就会有重复引用了,在第一个#ifndef __LCD_H__时,由于__LCD_H__未定义,所以就在第一个中定义__LCD_H__,并且声明或者定义一些东西,等遇到第二个#ifndef __LCD_H__时,这时__LCD_H__已经被定义,所以后面的那些东西不声明或者定义,因而就避免了编译时报重复定义的错误.相当于代码自动判断了前面是否已经引用了该头文件!如果前面已经引用一次,则if--end里面的就不会再被编译了,相当于自动删除了,这样多方便啊.又由于这个名字很怪,一般程序员几乎不会在其它地方用到,所以就不用担心被别人定义了去。

***********************所谓C51的头文件就是.H 文件,它分两种:一种是系统自带得头文件,比如reg51.h stdio.h 等,这类文件在调用是直接在程序的开头用#inlcude <**.h>就可以,系统自动识别;另一种就是自己写得,你需要另建一个文档,以.h为后缀,其中的内容主要是你自己定义得公共变量和函数,以方便不同模块调用,在要用到这些变量合函数的文件开头加上#include <*.h>就可以了!-------------bucker:KeilC51不是不支持extern,而是不支持对sbit变量的extern声明(sbit类型是C51特殊规定的,非ANSI C数据类型)。

诺基亚5110液晶显示汉字程序

诺基亚5110液晶显示汉字程序

诺基亚5110液晶显示汉字程序默认分类 2009-11-03 21:19 阅读31 评论0字号:大中小包含三个文件,主函数,液晶驱动函数和字符串头文件,用STC单片机在5110液晶上显示“好好学习吧”五个汉字。

提取字模用"Pctolcd2002完美版"软件,字模选项中的设置为列行式+逆向+每行显示16*8+C51格式,可随意更改文字内容。

液晶文件lcd.csbit RST_5110=P1^4; //low activesbit CE_5110=P1^3; //low activesbit DC_5110=P1^2; //0=command,1=datasbit SDI_5110=P1^1; //rise edge enablesbit SCK_5110=P1^0; //clock#define DATA 1#define CMD 0unsigned char code asc2[][6] ={{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp{ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !{ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "{ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #{ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // ${ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %{ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &{ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '{ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ({ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ){ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *{ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +{ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,{ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .{ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /{ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0{ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1{ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2{ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3{ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4{ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5{ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '{ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c{ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d{ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f{ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g{ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h{ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i{ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j{ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k{ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l{ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n{ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o{ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p{ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q{ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r{ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s{ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t{ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u{ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v{ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w{ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x{ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y{ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines};unsigned char code hanzi[][16]={{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00},{0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",0*/ {0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82,0x80,0x00},{0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},/*"好",1*/ {0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00}, {0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00},/*"学",2*/ {0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00},{0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00},/*"习",3*/{0xFE,0x02,0x02,0x02,0xFE,0x00,0xFE,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0xFE,0x00}, {0x07,0x01,0x01,0x01,0x03,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00},/*"吧",0*/};void Delay_us(uchar t)//延时{while(--t);}void Write_Byte_5110(uchar Data ,bit CMD_DATA){uchar i;CE_5110=0; //Enable LCDDC_5110=CMD_DATA;//写命令还是写数据for(i=0;i<8;i++){SCK_5110=0;if(Data & 0x80) //MSB first高位优先SDI_5110=1;//传输1elseSDI_5110=0;//传输0SCK_5110=1;//始终为1时锁存Data<<=1;}SCK_5110=0;//时钟清零CE_5110=1; //disable LCD关液晶使能}void Clear_5110(void){uint i;Write_Byte_5110(0x80,CMD);//写地址for(i=0;i<504;i++){Write_Byte_5110(0x00,DATA);//set the addr as 0x00}}void Set_R_C_5110(uchar R,uchar C) //R=0~5;C=0~83{if(R<=5 && C<=83){Write_Byte_5110(0x40|R,CMD);//写行地址Write_Byte_5110(0x80|C,CMD);//写列地址}}void Init_5110(void){Delay_us(1); //reset LCDRST_5110=0;//复位清零Delay_us(1);RST_5110=1;Write_Byte_5110(0x21,CMD); //扩展指令Write_Byte_5110(0xc8,CMD); //设置偏压Write_Byte_5110(0x20,CMD); //标准指令Clear_5110();Write_Byte_5110(0x0c,CMD); //标准显示模式}void Write_Char_5110(uchar Char){uchar i,j;i=Char-0x20;for(j=0;j<6;j++){Write_Byte_5110(asc2[i][j],DATA);}}void Write_String_5110(uchar *P){uchar i;for(i=0;i<strlen(P);i++){Write_Char_5110(P[i]);}}void Write_hanzis_5110(){uchar i,j;for(i=0;i<10;i=i+2){for(j=0;j<16;j++){Write_Byte_5110(hanzi[i][j],DATA);}}}void Write_hanzix_5110(){uchar i,j;for(i=1;i<10;i=i+2)for(j=0;j<16;j++){Write_Byte_5110(hanzi[i][j],DATA);}}}主函数main.c#include <reg51.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#include"lcd.c"uchar flag,flag1;unsigned char buff[14]="0123456789abcd";unsigned char buff1[14]="---------";void delay(unsigned int z){unsigned int x;unsigned char y;for(x=z;x>0;x--)for(y=20;y>0;y--);}void main(void){delay(500);Init_5110(); //初始化LCD// Write_Byte_5110(0x0c,CMD); //标准显示模式 Set_R_C_5110(1,4);Write_String_5110(buff1);Set_R_C_5110(0,0);Write_String_5110(buff);Set_R_C_5110(2,0);Write_String_5110(buff);// Write_Byte_5110(0x0d,CMD); //反显Set_R_C_5110(3,0);Write_hanzis_5110();Set_R_C_5110(4,0);Write_hanzix_5110();while(1);。

C51使用详解

C51使用详解

Keil C51使用详解V1.0©电子设计世界版权所有欢迎转贴请勿修改并注明出处保留一切权利第一章 Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)第三节Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项 (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51Tscope51及Monitor51. 84. Ishell及uVision. 9第二章 Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类 (10)3. 列表文件(listing)控制类 (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图 (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章 Keil C51 vs 标准C.. 15第一节Keil C51扩展关键字 (15)第二节内存区域(Memory Areas) (16)1. Pragram Area (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明 (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明见上例 (19)4. 指定存储模式 (19)5. #pragma disable. 196. 递归或可重入函数指定 (19)7. 指定PL/M51函数 (20)第四章 Keil C51高级编程 (20)第一节绝对地址访问 (20)1. 绝对宏 (20)2. _at_关键字 (21)3. 连接定位控制 (21)第二节Keil C51与汇编的接口 (21)1. 模块内接口 (21)2. 模块间接口 (21)第三节Keil C51软件包中的通用文件 (22)1. 动态内存分配 (22)2. C51启动文件STARTUP.A51. 223. 标准输入输出文件 (25)4. 其它文件 (25)第四节段名协定与程序优化 (25)1. 段名协定(Segment Naming Conventions) 252. 程序优化 (25)第五章 Keil C51库函数参考 (26)第一节本征库函数(intrinsic routines)和非本征证库函数 (26)第二节几类重要库函数 (26)1. 专用寄存器include文件 (26)2. 绝对地址include文件absacc.h. 263. 动态内存分配函数位于stdlib.h中 (27)4. 缓冲区处理函数位于string.h”中 (27)5. 输入输出流函数位于stdio.h”中 (27)第三节Keil C51库函数原型列表 (27)1. CTYPE.H.. 272. INTRINS.H.. 273. STDIO.H.. 284. STDLIB.H.. 285. STRING.H.. 28第六章 Keil C51例子Hello.c.. 29第一节uVision for Windows的使用步骤 (29)第二节Ishell for Dos使用步骤 (30)第七章 Keil C51的代码效率 (30)第一节存储模式的影响 (30)第二节程序结构的影响 (31)第八章 dScope for Windows使用详解 (32)第一节概述 (32)1. 主窗口Mainframe Window (32)2. 调试窗口DEBUG Window (32)3. 命令窗口Command Window (32)4. 观察窗口Watch Window (32)5. 寄存器窗口Registe Window (32)6. 串口窗口Serical Windows (32)7. 性能分析窗口 (32)8. 内存窗口Memory Window (32)9. 符号浏览窗口Symbol Browser Window (33)10. 调用线窗口Call Stack Window (33)11. 代码覆盖窗口 (33)12. 外围设备窗口(peripherals) 33第二节dScope for Windows基本操作 (33)1. 指定初始化文件 (33)2. 观察变量 (33)3. 显示RAM的值 (34)4. 观察堆栈 (34)5. 中断处理程序调试 (34)6. 性能分析Performance Analyzer PA (34)第三节dScope for Windows命令文件的编制 (34)1. 地址空间及地址空间类型 (34)2. 常量 (35)3. 变量 (36)4. 运算符 (38)5. 表达式 (38)6. 数组 (38)7. 结构和联合 (38)8. 指针 (38)9. dScope命令语句 (38)10. 函数 (43)第一章 Keil C51开发系统基本知识第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统与汇编相比C语言在功能上结构性可读性可维护性上有明显的优势因而易学易用用过汇编语言后再使用C来开发体会更加深刻Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具全Windows 界面另外重要的一点只要看一下编译后生成的汇编代码就能体会到Keil C51生成的目标代码效率非常之高多数语句生成的汇编代码很紧凑容易理解在开发大型软件时更能体现高级语言的优势下面详细介绍Keil C51开发系统各部分功能和使用第二节Keil C51单片机软件开发系统的整体结构C51工具包的整体结构如图(1)所示其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE)可以完成编辑编译连接调试仿真等整个开发流程开发人员可用IDE本身或其它编辑器编辑C或汇编源文件然后分别由C51及A51编译器编译生成目标文件(.OBJ)目标文件可由LIB51创建生成库文件也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)ABS文件由OH51转换成标准的Hex文件以供调试器dScope51或tScope51使用进行源代码级调试也可由仿真器使用直接对目标板进行调试也可以直接写入程序存贮器如EPROM中图(1) C51工具包整体结构图第三节Keil C51工具包的安装1. C51 for Dos在Windows下直接运行软件包中DOS\C51DOS.exe然后选择安装目录即可完毕后欲使系统正常工作须进行以下操作(设C:\C51为安装目录)修改Autoexec.bat加入path=C:\C51\BinSet C51LIB=C:\C51\LIBSet C51INC=C:\C51\INC然后运行Autoexec.bat2. C51 for Windows的安装及注意事项在Windows下运行软件包中WIN\Setup.exe最好选择安装目录与C51 for Dos 相同这样设置最简单(设安装于C:\C51目录下)然后将软件包中crack目录中的文件拷入C:\C51\Bin目录下第四节Keil C51工具包各部分功能及使用简介1. C51与A51(1) C51C51是C语言编译器其使用方法为C51 sourcefile[编译控制指令]或者C51 @ commandfile其中sourcefile为C源文件(.C)大量的编译控制指令完成C51编译器的全部功能包控C51输出文件C.LST.OBJ.I和.SRC文件的控制源文件(.C)的控制等详见第五部分的具体介绍而Commandfile为一个连接控制文件其内容包括.C源文件及各编译控制指令它没有固定的名字开发人员可根据自己的习惯指定它适于用控制指令较多的场合(2) A51A51是汇编语言编译器使用方法为A51 sourcefile[编译控制指令]或A51 @ commandfile其中sourcefile为汇编源文件(.asm或.a51)而编译控制指令的使用与其它汇编如ASM 语言类似可参考其他汇编语言材料Commandfile同C51中的Commandfile类似它使A51使用和修改方便2. L51和BL51(1) L51L51是Keil C51软件包提供的连接/定位器其功能是将编译生成的OBJ文件与库文件连接定位生成绝对目标文件(.ABS)其使用方法为L51 目标文件列表[库文件列表] [to outputfile] [连接控制指令]或L51 @Commandfile源程序的多个模块分别经C51与A51编译后生成多个OBJ文件连接时这些文件全列于目标文件列表中作为输入文件如果还需与库文件(.LiB)相连接则库文件也必须列在其后outputfile为输文件名缺少时为第一模块名后缀为.ABS 连接控制指令提供了连接定位时的所有控制功能Commandfile为连接控制文件其具体内容是包括了目标文件列表库文件列表及输出文件连接控制命令以取代第一种繁琐的格式由于目标模块库文件大多不止1个因而第2种方法较多见这个文件名字也可由使用者随意指定(2) Bl51BL51也是C51软件包的连接/定位器其具有L51的所有功能此外它还具有以下3点特别之处a. 可以连接定位大于64kBytes的程序b. 具有代码域及域切换功能(CodeBanking & Bank Switching)c. 可用于RTX51操作系统RTX51是一个实时多任务操作系统它改变了传统的编程模式甚至不必用main( )函数单片机系统软件向RTOS发展是一种趋势这种趋势对于186和386及68K系列CPU更为明显和必须对8051因CPU较为简单程序结构等都不太复杂RTX51作用显得不太突出其专业版软件PK51软件包甚至不包括RTX51Full 而只有一个RTX51TINY版本的RTOS RTX51 TINY适用于无外部RAM的单片机系统因而可用面很窄在本文中不作介绍Bank switching技术因使用很少也不作介绍3. DScope51Tscope51及Monitor51(1) dScope51dScope51是一个源级调试器和模拟器它可以调试由C51编译器A51汇编器PL/M-51编译器及ASM51汇编器产生的程序它不需目标板for windows也可通过mon51接目标板只能进行软件模拟但其功能强大可模拟CPU及其外围器件如内部串口外部I/O及定时器等能对嵌入式软件功能进行有效测试其使用方法为DS51[debugfile][INIT(initfile)]其中debugfile是一个Hex格式的8051文件即待调试的文件其为可选的可在进入dScope51后用load命令装入Initfile为一个初使化文件它在启动dScope51后在debugfile装入前装入装有一些dScope的初使化参数及常用调试函数等下面是一个dScope.ini文件(for dos)的内容Load ..\..\ds51\8051.iofMap 0,0xffffdScope51 for Windows则直接用鼠标进入然后用load装入待调文件(2) tScope51与dScope51不同的是Scope51必须带目标板目前它可以通过两种方式访问目标板(1) 通过EMul51在线仿真器tScope51为该仿真器准备了一个动态连接文件EMUL51.IOT但该方法必须配合该仿真器(2) 通过Monitov51监控程序这种方法是可行的tScope51为访问Monitor51专门带有MON51.IOT连接程序使用时可通过串口及监控程序来调试目标板其使用方法为TS51[INIT(file_name.ini)]其中file_name.ini为一个初使化文件进入TS51后必须装入IOT文件可用的有MON51.IOT及EMUL51.IOT两种如装入MON51.IOTLoad.C:\C51\TS51\MON51.IOT CPUTYPE(80517)可惜的是tScope51只有for Dos的版本(3) Monitor 51Monitor51是一个监控程序通过PC机的串口与目标板进行通信Monitor操作需要MON51或dScope51 for Windows,后面部分将对Monitor51做较为详细的介绍4. Ishell及uVision(1) Ishell for Dos这是一个for Dos的IDE直接在命令行键入Ishell则进入该环境它使用简单方便其命令行与DOS命令行具有同样的功能对单模块的Project直接由菜单进行编译连接对多模块的project则通过批处理BAT文件进行编译连接然后通过菜单控制由dScope51或tScope51对程序进行调试因为是for dos的不做太详细介绍(2) uVision for WindowsuVision for Windows是一个标准的Windows应用程序它是C51的一个集成软件开发平台具有源代码编辑project管理集成的make等功能它的人机界面友好操作方便是开发者的首选具体配置及使用见第五部分第二章 Keil C51软件使用详解第一节Keil C51编译器的控制指令C51编译器的控制指令分为三类源文件控制类目标文件控制类及列表控制类1. 源文件控制类NOEXTEND C51源文件不允许使用ANSI C扩展功能DEFINE(DF)定义预处理(在C51命令行)2. 目标文件(Object)控制类COMPACT LARGE SMALL 选编译模式DEBUG(DB) 包含调试信息以供仿真器或dSCope51使用NOAMAKE(NOAM) 禁止AutoMake信息记录NOREGPARMS 禁止用寄存器传递参数OBJECTEXTEND(OE) Object文件包含附加变量类型信息OPTIMIZE(OT) 指定优化级别REGFILE(RF) 指定一个寄存器使用的文件以供整体优化用REGISTERBANK(RB) 指定一个供绝对寄存器访问的寄存器区名SRC 不生成目标文件只生成汇编源文件其它控件不常用3. 列表文件(listing)控制类CODE(CD)向列表文件加入汇编列表LISTINCLUDE(LC)显示indude文件SYMBOLS(SB)列表文件包括模块内所有符号的列表WARNINGLEVEL(WL)选择警告级别第二节dScope51的使用1. dScope51 for Dos总的来说dScope51具有以下特性高级语言显示模式集成硬件环境模拟单步或GO”执行模式存储器寄存器及变量访问Watch表达式之值函数与信号功能下面具体说明在进入dScope51 for Dos之后如何实现上述功能dScope51采用下拉菜单格式和窗口显示控制共有language serial exe register四个窗口其中exe为命令行窗口language为程序窗口serial为串口窗register为寄存器窗(1) 高级语言显示模式单击主菜单中的View”第一栏中的三条命令Highlevel”Mixed”Assembly”分别对所装入的程序按照高级混合级及汇编级三种方式显示以方便调试使用(2) 集成硬件环境模拟显示主菜单中Peripheral”各条能显示模拟硬件环境的状态其中i/o Port显示各I/O口之值对8031而言SFR中的P1P2P3P0与引脚之值分别列出Interrupt显示5个中断源的入口模式是否允许优先级等中断状态Timer显示各定时/计数器的模式初始值状态等int Message中断信息允许如为允许(“>>”出现)则当中断申请时显示中断源信息比如当中断发生时会显示“interrupt Timer 0 occured”等A/D converter显示A/D转换器状态无时则提示无Serial串口信息显示包括串口模式波特产等Other其它器件如为8031则显示无(3) 单步或Go”执行F8”单步执行F5”全速执行到断点或选主菜单中Trace单步执行CPU中的Go全速执行(4) 存储器寄存器及变量访问外部存储器管理MAP菜单设置(set)取消(reset)显示(Display)处理可用存储修改Code代码ASM命令存储器显示命令 D 类别为(X D I B C)修改存储器命令 E 有以下几种命令EB EC EI EL EF EP复杂数据类型显示Object命令用以显示结构或数组的内容欲使此命令有效C51编译器必须有DB及OBJECTEXTEND两条反汇编命令U(5) “Watch”表达式之值在View菜单的Watch”一栏中有四项其中包括定义Watch Point(Define)删除Watch Point(remove,kill all)及自动更新选项也可用WS WK等命令代替下面具体看表达式类型dScope51一次最多可设16个WtchPoint表达式显示于Watch Window之中表达式可以是简单变量也可是复杂数据类型如结构数组和指向结构的指针等例如>WS *ptime>WS ptime hour>WS some_record[o]analog等等(6) 关于.IOF文件启动DS51后必须装入.IOF文件才能使CPU及Peripheral各项起作用这个函数的使用是依据8051系列CPU的不同特点装入8051各CPU硬件设备模拟驱动文件比如8031CPU就必须load DS51目录下的8051.IOF2. dScope for WindowsdScope for windows具有dScope for dos的全部功能此外它还具有以下明显的优点(1) 标准的Windows界面操作更容易更简单(2) 常用操作多用对话框而非Dos的行命令方式(3) 窗口资源更加丰富存储器窗口覆盖率分析运行状态分析窗口加强了调因为dScope for Windows功能强大具体操作在第八章详细介绍第三节Monitor51及其使用1. Monitor51对硬件的要求(1) 硬件系统为51系列CPU(2) 带5K外部程序存储器(从O地址开始)存放Monitor51程序(3) 256Bytes的外部数据存储器以及5K的跟踪缓冲区此外外部数据存储器必须足够容纳所有应用程序代码及数据且所有外部数据存储器必须为冯诺伊曼存储器即能一致访问XDATA与Code空间(4) 一个定时器作为波特率发生器供串口使用(5) 6 Bytes的空余堆栈2. Mon51的使用Mon51的使用途径有三种方式(1) Dos行命令方式即先用install对MON51进行配置然后用MON51进入Monitor状态启用各种命令对Monitor51进行调试(2) tScope51方式启动tScope51装入TS51目录下的MON51.IOT驱动文件与目标板通信(3) dScope51 for Windows方式在选CPU驱动文件时选MON51.dll”则检查目标板并进入MON51状态3. MON51的配置(1) MON51 for Dos的配置运行install文件(在MON51目录下)不同的参数可以配置不同的硬件环境INSTALL Serialtype [xdstastart[codestart[bank][PROMCHECK]]]具体说明见MON51帮助文件或使用手册(2) MON51 for Windows的配置在启用MON51.dll时会使得系统自动检查目标板连接如配置不对则弹出Configuration”对话框设置PC串口波特率等完毕单击apply”有效4. 串口连接图收发交叉互连RTS CTS直连DSR DTR直连具体引脚排列参考串口资料5. MON51命令及使用详细的MON51命令可参阅帮助第四节集成开发环境(IDE)的使用1. Ishell for Dos的使用进入Ishell之后看到两个窗口一个是文件窗口一个是Dos命令行窗口窗口上方是下拉式的命令菜单其中的Files控制文件窗口的显隐使用Ishell第一步就是配置系统即要学习两个文件的修改与创建(1) Ishell.CFG文件每一个project都有一个Ishell.CFG其中存放有Option菜单和Setup菜单下的部分信息Bell enabled Monochrome enabled Editor Selected CRT Lines target enviroment name of user edit Automatic load for configuration enabled file window enabled file specification for file window translate command line controls project name 等对每个project都必须设置以上信息然后存盘setup”的的save”这样才可正式开始下面工作(2) IShell.col文件对IDE颜色设置如不改动可以缺省为主(3) CDF文件该文件位于BIN目录下每一文件定义一组外部函数工具包即定义外部环境如8051.CDF USER.CDF等开发者可修改CDF文件供自己使用至于CDF文件内容可查看一下8051.CDF即可知道注意.CDF文件是Ishell系统的核心所在不同的CDF文件可使本IDE适用于不同的编译连接系统即本IDE并不仅适于C51下面谈一谈Automake工具C51的Automake是一个project管理器在8051工具包中以OBJECT文件形式保留了一个project的信息AutoMake用这些信息来进行project管理一旦手工建立一个project Automake可生成一个新的OBJECT AutoMake利用此文件来编译那些修改过的文件Automake支持C51A51L51/BL51C166A166L166等编译连接器点中主菜单中的Automake即运行本工具Ishell for Dos使用比较繁琐推荐使用uVision for windows2. uVision for windows的使用uVision是一个标准的windows应用程序其编译功能文件处理功能project 处理功能窗口功能以及工具引用功能(如A51C51PL/M41BL51 dScope等)等都较Ishell for Dos要强得多uVision采用BL51作连接器因为BL51兼容L51所以一切能在Dos下工作的project都可以到uVision中进行连接调试uVision采用dScope for windows作调试器该调试器支持MON51及系统模拟两种方式功能较for DOS要强大好用调试功能强大注意(1) Option菜单下的各项要会使用其中A51C51PL/M51BL51定义各文件所使用的编译连接控制指令dScope定义一个dScope初始化文件Make则是定义一个make文件(2) 进入调试是在RUN菜单下运行dScope(3) project中包括新建打开修改更新编译连接等poject处理具体使用可参考后面的例子第三章 Keil C51 vs 标准C深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一因为大多数扩展功能都是直接针对8051系列CPU硬件的大致有以下8类8051存储类型及存储区域存储模式存储器类型声明变量类型声明位变量与位寻址特殊功能寄存器(SFR)C51指针函数属性具体说明如下(8031为缺省CPU)第一节Keil C51扩展关键字C51 V4.0版本有以下扩展关键字(共19个)_at_ idata sfr16 alien interrupt smallbdata large _task_ Code bit pdatausing reentrant xdata compact sbit data sfr第二节内存区域(Memory Areas)1. Pragram Area由Code说明可有多达64kBytes的程序存储器2. Internal Data Memory:内部数据存储器可用以下关键字说明data直接寻址区为内部RAM的低128字节00H7FHidata间接寻址区包括整个内部RAM区00H FFHbdata可位寻址区20H2FH3. External Data Memory外部RAM视使用情况可由以下关键字标识xdata可指定多达64KB的外部直接寻址区地址范围0000H0FFFFHpdata能访问1页(25bBytes)的外部RAM主要用于紧凑模式(Compact Model) 4. Speciac Function Register Memory8051提供128Bytes的SFR寻址区这区域可位寻址字节寻址或字寻址用以控制定时器计数器串口I/O及其它部件可由以下几种关键字说明sfr字节寻址比如sfr P0=0x80;为PO口地址为80H后H FFH之间的常数sfr16字寻址如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD sbit位寻址如sbit EA=0xAF;指定第0xAF位为EA即中断允许还可以有如下定义方法sbit 0V=PSW^2(定义0V为PSW的第2位)sbit 0V0XDO^2(同上)或bit 0V-0xD2(同上)第三节存储模式存储模式决定了没有明确指定存储类型的变量函数参数等的缺省存储区域共三种1. Small模式所有缺省变量参数均装入内部RAM优点是访问速度快缺点是空间有限只适用于小程序2. Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes)具体哪一页可由P2口指定在STARTUP.A51文件中说明也可用pdata指定优点是空间较Small为宽裕速度较Small慢较large要快是一种中间状态3. large模式所有缺省变量可放在多达64KB的外部RAM区优点是空间大可存变量多缺点是速度较慢提示存储模式在C51编译器选项中选择第四节存储类型声明变量或参数的存储类型可由存储模式指定缺省类型也可由关键字直接声明指定各类型分别用code,data,idata,xdata,pdata说明例data uar1char code array[ ]hello!”;unsigned char xdata arr[10][4][4]第五节变量或数据类型C51提供以下几种扩展数据类型bit 位变量值为0或1sbit 从字节中定义的位变量0或1sfr sfr字节地址0255sfr16 sfr字地址065535其余数据类型如char,enum,short,int,long,float等与ANSI C相同第六节位变量与声明1. bit型变量bit型变量可用变量类型函数声明函数返回值等存贮于内部RAM20H2FH 注意(1) 用pragma disable说明函数和用usign”指定的函数不能返回bit值(2) 一个bit变量不能声明为指针如bit *ptr是错误的(3) 不能有bit数组如bit arr[5]错误2. 可位寻址区说明20H2FH可作如下定义int bdata ichar bdata arr[3]然后sbit bito in0sbit bit15=I^15sbit arr07=arr[0]^7sbit arr15=arr[i]^7第七节Keil C51指针C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).1. 一般指针一般指针的声明和使用均与标准C相同不过同时还可以说明指针的存储类型例如long * state;为一个指向long型整数的指针而state本身则依存储模式存放char * xdata ptr ptr为一个指向char数据的指针而ptr本身放于外部RAM区以上的long,char等指针指向的数据可存放于任何存储器中一般指针本身用3个字节存放分别为存储器类型高位偏移低位偏移量2. 存储器指针基于存储器的指针说明时即指定了存贮类型例如char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数这种指针存放时只需一个字节或2个字节就够了因为只需存放偏移量3. 指针转换即指针在上两种类型之间转化当基于存储器的指针作为一个实参传递给需要一般指针的函数时指针自动转化如果不说明外部函数原形基于存储器的指针自动转化为一般指针导致错误因而请用include”说明所有函数原形可以强行改变指针类型第八节Keil C51函数C51函数声明对ANSI C作了扩展具体包括1. 中断函数声明中断声明方法如下void serial_ISR () interrupt 4 [using 1]{/* ISR */}为提高代码的容错能力在没用到的中断入口处生成iret语句定义没用到的中断/* define not used interrupt, so generate "IRET" in their entrance */void extern0_ISR() interrupt 0{} /* not used */void timer0_ISR () interrupt 1{} /* not used */void extern1_ISR() interrupt 2{} /* not used */void timer1_ISR () interrupt 3{} /* not used */void serial_ISR () interrupt 4{} /* not used */2. 通用存储工作区3. 选通用存储工作区由using x声明见上例4. 指定存储模式由small compact 及large说明例如void fun1(void) small { }提示small说明的函数内部变量全部使用内部RAM关键的经常性的耗时的地方可以这样声明以提高运行速度5. #pragma disable在函数前声明只对一个函数有效该函数调用过程中将不可被中断6. 递归或可重入函数指定在主程序和中断中都可调用的函数容易产生问题因为51和PC不同PC使用堆栈传递参数且静态变量以外的内部变量都在堆栈中而51一般使用寄存器传递参数内部变量一般在RAM中函数重入时会破坏上次调用的数据可以用以下两种方法解决函数重入a在相应的函数前使用前述#pragma disable”声明即只允许主程序或中断之一调用该函数b将该函数说明为可重入的如下void func(param...) reentrant;KeilC51编译后将生成一个可重入变量堆栈然后就可以模拟通过堆栈传递变量的方法由于一般可重入函数由主程序和中断调用所以通常中断使用与主程序不同的R 寄存器组另外对可重入函数在相应的函数前面加上开关#pragma noaregs”以禁止编译器使用绝对寄存器寻址可生成不依赖于寄存器组的代码7. 指定PL/M51函数由alien指定第四章 Keil C51高级编程本章讨论以下内容绝对地址访问C与汇编的接口C51软件包中的通用文件段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法1. 绝对宏在程序中用include<absacc.h>”即可使用其中定义的宏来访问绝对地址包括CBYTE XBYTE PWORD DBYTE CWORD XWORD PBYTE DWORD具体使用可看一看absacc.h便知例如rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可但是注意(1)绝对变量不能被初使化(2)bit型函数及变量不能用_at_指定例如idata struct link list _at_ 0x40;指定list结构从40h开始xdata char text[25b] _at_0xE000指定text数组从0E000H开始提示如果外部绝对变量是I/O端口等可自行变化数据需要使用volatile关键字进行描述请参考absacc.h3. 连接定位控制此法是利用连接控制指令code xdata pdata \data bdata对段地址进行如要指定某具体变量地址则很有局限性不作详细讨论第二节Keil C51与汇编的接口1. 模块内接口方法是用pragma语句具体结构是#pragma asm汇编行#pragma endasm这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中2. 模块间接口C模块与汇编模块的接口较简单分别用C51与A51对源文件进行编译然后用L51将obj文件连接即可关键问题在于C函数与汇编函数之间的参数传递问题C51中有两种参数传递方法(1) 通过寄存器传递函数参数最多只能有3个参数通过寄存器传递规律如下表参数数目Char Int long,float 一般指针1 R7 R6 & R7 R4R7 R1R32 R5 R4 & R5 R4R7 R1R33 R3 R2 & R3 R1R3(2) 通过固定存储区传递(fixed memory)这种方法将bit型参数传给一个存储段中function_name?BIT将其它类型参数均传给下面的段function_name?BYTE,且按照预选顺序存放至于这个固定存储区本身在何处则由存储模式默认(3) 函数的返回值函数返回值一律放于寄存器中有如下规律Return type Registev 说明Bit 标志位由具体标志位返回char/unsigned charR7 单字节由R7返回1_byte指针R6 & R7 双字节由R6和R7返回,MSB在R6 int/unsigned int2_byte指针long&unsigned long R4R7 MSB在R4, LSB在R7Float R4R7 32Bit IEEE格式一般指针R1R3 存储类型在R3 高位R2 低R1 (4) SRC控制该控制指令将C文件编译生成汇编文件(.SRC)该汇编文件可改名后生成汇编.ASM 文件再用A51进行编译第三节Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件这几个C源文件有非常重要的作用对它们稍事修改就可以用在自己的专用系统中1. 动态内存分配init_mem.C此文件是初始化动态内存区的程序源代码它可以指定动态内存的位置及大小只有使用了init_mem( )才可以调回其它函数诸如malloc calloc,realloc 等calloc.c此文件是给数组分配内存的源代码它可以指定单位数据类型及该单元数目malloc.c此文件是malloc的源代码分配一段固定大小的内存realloc.c此文件是realloc.c源代码其功能是调整当前分配动态内存的大小2. C51启动文件STARTUP.A51。

毕业设计基于Nokia5110的液晶屏模块设计

毕业设计基于Nokia5110的液晶屏模块设计

电气信息学院基于Nokia5110的液晶屏模块设计摘要:本设计是以单片机STC89C52RC为核心器件的基于Nokia5110液晶屏的电子指南针。

整个系统主要由单片机最小系统,电源输入模块,LCD液晶显示模块,磁阻传感器模块和串口电路部分构成。

通过用C语言编程使单片机处理磁阻传感器接收到的X轴和Y轴上的磁场分量,转换为距南方的角度后,通过Nokia5110动态显示。

Nokia5110是一块84×48 的LCD点阵型液晶显示屏,如果字模是12×16 大小的字符,则能显示3 行,每行显示7个汉字。

每个字符都分为上下两部分进行扫描,在每行扫描时以一列8位为单位进行扫描。

通过原理图设计、软件仿真、制作硬质板电路,硬件调试,证明了本设计的可行性。

关键词:Nokia5110,STC89C52RC,磁阻传感器HMC5883L,电子指南针Abstract: This design is a digital compass based on Nokia5110, with the MCU STC89C52RC as its core. The system mainly consists of a MCU minimum system, a power input module, a LCD module, a magnetic sensor module and a serial port module. Through C language programming, the MCU processes the data on the X and Y axes, which is collected by the magnetic sensor. Then it is transformed into an angle indicating its relative direction to the south pole in degrees. Finally, it is shown on the Nokia5110 dynamically. The Nokia5110 is an LCD with 84×48 dots, if a character is displayed with 12×16 dots, then it can display 3 lines, with each line comprising 7 characters. The characters are scanned in two halves, the upper half and the lower half. For each half, 8 bits( a byte)are scanned as a unit at a time. Through schematic design, software simulation, making the printed circuit board and hardware debugging, the feasibility of this design has been proved.Keywords:Nokia5110, STC89C52RC, magnetic sensor, digital compass目录1 前言 .............................................................................................. 错误!未定义书签。

stm32驱动诺基亚5110液晶

stm32驱动诺基亚5110液晶

第 1 页
文件: E:\stm32驱动诺基亚5110液晶.c
2012-2-1, 10:02:43
//Wait till PLL is used as system clock source while(RCC_GetSYSCLKSource() != 0x08); } */ RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); } void SysTick_Configuration(void) { /* Disable SysTick Counter */ SysTick_CounterCmd(SysTick_Counter_Disable); /* Disable the SysTick Interrupt */ SysTick_ITConfig(DISABLE); /* Select AHB clock(HCLK) as SysTick clock source 设置AHB时钟为SysTick时钟*/ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* Set SysTick Priority to 3 设置SysTicks中断抢占优先级 3, 从优先级0*/ //NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 第 2 页

完整的NOKIA-5110液晶51单片机驱动程序

完整的NOKIA-5110液晶51单片机驱动程序

Nokia 5110驱动*说明:本驱动适用于51单片机(5V或3.3V),液晶的VCC接5V 或3.3V修改偏置电压可改变5110点阵显示的亮度5110接5V时偏置电压改为(0xa7,0),接3.3V时改为(0xc0,0)*作者:JK*创建日期:2013/1/26*修改日期:#include <reg52.h>#include "font.h"#define uint unsigned int#define uchar unsigned charIO口定义区sbit LCD_RST = P0^0;sbit LCD_CE = P0^1;sbit LCD_DC = P0^2;sbit LCD_DIN = P0^3;sbit LCD_CLK = P0^4;函数声明区void LCD_Init(void);void LCD_WriteByte(unsigned char dat, unsigned char command);void LCD_Set_XY(unsigned char X, unsigned char Y);void LCD_Clear(void);void LCD_WriteChar(unsigned char x,unsigned char y,unsigned char c); void LCD_WriteString(unsigned char X,unsigned char Y,char *s);void LCD_WriteNum(unsigned char X,unsigned char Y,unsigned int num);void LCD_Write_12X16Font(unsigned char x,unsigned char y,unsigned char c[2]);void LCD_DrawPicture(unsigned char X,unsigned char Y,unsigned char const *map,unsigned char Pix_x,unsigned char Pix_y);*函数名:LCD_Init*功能:初始化LCD*参数:无*返回值:无*备注:void LCD_Init(void){unsigned char i;LCD_RST=0; //复位for(i=0;i<150;i++);LCD_RST=1;LCD_WriteByte(0x21, 0); // 使用扩展命令设置LCD模式LCD_WriteByte(0xc0, 0); // 设置偏置电压,修改可改变5110点阵显示的亮度/*5110接5V时偏置电压改为(0xa7,0),接3.3V时改为(0xc0,0)*/LCD_WriteByte(0x20, 0); // 使用基本命令。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,{0x00, 0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x00, 0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x00, 0x07, 0x00, 0x07, 0x00} // 22 &quot;
,{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x00, 0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x00, 0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
; LED +5v 背光
***********************************************************************/
#include &lt;reg52.h&gt;
#include &lt;intrins.h&gt; //包含_nop_();一机器周期延时空指令
,{0x00, 0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x00, 0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x00, 0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x00, 0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
*/
/***********************************************************************
pin description i/o
; VCC(3.3V) +3.3v 供电电源
; CLK : LCD_CLK P2.0 时钟
,{0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x00, 0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x00, 0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x00, 0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x00#43;
,{0x00, 0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
/*
Nokia5110 LCD test
芯片型号: AT89S52
by: ysit1990@
data: 2012.06.20
描述: 基于网上参考例子修改测试于杭州电子科技大学集训期间
uchar ZHS[][32], // 汉字字符串
uchar width, // 每个字符边长
uchar index, // 起始索引号
uchar num, // 显示个数
uchar space); // 间距
/////////////////////////画图
,{0x00, 0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x00, 0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x00, 0x08, 0x14, 0x22, 0x41, 0x00} // 3c &lt;
,{0x00, 0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x00, 0x41, 0x22, 0x14, 0x08} // 3e &gt;
,{0x00, 0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x00, 0x02, 0x04, 0x08, 0x10, 0x20} // 5c \ //
,{0x00, 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x00, 0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x00, 0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x00, 0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x00, 0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x00, 0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{
0x00, 0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x00, 0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
; DA : SDIN P2.1 数据输入
; D/C : LCD_DC P2.2 1写数据 0写命令
; SCE : LCD_SCE P2.3 片选信号
; RSET: LCD_REST P2.4 复位信号
; GND -- 接地
///////////5110初始化
void LCD_init(void);
///////////清屏
void LCD_clear(void);
//////////显示一个字符
void LCD_write_char(unsigned char c);
//////////显示字符串
void LCD_write_String(unsigned char X,unsigned char Y,unsigned char *s);
#define uchar unsigned char
#define uint unsigned int
sbit LCD_CLK = P2^0; //时钟
sbit SDIN = P2^1; //数据
sbit LCD_DC = P2^2; //1写数据,0写指令
,{0x00, 0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x00, 0x36, 0x49, 0x55, 0x22, 0x50} // 26 &amp;
,{0x00, 0x00, 0x05, 0x03, 0x00, 0x00} // 27 &#39;
,{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
sbit LCD_SCE = P2^3; //片选
sbit LCD_REST = P2^4; //复位,0复位
/*function
************************/
///////////SPI写操作
void LCD_write_byte(unsigned char dat, unsigned char command);
//////////显示一个汉字
void LCD_WRITE_ZH(unsigned char X, unsigned char Y,unsigned char ZH[][32],unsigned char index);
///////////显示汉字串
void LCD_WRITE_ZH_STRING(uchar X,uchar Y, // 起始坐标
相关文档
最新文档