Recently

天气转凉了,人也懒惰了,成都的经常下雾,弄得人一天都是精神萎靡,还好老天爷也时不时的补足一些阳光,或许已经在午后,但已经足够。

保研就像是这样一缕阳光,任你自由自在的的享受。生活确实过得轻松了,老感觉这就是一场梦,但事实确实是这样。

最近又被评为校级的优秀毕业生,呵呵,一个荣誉而已。全班四个,男生两个女生二个,还好啦,还有我的名额。奖学金也评下来了,三等奖,500块钱,还不知道这个救济粮什么时候发下来也好让我买一个笔记本硬盘。这个用了三年的笔记本,已经有感情了,只是硬盘小了一些,重点是它慢了许多,换一个硬盘或许整体的性能会好很多。

对人有感情,对物也有感情。前些天我得的明基乖乖鼠的线断了,我给它换了一根,结果换的线质量也不好,经常接触不良,然后又换了一根。最后拿根线的颜色定义和之前的线的颜色定义不一样,粗心的我并没有测量DATA+和DATA-,结果把鼠标的芯片烧毁了。很心疼,一个陪伴了两年的鼠标就这样坏了。笔记本没有鼠标用起来真是麻烦,再加上对于乖乖鼠的喜爱,第二天就花了一百块钱买了一个新的回来。新的鼠标指标比原来那个高很多,分辨率较高,用起来还有点点不习惯:)

实验室的任务倒是分配了下来,一切都好,虽然我数学比较弱一些,但是借助强大的Mathematica软件解方程等等问题迎刃而解,往往我的几个方程式推导出来的公式都是一大篇,最终整理一下或者带入数值就简单多了。

实验室的网络资源倒是要好好的利用,天天都在下载资料,说不定哪天就能用上,算是一种知识储备吧。

至于玩上面,极品飞车10出来了,虽然说DEMO给人的感觉比较差,但是正式版给人了一种全新的感受,综合了7,8,9代的精华部分,地图也大得惊人,警察的AI明显增强了许多。之前花了两个晚上玩生涯模式,可是第三天竟然发现进度文件损坏了。可恶的晚上熄灯,就那一瞬间,我两天晚上的心血就报废了。只好重来,这次用作弊器了,配上最好的车,几个小时就打到了最终BOSS。最终BOSS可是真强悍,山路追击赛屡屡失败,看来车也许要做一个调整才行。

这学期也过半了,两个最为期待的游戏也等到了,接下来就是好好的复习一下以前学的知识,确实遗忘了很多。

十一月,一个平凡的月份,好好的干~!

12232 LCM Driver

自己写的12232LCM模块的驱动代码,实现了基本的功能。

//==============================================================
//12232.h
//==============================================================
#ifndef __12232Driver_H
#define __12232Driver_H
void LCD_Init(void);
void LCD_Reset(void);
void LCD_FillAll(void);
void LCD_ClearAll(void);
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteCmd1(unsigned char cmd);
void LCD_WriteCmd2(unsigned char cmd);
void LCD_SetColumn(unsigned char column);
void LCD_SetColumn1(unsigned char column);
void LCD_SetColumn2(unsigned char column);
void LCD_SetPage(unsigned char page);
void LCD_SetPage1(unsigned char page);
void LCD_SetPage2(unsigned char page);
void LCD_WriteData(unsigned char d);
void LCD_WriteData1(unsigned char d);
void LCD_WriteData2(unsigned char d);
unsigned char LCD_ReadData1(void);
unsigned char LCD_ReadData2(void);
#endif

//==============================================================
//12232Driver.c
//==============================================================
#include
#include "12232Driver.h"
//#include

sbit E1=P3^4;
sbit E2=P3^5;
sbit A0=P3^7;
sbit RST=P3^2;
sbit RW=P3^6;

