EDN首页   博客首页

最新日志

发表于:2008-11-27 13:55:16
标签:无标签

0

转载  :诺基亚 3310 液晶屏 LCD 驱动

#include "global.h"
#include "nokia3310.h"
#include "font.h"
#include "bmp.h"

void LCDClear(void)//LCD清屏
{
unsigned int i;
LCD_write_byte(0x0C,0);
LCD_write_byte(0x80,0);
for(i=0;i<504;i++)
{
LCD_write_byte(0,1);
}
}

void LCD_set_XY(uchar X,uchar Y)//设置LCD坐标函数
{
LCD_write_byte(0x40|Y,0);//列
LCD_write_byte(0x80|X,0);//行
}

void LCDInit(void)//LCD初始化
{
P0&=~LCD_RST;//产生一个让LCD复位的低电平脉冲
nop();
P0|=LCD_RST;
P0&=~LCD_CE;//关闭LCD
nop();
P0|= LCD_CE;//使能LCD
nop();
LCD_write_byte(0x21,0);//使用扩展命令设置LCD模式
LCD_write_byte(0xc8,0);//设置偏置电压
LCD_write_byte(0x06,0);//温度校正
LCD_write_byte(0x13,0);//1:48
LCD_write_byte(0x20,0);//使用基本命令
LCDClear();// 清屏
LCD_write_byte(0x0c,0);//设定显示模式,正常显示
P0&=~LCD_CE;//关闭LCD
}


void DisplayBmp(void)
{
uchar X,Y;
for(X=0;X<84;X++)
{
for(Y=0;Y<6;Y++)
{
LCD_set_XY(X,Y);
LCD_write_byte(Bmp[BmpPointer][X*6+Y],1);
}
}
DisCount++;
if(DisCount>20)
{
DisCount=0;
BmpPointer++;
if(BmpPointer>1)
{
BmpPointer=0;
}
}
}
/*-----------------------------------------------------------------------
LCD_write_chinese_string: 在LCD上显示汉字

输入参数:X、Y :显示汉字的起始X、Y坐标;
ch_with :汉字点阵的宽度
num :显示汉字的个数;
line :汉字点阵数组中的起始行数
row :汉字显示的行间距
编写日期 :2008-6-11
最后修改日期 :2008-6-12
-----------------------------------------------------------------------*/

void Nokia3310(void)
{
uchar X;
uchar Num;
uint FontAddr;
if(GetPowerFlag==0)
{
DisplayBmp();
return;
}
for(Num=0;Num<4;Num++)
{
for(X=0;X<BIGX;X++)
{
FontAddr=(X*2)+(Num*BIGX*2);
LCD_set_XY(X+Num*BIGX,0);
LCD_write_byte(Font_CN_BIG[FontAddr],1);
LCD_set_XY(X+Num*BIGX,1);
LCD_write_byte(Font_CN_BIG[FontAddr+1],1);
}
}
LCD_set_XY(80,0);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_set_XY(80,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_set_XY(80,2);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);
LCD_write_byte(0x00,1);

for(Num=0;Num<4;Num++)
{
for(X=0;X<16;X++)
{
FontAddr=(X*2)+(Num*16*2);
LCD_set_XY(X+20+Num*16,2);
LCD_write_byte(Font_CN[FontAddr],1);
LCD_set_XY(X+20+Num*16,3);
LCD_write_byte(Font_CN[FontAddr+1],1);
}
}
for(Num=0;Num<6;Num++)
{
for(X=0;X<14;X++)
{
FontAddr=(X*2)+(Num*14*2);
LCD_set_XY(X+Num*14,4);
if((WorkMode==ShaoShuiM)&&((Num==0)||(Num==1)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr],1);
}
else if((WorkMode==PaoChaM)&&((Num==2)||(Num==3)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr],1);
}
else if((WorkMode==HuoGuoM)&&((Num==4)||(Num==5)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr],1);
}
else
{
LCD_write_byte(Font_CN_MENU[FontAddr],1);
}
LCD_set_XY(X+Num*14,5);
if((WorkMode==ShaoShuiM)&&((Num==0)||(Num==1)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr+1],1);
}
else if((WorkMode==PaoChaM)&&((Num==2)||(Num==3)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr+1],1);
}
else if((WorkMode==HuoGuoM)&&((Num==4)||(Num==5)))
{
LCD_write_byte(~Font_CN_MENU[FontAddr+1],1);
}
else
{
LCD_write_byte(Font_CN_MENU[FontAddr+1],1);
}
}
}
}

