无线串口调试手记(二)——MCS-51串口和LCD5510
2011-08-08 23:01
211 查看
学过51好久了,好多知识都忘记了,比如在配置串口时,如何计算波特率,串口的几种工作方式,顺便了解到定时器的几种工作方式。
最大的感受是:学什么东西,在一开始的时候不可能什么都懂的,等你隔上一段时间,当然这段时间里面你应该仍然提高,而不是停滞不前,回过头再看看你当时学的东西,会有种大彻大悟的感受,原来也就是那么回事,还记得当初学习51单片机的时候,什么寄存器配置都不懂,只是跟着视频把代码抄下来,根本就不求甚解,只是知道,这样做就行了,直到调试nRF24L01的时候,才明白寄存器配置具体是怎么回事。
后来接触飞思卡尔,430这类单片机时又巩固了下。
所以呢,不管学什么,第一遍不懂没关系,关键不能放弃,当你到达另一个高度,再回来看看,看书已不是煎熬,而是享受知识了。
先来进行串口的配置,为了保证数据的稳定数传,先配置为 9600bps ,
这里先来详细解释下波特率的概念:
波特率:每秒钟传输二进制代码的位数;
9600bps,意思就是每秒钟传送9600个比特(bit),因为算上1个起始位,1个停止位,8个数据位,所以完整完成一个字节(byte)的传输需要10位,也就是每秒钟960个字节,1s=1000ms,所以传输一个字节的时间为:
1000/9600=0.1042s=1.042ms
显然我们这里选第2种工作方式。
然后采用定时器,作为波特率的发生器,这里给出计算公式:
根据计算,可以算出当 TH1 = TL1 = 0xFD;
void Uart_Init(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
好,串口及定时器差不多就到这里,下面就是LCD5110,这个屏网上的驱动是在很多,然后我整理下资料,写出了一个还算差强人意的驱动程序出来。
Font.h
LCD5110.c
调试手记二就写到这里,明天开始第三篇。
最大的感受是:学什么东西,在一开始的时候不可能什么都懂的,等你隔上一段时间,当然这段时间里面你应该仍然提高,而不是停滞不前,回过头再看看你当时学的东西,会有种大彻大悟的感受,原来也就是那么回事,还记得当初学习51单片机的时候,什么寄存器配置都不懂,只是跟着视频把代码抄下来,根本就不求甚解,只是知道,这样做就行了,直到调试nRF24L01的时候,才明白寄存器配置具体是怎么回事。
后来接触飞思卡尔,430这类单片机时又巩固了下。
所以呢,不管学什么,第一遍不懂没关系,关键不能放弃,当你到达另一个高度,再回来看看,看书已不是煎熬,而是享受知识了。
先来进行串口的配置,为了保证数据的稳定数传,先配置为 9600bps ,
这里先来详细解释下波特率的概念:
波特率:每秒钟传输二进制代码的位数;
9600bps,意思就是每秒钟传送9600个比特(bit),因为算上1个起始位,1个停止位,8个数据位,所以完整完成一个字节(byte)的传输需要10位,也就是每秒钟960个字节,1s=1000ms,所以传输一个字节的时间为:
1000/9600=0.1042s=1.042ms
显然我们这里选第2种工作方式。
然后采用定时器,作为波特率的发生器,这里给出计算公式:
根据计算,可以算出当 TH1 = TL1 = 0xFD;
void Uart_Init(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
好,串口及定时器差不多就到这里,下面就是LCD5110,这个屏网上的驱动是在很多,然后我整理下资料,写出了一个还算差强人意的驱动程序出来。
Font.h
#ifndef _FONT_H_ #define _FONT_H_ const char code table[480] ={ 0x00,0x00,0x00,0x00,0x00, // 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes 0x00,0x00,0x5f,0x00,0x00, // 21 ! Note that this is the same set of codes for character you 0x00,0x07,0x00,0x07,0x00, // 22 " would find on a HD44780 based character LCD. 0x14,0x7f,0x14,0x7f,0x14, // 23 # Also, given the size of the LCD (84 pixels by 48 pixels), 0x24,0x2a,0x7f,0x2a,0x12, // 24 $ the maximum number of characters per row is only 14. 0x23,0x13,0x08,0x64,0x62, // 25 % 0x36,0x49,0x55,0x22,0x50, // 26 & 0x00,0x05,0x03,0x00,0x00, // 27 ' 0x00,0x1c,0x22,0x41,0x00, // 28 ( 0x00,0x41,0x22,0x1c,0x00, // 29 ) 0x14,0x08,0x3e,0x08,0x14, // 2a * 0x08,0x08,0x3e,0x08,0x08, // 2b + 0x00,0x50,0x30,0x00,0x00, // 2c , 0x08,0x08,0x08,0x08,0x08, // 2d - 0x00,0x60,0x60,0x00,0x00, // 2e . 0x20,0x10,0x08,0x04,0x02, // 2f / 0x3e,0x51,0x49,0x45,0x3e, // 30 0 0x00,0x42,0x7f,0x40,0x00, // 31 1 0x42,0x61,0x51,0x49,0x46, // 32 2 0x21,0x41,0x45,0x4b,0x31, // 33 3 0x18,0x14,0x12,0x7f,0x10, // 34 4 0x27,0x45,0x45,0x45,0x39, // 35 5 0x3c,0x4a,0x49,0x49,0x30, // 36 6 0x01,0x71,0x09,0x05,0x03, // 37 7 0x36,0x49,0x49,0x49,0x36, // 38 8 0x06,0x49,0x49,0x29,0x1e, // 39 9 0x00,0x36,0x36,0x00,0x00, // 3a : 0x00,0x56,0x36,0x00,0x00, // 3b ; 0x08,0x14,0x22,0x41,0x00, // 3c < 0x14,0x14,0x14,0x14,0x14, // 3d = 0x00,0x41,0x22,0x14,0x08, // 3e > 0x02,0x01,0x51,0x09,0x06, // 3f ? 0x32,0x49,0x79,0x41,0x3e, // 40 @ 0x7e,0x11,0x11,0x11,0x7e, // 41 A 0x7f,0x49,0x49,0x49,0x36, // 42 B 0x3e,0x41,0x41,0x41,0x22, // 43 C 0x7f,0x41,0x41,0x22,0x1c, // 44 D 0x7f,0x49,0x49,0x49,0x41, // 45 E 0x7f,0x09,0x09,0x09,0x01, // 46 F 0x3e,0x41,0x49,0x49,0x7a, // 47 G 0x7f,0x08,0x08,0x08,0x7f, // 48 H 0x00,0x41,0x7f,0x41,0x00, // 49 I 0x20,0x40,0x41,0x3f,0x01, // 4a J 0x7f,0x08,0x14,0x22,0x41, // 4b K 0x7f,0x40,0x40,0x40,0x40, // 4c L 0x7f,0x02,0x0c,0x02,0x7f, // 4d M 0x7f,0x04,0x08,0x10,0x7f, // 4e N 0x3e,0x41,0x41,0x41,0x3e, // 4f O 0x7f,0x09,0x09,0x09,0x06, // 50 P 0x3e,0x41,0x51,0x21,0x5e, // 51 Q 0x7f,0x09,0x19,0x29,0x46, // 52 R 0x46,0x49,0x49,0x49,0x31, // 53 S 0x01,0x01,0x7f,0x01,0x01, // 54 T 0x3f,0x40,0x40,0x40,0x3f, // 55 U 0x1f,0x20,0x40,0x20,0x1f, // 56 V 0x3f,0x40,0x38,0x40,0x3f, // 57 W 0x63,0x14,0x08,0x14,0x63, // 58 X 0x07,0x08,0x70,0x08,0x07, // 59 Y 0x61,0x51,0x49,0x45,0x43, // 5a Z 0x00,0x7f,0x41,0x41,0x00, // 5b [ 0x02,0x04,0x08,0x10,0x20, // 5c Yen Currency Sign 0x00,0x41,0x41,0x7f,0x00, // 5d ] 0x04,0x02,0x01,0x02,0x04, // 5e ^ 0x40,0x40,0x40,0x40,0x40, // 5f _ 0x00,0x01,0x02,0x04,0x00, // 60 ` 0x20,0x54,0x54,0x54,0x78, // 61 a 0x7f,0x48,0x44,0x44,0x38, // 62 b 0x38,0x44,0x44,0x44,0x20, // 63 c 0x38,0x44,0x44,0x48,0x7f, // 64 d 0x38,0x54,0x54,0x54,0x18, // 65 e 0x08,0x7e,0x09,0x01,0x02, // 66 f 0x0c,0x52,0x52,0x52,0x3e, // 67 g 0x7f,0x08,0x04,0x04,0x78, // 68 h 0x00,0x44,0x7d,0x40,0x00, // 69 i 0x20,0x40,0x44,0x3d,0x00, // 6a j 0x7f,0x10,0x28,0x44,0x00, // 6b k 0x00,0x41,0x7f,0x40,0x00, // 6c l 0x7c,0x04,0x18,0x04,0x78, // 6d m 0x7c,0x08,0x04,0x04,0x78, // 6e n 0x38,0x44,0x44,0x44,0x38, // 6f o 0x7c,0x14,0x14,0x14,0x08, // 70 p 0x08,0x14,0x14,0x18,0x7c, // 71 q 0x7c,0x08,0x04,0x04,0x08, // 72 r 0x48,0x54,0x54,0x54,0x20, // 73 s 0x04,0x3f,0x44,0x40,0x20, // 74 t 0x3c,0x40,0x40,0x20,0x7c, // 75 u 0x1c,0x20,0x40,0x20,0x1c, // 76 v 0x3c,0x40,0x30,0x40,0x3c, // 77 w 0x44,0x28,0x10,0x28,0x44, // 78 x 0x0c,0x50,0x50,0x50,0x3c, // 79 y 0x44,0x64,0x54,0x4c,0x44, // 7a z 0x00,0x08,0x36,0x41,0x00, // 7b < 0x00,0x00,0x7f,0x00,0x00, // 7c | 0x00,0x41,0x36,0x08,0x00, // 7d > 0x10,0x08,0x08,0x10,0x08, // 7e Right Arrow -> 0x78,0x46,0x41,0x46,0x78}; // 7f Left Arrow <- #endifLCD5110.h
#ifndef _LCD_5110_H_ #define _LCD_5110_H_ sbit SCE = P2^0; //Ƭѡ sbit RST = P2^1; //¸´Î»,0¸´Î» sbit DC = P2^2; //1дÊý¾Ý£¬0дָÁî sbit SDIN = P2^3; //Êý¾Ý sbit SCLK = P2^4; //ʱÖÓ extern void LCD_Init(void); extern void LCD_Clear(void); extern void LCD_Set_XY(unsigned char X, unsigned char Y); extern void LCD_SendChar(char); // Write one character. extern void LCD_SendStr(const char *s); #endif
LCD5110.c
#include "./Includes/MacroAndConst.h" #include "./Includes/Font.h" #include "./Includes/LCD5110.h" static void Delay_Ms( byte bl_Ms ) { word i = 0; bl_Ms *= 500; for (i = 0; i <bl_Ms; i++); } /*-------------------------------------------- LCD_write_byte: ʹÓÃSPI½Ó¿ÚдÊý¾Ýµ½LCD ÊäÈë²ÎÊý£ºdt£ºÐ´ÈëµÄÊý¾Ý£» command £ºÐ´Êý¾Ý/ÃüÁîÑ¡Ôñ£» ----------------------------------------------*/ static 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; else SDIN=0; dt=dt<<1; SCLK=0; SCLK=1; } DC=1; SCE=1; SDIN=1; } void LCD_Init(void) { RST=0; Delay_Ms(1); RST=1; LCD_Write_Byte(0x21,0); //³õʼ»¯Lcd,¹¦ÄÜÉ趨ʹÓÃÀ©³äÖ¸Áî LCD_Write_Byte(0xd0,0); //É趨Һ¾§Æ«Öõçѹ LCD_Write_Byte(0x20,0); //ʹÓûù±¾Ö¸Áî LCD_Write_Byte(0x0C,0); //É趨ÏÔʾģʽ£¬Õý³£ÏÔʾ LCD_Clear(); } /*------------------------------------------- LCD_set_XY: ÉèÖÃLCD×ø±êº¯Êý ÊäÈë²ÎÊý£ºX£º0£83 Y£º0£5 ---------------------------------------------*/ void LCD_Set_XY(unsigned char X, unsigned char Y) { LCD_Write_Byte(0x40 | (Y&0x07), 0);// column LCD_Write_Byte(0x80 | (X&0x7f), 0);// row } /*------------------------------------------ LCD_clear: LCDÇåÆÁº¯Êý --------------------------------------------*/ void LCD_Clear(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_SendChar(char x) * º¯Êý¹¦ÄÜ: ·¢Ë͵¥×Ö·û * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø: ÎÞ *******************************************************************************/ void LCD_SendChar(char x) { int a; char c,b; LCD_Write_Byte(0x20,0); if((x<0x20)||(x>0x7f)) return; a=((5*x)-160); for(b=5;b>0;b--) { c=table[a]; LCD_Write_Byte(c,1); a++; } LCD_Write_Byte(0x00,1); } /****************************************************************************** * º¯ Êý Ãû: SendStr(char x) * º¯Êý¹¦ÄÜ: ·¢Ëͳ¤×Ö·û * Èë¿Ú²ÎÊý: ÎÞ * ·µ »Ø: ÎÞ *******************************************************************************/ void LCD_SendStr(const char *s) { while(*s) { LCD_SendChar(*s++); } }
调试手记二就写到这里,明天开始第三篇。
相关文章推荐
- 无线串口调试手记(一) —— 从了解芯片nRF905入手
- 51单片机单串口同时实现AT指令和调试信息输出
- 无线串口NRF24L01的使用与调试
- Wifi小车之 - 无线路由串口调试篇
- Wifi小车之 – 无线路由串口调试篇
- MCS-51之串口通信
- (转)修改SMDK6410的调试串口为普…
- VC2010_串口调试记录
- [C8051F320]串口UART0全双工调试过…
- [IMX6Q][Android5.1]移植笔记 --- 调试串口只能输出不能输入
- adb shell 调试 Android 串口
- android eclipse无线调试
- android wifi调试(无线调试) 一步到位
- WinCE下调试串口的动态复用
- Android手机进行无线调试
- SylixOS串口调试详解
- PIC单片机精通_串口通讯与串口调试实例
- 使用 Xcode 进行 iOS 设备无线调试
- WinCE之路:3.串口的基本操作,算是一个最简单的调试软件吧
- 1分钟教你学会用adb进行无线调试