#define LCD_DISPLAY_ON 0xAF
#define LCD_DISPLAY_OFF 0xAE
#define LCD_START_LINE_0 0xC0 //Set Start Line 0
#define LCD_DRIVER_NORMAL 0xA4 //Normal display operation
#define LCD_DRIVER_STATIC 0xA5 //Power Save
#define LCD_DUTY_32 0xA9
#define LCD_DUTY_16 0xA8
#define LCD_RIGHTWARD_OUTPUT 0xA0
#define LCD_LEFTWARD_OUTPUT 0xA1
#define LCD_RESET 0xE3
#define LCD_PAGE_0 0xB8
#define LCD_RMW 0xE0
#define LCD_END 0xEE
#define uchar unsigned char
//LCD Controller Display and Control Functions

void LCD_Init(void)
{
//E1=0;
//E2=0;
//Reset
RST=0;
RST=1;
LCD_WriteCmd(LCD_DISPLAY_ON); //Display On
LCD_WriteCmd(LCD_START_LINE_0); //Start = 0
LCD_WriteCmd(LCD_DRIVER_NORMAL); //Driver
LCD_WriteCmd(LCD_DUTY_32); //Duty 32
LCD_WriteCmd(LCD_RIGHTWARD_OUTPUT); //ADC
LCD_WriteCmd(LCD_RESET); //Reset
LCD_Reset();
}

void LCD_Reset(void)
{
LCD_WriteCmd(LCD_RESET);
}

void LCD_FillAll(void)
{
uchar page,y;
LCD_WriteCmd(LCD_RMW);
for(page=0;page<4;page++)
{
LCD_SetPage(page);
LCD_SetColumn(0);
for(y=0;y<61;y++)
{
LCD_WriteData(0xFF);
}
LCD_WriteCmd(LCD_END);
}
}

void LCD_ClearAll(void)
{
uchar page,y;
LCD_WriteCmd(LCD_RMW);
for(page=0;page<4;page++)
{
LCD_SetPage(page);
LCD_SetColumn(0);
for(y=0;y<61;y++)
{
LCD_WriteData(0);
}
LCD_WriteCmd(LCD_END);
}
}

void LCD_WriteCmd(unsigned char cmd)
{
LCD_WriteCmd1(cmd);
LCD_WriteCmd2(cmd);
return;
}

void LCD_WriteCmd1(unsigned char cmd)
{
RW=0;
E1=0;
A0=0;
P1=cmd;
E1=1;
E1=0;
return;
}

void LCD_WriteCmd2(unsigned char cmd)
{
RW=0;
E2=0;
A0=0;
P1=cmd;
E2=1;
E2=0;
return;
}

void LCD_WriteData(unsigned char d)
{
LCD_WriteData1(d);
LCD_WriteData2(d);
return ;
}

void LCD_WriteData1(unsigned char d)
{
RW=0;
E1=0;
A0=1;
P1=d;
E1=1;
E1=0;
return;
}

void LCD_WriteData2(unsigned char d)
{
RW=0;
E2=0;
A0=1;
P1=d;
E2=1;
E2=0;
return;
}

void LCD_SetColumn(unsigned char d)
{
LCD_SetColumn1(d);
LCD_SetColumn2(d);
return;
}
void LCD_SetColumn1(unsigned char d)
{
LCD_WriteCmd1(d);
return;
}

void LCD_SetColumn2(unsigned char d)
{
LCD_WriteCmd2(d);
return;
}

void LCD_SetPage(unsigned char page)
{
LCD_SetPage1(page);
LCD_SetPage2(page);
return;
}
void LCD_SetPage1(unsigned char page)
{
page=page%4;
LCD_WriteCmd1(LCD_PAGE_0+page); //0x5C
return;
}

void LCD_SetPage2(unsigned char page)
{
page=page%4;
LCD_WriteCmd2(LCD_PAGE_0+page); //0x5C
return;
}

unsigned char LCD_ReadData1(void)
{
unsigned char d=0;
RW=1;
E1=0;
A0=1;
P1=0xFF;
E1=1;
d=P1;
E1=0;
return d;
}