void LCD_write_byte(uchar Byte,uchar Cmd)//Cmd=0传送命令否则传送数据
{
unsigned char i;
P0&=~LCD_CE;//使能LCD
if(Cmd==0)
P0&=~LCD_DC;//传送命令
else P0|=LCD_DC;//传送数据
for(i=0;i<8;i++)
{
P0&=~SPI_CLK;
if((Byte&0x80)==0)P0&=~SPI_MOSI;
else P0|=SPI_MOSI;
P0|=SPI_CLK;
Byte<<=1;
}
P0|=LCD_CE;//关闭LCD
}

这一篇文章发表在http://blog.ednchina.com/abcd200844/182917/message.aspx#

我看到想学一学,故转载到我的博客里了

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

该用户于2008-11-27 13:55:20编辑过该文章

评论(0) | 阅读(354)
发表于:2008-11-27 13:32:24
标签:无标签

2

评论(2) | 阅读(293)
发表于:2008-9-20 13:09:29
标签:无标签

2

我那些上学的日子

       这几天心情不太好,突然就有了想家的感觉了。
       想一想一个人离家在外求学已有数十载之久,最近这几年更是很少在家,很少再蹲坐在柴草堆上听父亲谈他那的庄稼和国家,很少再在饭桌上听母亲说吃饱穿好的唠叨了。怀揣一张张车票游走于异地他乡,为学习而打拼,为工作而打拼,为生活而打拼……一张小小的电话卡驱不走异地的苦闷,扯不断对家的企盼。
       十六岁那段叛逆的岁月,最不爱听父母的话,吃了不少亏,碰了不少壁,是父母的宽容又让我重新回到了宁静的生活。过了那么多年,突然才发现母亲的唠叨是最温馨的话语,父亲的庄稼和国家才是世界上最有意思的事……
        那些美好的往事都在渐渐的远去,一切都缘于上学,一切都缘于成长,一切都缘于生活……
       六岁那年,父母说是上学的年龄了,于是我背上母亲给我缝 的小挎包,怀揣着东拼西凑来的八元钱,和姐姐一起走进了校长办公室,毕竟那时太小,胆儿也小,而且还是第一次见这样的“大人物”当校长问及我的名字的时,我一不小心说漏了一个字,结果三个字的名字变成了如今的两个名字。进入了学校说实在的是苦并快乐着的。俺们的小学只能用破来形容,教室是瓦房比我家的还破,(好呆我家的窗户有玻璃)教室的地面是黄土地,没有电灯,只有几个没有装玻璃的窗户(只能勉强叫窗户),下雨的时候,外面下大雨,俺们的教室就成了水帘洞,坐在窗边的同学还能免费冲淋浴。冬天的时候,我们拿塑料溥膜用泥巴把窗户封好,这叫保暖,可是光线实在是暗的不能再说了。 更有意思的是,当外面飘雪花的时候,我的课桌上就开起了小白花……虽然如此,小学的日子依然如一条欢快的小溪,快乐的流淌着美好的时光,不时还会有几尾调皮的小鱼跳出水面炫一把^_^
        上初中时,学校依然破,应该说是县最破的中学了。没有餐厅,没有澡堂,甚至男生连宿舍都没有,我们的教室是我们男生的宿舍,是我们大家的餐厅,也是我们学习打拼的地方。课桌是床,是五谷杂粮,更是知识的海洋。哈,白天学习吃饭,晚上每个男生一张草苫,一张草席,一条棉被,课桌上,地板上一字排开,大家你挨着我我挤着你,有说有笑香香甜甜的进入了梦乡,那时我们没有贫贱,没有宝贵,像东北地区炕上 睡的兄弟一样,不过俺们那不是炕,俺们那是冰冷的地板,冬天我们个个都变成了“团长”……
        上高中了,依然是住校,依然是县里最破的高中,不过有宿舍了,但依然没有餐厅,宿舍像我们家的那几间破瓦房,不过这样也好有空的味道^_^吃饭的时候最能找到家的味道:到了吃饭的时候,大家冲到饭堂,买完饭,大家三五成群聚在气喘操场边的大杨树下一起吃,真像是村中的饭场--特别是夏秋季节,大家吃饭的时候都聚在大路旁的大柳树下一起吃饭,村中的小孩子大部分都是吃百家饭长大的,我也是。那时候同学们也没有贫富,没有贵贱,没有攀比,没有鄙视,大家说笑着吃着没有油的饭菜,谈着国家大事,憧憬着美好的大学生活……在那荒草丛生的校园里,大家挥洒着年少的激情,燃烧着心中的梦想!
       上大学了,有餐厅了,有宿舍了,更有宽敞明亮现代化的教室。还有丰富多彩的校园文化生活,繁花似锦,物欲横流,渐渐的迷漓了双眼,有了复读机,有了MP3,有了电脑,会打CS了,会玩魔兽了,人生的梦也碎了……不在把心事掏给别人,只悄悄把它埋在心底,只悄悄锁进日记,走过了繁忙紧张的大三,,一种牛人开始了新的一轮攻击--考研,另一种牛人也开始找工作赚钱了,剩下一个牛的一无是处的我只有在痛悔自己的求学之路,感叹人生的沧茫……
点击看大图

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(3) | 阅读(292)
发表于:2008-9-7 17:22:42
标签:无标签

2

基于单片机的数字时钟设计

rar

一 摘要

单片计算机即单片微型计算机。(Single-Chip Microcomputer ,是 集CPU ,RAM ,ROM ,

定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产

品和工业自动化上。而51 单片机是各单片机中最为典型和最有代表性的一种。这次毕业设

计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

二 说明

系统由AT89C51LED 数码管、按键、发光二极管等部分构成,能实现时间的调整、定

时时间的设定,输出等功能。系统的功能选择由SB0SB1SB2SB3SB4 完成。其中SB0

为时间校对,定时器调整功能键,按SB 0 进入调整状态。SB1 为功能切换键。第一轮按动

SB1 依次进入一路、二路、三路定时时间设置提示程序,按SB3 进入各路定时调整状态。定

时时间到,二极管发亮。到了关断时间后灭掉。如果不进入继续按SB1 键,依次进入时间

? ? 位校对、? ? 位校对、 ? ? 位校对、? ? 位校对、? ? 位校对、? ?

校对状态。不管是进入那种状态,按动SB2 皆可以使被调整位进行不进位增量加1 变化。各

预置量设置完成后,系统将所有的设置存入RAM 中,按SB1 退出调整状态。上电后,系统自

动进入计时状态,起始于? 00? ? 00? 分。SB4 为年月日显示转换键,可使原来显示时分

秒转换显示年月日。

三、电路原理分析

1. 显示原理

电原理图见附图1。由6 个共阴极的数码管组成时、分、秒的显示。P0 口的8 条数据线

P0.0 P0.7 分别与两个CD4511 译码的ABCD 口相接,P2 口的 P2.0 P2.2 分别通过电阻

R10 R13 VT1 VT3 的基极相连接。这样通过P0 口送出一个存储单元的高位、低位BCD

显示代码,通过P2 口送出扫描选通代码轮流点亮LED1 LED6,就会将要显示的数据在数

码管中显示出来。从P0 口输出的代码是BCD 码,从P2 口输出的就是位选码。这是扫描显示

原理。

2 键盘及读数原理

键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去

抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电

平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里

采用软件延时的方法来避开抖动,延时时间20ms.

3 连击功能的实现

按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应

的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则

执行下一条对应程序。利用连击功能,能实现快速调时操作。

四、程序设计思想和相关指令介绍

本系统的主程序主要完成时间显示和定时输出判断功能。而年月日显示和各时间单元进

位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。

1.数据与代码转换

由前述可知,从P2 口输出位选码,从P0 口输出段选码,LED 就会显示出数字来。但P0

口的输出的数据是要BCD 码,各存储单元存储的是二进制数,也就是和要显示出的字符表达

的含义是不一致的。可见,将要显示的存储单元的数据直接送到P0 口去驱动LED 数码管显

示是不能正确表达的,必须在系统内部将要显示的数据经过BCD 码行转换后,将各个单元数

据的段选代码送入P0 口,给CD4511 译码后去驱动数码管显示。

具体转换过程如下:

我们先将要显示的数据装入累加器A 中,再将A 中的数据转换成高低两位的BCD 码,

再放回A 中,然后将A 中的值输出。如:有一个单元存储了45 这样一位数,则需转换成四

位的BCD 码:(0100)(0101)然后放入A 中。 A BCD 码,高位四位代表?4?低四位代

?5?同时送给两个译码器中,译码后? 45? 字就在两个LED 中显示出来。

2.计时功能的实现与中断服务程序

时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器T0 打开后,

进入计时,满100 毫秒后,重装定时。中断一次,满一秒后秒进位,满60 秒后即为1 分钟,

分钟单元进位,60 分到了后,时单元进位,24 小时满后,天单元进位。这样然后根据进率,

得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED 中显示出来,

实现时钟计时功能。累加是用指令INC 来实现的。

进入中断服务程序以后,执行PUSH PSW PUSH A 将程序状态寄存器PSW 的内容和累

加器A 中的数据保存起来,这便是所谓的? 保护现场? . 以保护现场和恢复现场时存取关键

数据的存储区叫做堆栈。在软件的控制之下,堆栈可在片内RAM 中的任一区间设定,而堆栈

的数据存取与一般的RAM 存取又有区别,对它的操作,要遵循? 后进先出? 的原则。

3 时间控制功能与比较指令

系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:先

将执行设备开启的时间和关闭时间置入RAM 某一单元,在计时主程序当中执行几条比较指

令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条 CLR 指令,将对应的

那路P3 置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB

对应的P3 置低电位,二极管截止,。实现此控制功能用到的比较指令为CJNE A#direct

rel,其转移条件是累加器A 中的值与立即数不等则转移。

参考文献

1、 谢自美,《电子线路设计、实验、测试 》武汉:华中理工大学出版社,2000

2、 何书森、何华斌《实用数字电路原理与设计速成》福州:福建科学技术出版社,2000.6

3、 白驹衍, 《单片计算机及应用》北京:电子工业出版社, 1999.2


 

五:程序

SEC EQU 32H ;秒 即时时间 \伪指令

MIN EQU 31H ;

HOUR EQU 30H ;

DAY EQU 35H ;

MON EQU 34H ;

YEAR EQU 33H ;

MIN_1 EQU 41H ;分 定时器1 路、开存储单元

HOUR_1 EQU 42H ;

DAY_1 EQU 43H ;

MON_1 EQU 44H ;

YEAR_1 EQU 45H ;

MIN_11 EQU 40H ;分 定时器1 路、关存储单元

HOUR_11 EQU 46H ;

DAY_11 EQU 47H ;

MON_11 EQU 48H ;

YEAR_11 EQU 49H ;

;***********************

ORG 0000H

ljmp MAIN

ORG 0003H ;中断转换显示年月日、INT0SB4 键)

LJMP SHOW

ORG 000BH ;计数中断 T0