unsigned char LCD_ReadData2(void)
{
unsigned char d=0;
RW=1;

自己写的12232LCM模块的驱动代码,实现了基本的功能。

//==============================================================
//12232.h
//==============================================================
#ifndef __12232Driver_H
#define __12232Driver_H
void LCD_Init(void);
void LCD_Reset(void);
void LCD_FillAll(void);
void LCD_ClearAll(void);
void LCD_WriteCmd(unsigned char cmd);
void LCD_WriteCmd1(unsigned char cmd);
void LCD_WriteCmd2(unsigned char cmd);
void LCD_SetColumn(unsigned char column);
void LCD_SetColumn1(unsigned char column);
void LCD_SetColumn2(unsigned char column);
void LCD_SetPage(unsigned char page);
void LCD_SetPage1(unsigned char page);
void LCD_SetPage2(unsigned char page);
void LCD_WriteData(unsigned char d);
void LCD_WriteData1(unsigned char d);
void LCD_WriteData2(unsigned char d);
unsigned char LCD_ReadData1(void);
unsigned char LCD_ReadData2(void);
#endif

//==============================================================
//12232Driver.c
//==============================================================
#include
#include "12232Driver.h"
//#include

sbit E1=P3^4;
sbit E2=P3^5;
sbit A0=P3^7;
sbit RST=P3^2;
sbit RW=P3^6;

#define LCD_DISPLAY_ON 0xAF
#define LCD_DISPLAY_OFF 0xAE
#define LCD_START_LINE_0 0xC0 //Set Start Line 0
#define LCD_DRIVER_NORMAL 0xA4 //Normal display operation
#define LCD_DRIVER_STATIC 0xA5 //Power Save
#define LCD_DUTY_32 0xA9
#define LCD_DUTY_16 0xA8
#define LCD_RIGHTWARD_OUTPUT 0xA0
#define LCD_LEFTWARD_OUTPUT 0xA1
#define LCD_RESET 0xE3
#define LCD_PAGE_0 0xB8
#define LCD_RMW 0xE0
#define LCD_END 0xEE
#define uchar unsigned char
//LCD Controller Display and Control Functions

void LCD_Init(void)
{
//E1=0;
//E2=0;
//Reset
RST=0;
RST=1;
LCD_WriteCmd(LCD_DISPLAY_ON); //Display On
LCD_WriteCmd(LCD_START_LINE_0); //Start = 0
LCD_WriteCmd(LCD_DRIVER_NORMAL); //Driver
LCD_WriteCmd(LCD_DUTY_32); //Duty 32
LCD_WriteCmd(LCD_RIGHTWARD_OUTPUT); //ADC
LCD_WriteCmd(LCD_RESET); //Reset
LCD_Reset();
}

void LCD_Reset(void)
{
LCD_WriteCmd(LCD_RESET);
}

void LCD_FillAll(void)
{
uchar page,y;
LCD_WriteCmd(LCD_RMW);
for(page=0;page<4;page++)
{
LCD_SetPage(page);
LCD_SetColumn(0);
for(y=0;y<61;y++)
{
LCD_WriteData(0xFF);
}
LCD_WriteCmd(LCD_END);
}
}

void LCD_ClearAll(void)
{
uchar page,y;
LCD_WriteCmd(LCD_RMW);
for(page=0;page<4;page++)
{
LCD_SetPage(page);
LCD_SetColumn(0);
for(y=0;y<61;y++)
{
LCD_WriteData(0);
}
LCD_WriteCmd(LCD_END);
}
}

void LCD_WriteCmd(unsigned char cmd)
{
LCD_WriteCmd1(cmd);
LCD_WriteCmd2(cmd);
return;
}

void LCD_WriteCmd1(unsigned char cmd)
{
RW=0;
E1=0;
A0=0;
P1=cmd;
E1=1;
E1=0;
return;
}

void LCD_WriteCmd2(unsigned char cmd)
{
RW=0;
E2=0;
A0=0;
P1=cmd;
E2=1;
E2=0;
return;
}

void LCD_WriteData(unsigned char d)
{
LCD_WriteData1(d);
LCD_WriteData2(d);
return ;
}

void LCD_WriteData1(unsigned char d)
{
RW=0;
E1=0;
A0=1;
P1=d;
E1=1;
E1=0;
return;
}

void LCD_WriteData2(unsigned char d)
{
RW=0;
E2=0;
A0=1;
P1=d;
E2=1;
E2=0;
return;
}

void LCD_SetColumn(unsigned char d)
{
LCD_SetColumn1(d);
LCD_SetColumn2(d);
return;
}
void LCD_SetColumn1(unsigned char d)
{
LCD_WriteCmd1(d);
return;
}

void LCD_SetColumn2(unsigned char d)
{
LCD_WriteCmd2(d);
return;
}

void LCD_SetPage(unsigned char page)
{
LCD_SetPage1(page);
LCD_SetPage2(page);
return;
}
void LCD_SetPage1(unsigned char page)
{
page=page%4;
LCD_WriteCmd1(LCD_PAGE_0+page); //0x5C
return;
}

void LCD_SetPage2(unsigned char page)
{
page=page%4;
LCD_WriteCmd2(LCD_PAGE_0+page); //0x5C
return;
}

unsigned char LCD_ReadData1(void)
{
unsigned char d=0;
RW=1;
E1=0;
A0=1;
P1=0xFF;
E1=1;
d=P1;
E1=0;
return d;
}

unsigned char LCD_ReadData2(void)
{
unsigned char d=0;
RW=1;
E2=0;
A0=1;
P1=0xFF;
E2=1;
d=P1;
E2=0;
return d;
}

E2=0;
A0=1;
P1=0xFF;
E2=1;
d=P1;
E2=0;
return d;
}

学习单片机的总结

最近几天刚刚入门搞单片机,应该说还是积累了一些经验。

首先第一部就是焊电路板,现在还没有学PCB板的制作,而且也是处于试验阶段,还是面包板用起来比较好。面包板最大的问题就是连线,电路一旦复杂了就不好弄了。焊接的时候一定要细心,不要造成两个引脚短路的情况。虚焊也是需要注意的问题。当然,集成电路块的布置也需要注意,最好把插座的IC方向记号统一到一个方向,避免插IC的时候插反了。第一次用74LS244的时候就插反了,烧了,一股煳味,还把自己烫伤了……

第一步就是做一个ISP下载器,用的ATMEL的AT89S51,支持ISP下载。电路图不复杂(电路图稍后上传),能够很好的工作,但是速度有些慢。
第二步做一个仿真器,查阅大量的资料最终发现SST公司的89E564RD芯片比较适合,所以又到城隍庙去买了一个,27块钱。用MAX232作为一个RS232电平转换器。电路图依然不复杂,但是后面的DEBUG工作弄了我两天多的时间。

网络上很多资料都是介绍89C54/58这样芯片的仿真器制作,这些资料都比较古老,现在这些芯片都很难买到,实用价值不大。我买的这个芯片官方网站上面写的有BootLoader,用EasyIAP写入一个SoftICE就可以了。我连接好所有的硬件,第一步就是调试串口通讯。

用ATMEL的89S51芯片写入一个串口的实例程序,很简单,就是发送字符到电脑上面。所有硬件检查完毕,设置电脑上面的波特率到9600bps,8位数据,1停止位,可是用Serial Monitor发现没有任何数据收到。
然后就在单片机程序里面设置了延迟,好用自己制作的DEBUG灯(其实就是一个串接电阻的发光二极管),发现TXD有信号改变,说明还是正确的。然而电脑上依然不能收到数据。首先怀疑12M的晶振对应的串口的波特率不正确,而实际应用中确实有这样的问题,所以换了一个11.0592M的晶振,结果还是这样。用SST的EasyIAP软件也无法连接单片机。

事情就这样陷入了一个死胡同,又检查硬件,确认连线没有问题,事情陷入了僵局。
后来EasyIAP里面的一个Cable Test功能给了我启发,把MCU取下来,短接RXD和TXD,可以在电脑上收到数据。这样就说明连接是正确的,MAX232电平转换正常。难道是MCU的问题。
我又更换了单片机,依然是这样,排除单片机损坏的可能。后来想是不是接地线的问题造成电压不对信号无法识别,而转换出错?后来排除了这样的想法。

可能还是硬件问题,换电容,换……都换的差不多了,也没有找到问题,事情依然没有任何进展。
以外间,把串口的波特率调节到了57200bps,电脑上就接收到了数据,虽然是乱码,也不是我所想要到数据,但是已经有点点希望了。毕竟波特率不对数据是不会正确的。我慢慢的调低波特率,到和单片机相同的波特率的时候竟然收不到数据了。后查阅串口相关书籍,分析原因可能是电脑收到的全是1,所以没有起始位的跳转,电脑就认为没有数据,而在高波特率的时候,电脑可以收到时变的信号,所以能够识别出有数据,虽然有错误但是还是收到了。

事情有了进展。调节好单片机上的软件,利用TI寄存器控制输出,避免没有完全发送完上一个字符就发送下一个字符,在电脑上看出字符基本正常了。后来给电路板增加了RESET按钮,呵呵,以前没有的时候还
麻烦,每次都重新拔电源,也影响串口通讯的时序。

最后调试基本成功,遗憾的是发现有规律的出现发送的数据自动减32的情况,很是郁闷。就比如说发送的全是a,结果电脑上面就会有规律的收到A,但是发送u及以后的字符的时候就是对的。而我焊的第二个电路板就没有这个问题。难道是干扰?

重新布线,重新测试,然而MAX232那边应该没有问题的,干扰从何而来?而且是有一定的规律。很是奇怪。a对应的二进制是1100001B,A对应的是1000001B,可以看到是正数第二位出现了问题。后来发送b的时候也出现成为B的现象,怎么就是这样固定的一位出现问题而发送U就不出现问题呢?

困难重重,几乎把所有关于串口的电路都检查了,改换的都换了,然后都没有解决问题。最后目光集中在那个晶振上面,换一个试试,结果重新上电以后,一切正常,小小的晶振……竟然速度不准确……
仿真器的制作更是蹊跷。两个电路板串口调试好以后芯片依然不能被软件检测到,我都要到绝望的边缘了,都说再去买一个芯片了。结果才想起衣服没有洗,就去洗衣服了。然而人品就在这个时候爆发了,我想干脆直接用Keil C51的mon51连接一下看看,老板一直给我说里面有监护程序,我还写进取干什么呢?结果……………………成功了……!!

后来我去给老板说的时候,她竟然也不知道这个芯片里面写了SoftICE程序了,那天洗衣服突然的想法真的是人品阿,害得我搞了那么久,呵呵,还是学到了相当多的东西~!

接下来就是想把12232B这个LCM显示出来,时间不够了,先放一会儿了,先学项目需要的MFC了~:)

单片机的学习历程

本来打算大三的暑假就玩玩单片机的,可是那时候准备考研去了,就没有多余的时间来做这些工作。
现在保研了,时间多了,我的规划也应该实现了。所以到电子市场买了300多块钱的各样零件,准备开始单片机的探索历程。

虚度的日子

国庆放假回来还是放假,天天放假,没有事情做。该复试的已经复试了,该填的表已经填了,导师已经找到了,实验室已经安排了,还有什么事情可以做呢?

就是玩。天天玩,早上睡到10点过,然后下午还要睡中午觉,一天睡觉的时间超过12小时,打开电脑就玩游戏,哎,已经不晓得应该怎么办了。天气好也不想出去,电脑已经是一个磁铁,吸引住了,拉都拉不动。

告诫自己要做一些实事了吧,玩也玩得太过火了,不玩心里面还是感觉缺点什么,玩的本性在这个时刻显示得淋漓尽致。

寝室里面安安静静的,该找工作的已经出去找工作了,该考研的已经在复习了,而我们这些保研的,反而找不到事情做,时间就这样虚度了!

玩了以后感觉空虚,没有得到一些什么,可能自己无法放下一些东西,本质还是学习的命。和那些找工作的哥们儿们比起来,又是差距,自己在紧张的场合无法安静下来,脑袋里面一片空,不知道该说什么,那天复试的英语口试就是这样,不知道该怎么说,不知道该怎么做。

该做一些什么的时候了,玩也玩过了,不能在虚度了,好好的干活吧。